【AWS SAM 入門⑥】IAM ロールの作成と Lambda Function への割り当て

 AWS Serverless Application Model 入門ハンズオンシリーズ - log4ketancho の第6弾です。この記事では、SAM で IAM ロールを構築する方法をまとめたいと思います。

 このシリーズの第1弾(下記の記事)において、

www.ketancho.net

Role は各環境の ARN に置き換えてください

と書きました。実はしれっと既存の IAM ロールがあることを前提にここまで進めてきました。ですが、SAM でサーバレスな環境を作るからには、IAM ロールの構築も SAM 化すべきです。

IAM ロールの作成

 IAM ロールを作成するには、

  • AssumeRolePolicyDocument: どのリソースに IAM ロールを割り当てるかを決定
  • Policies: IAM ロールに割り当てる IAM ポリシーを設定

を定義する必要があります。

AssumeRolePolicyDocument: どのリソースに IAM ロールを割り当てるかを決定

 作成した IAM ロールがアタッチされる AWS リソースが何か(例:EC2)を定義します。今回は Lambda に割り当てたいので、下記のような定義にします。

      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: "sts:AssumeRole"

Policies: IAM ロールに割り当てる IAM ポリシーを設定

 続いて、IAM ロールが割り当てられたリソースに、どのような操作をするかを定義します。ここでは、CloudWatch と SES を扱うことができるロールを作成してみます。

      Policies:
        -
          PolicyName: "billing_mail_for_lambda"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              -
                Effect: "Allow"
                Action: "cloudwatch:*"
                Resource: "*"
              -
                Effect: "Allow"
                Action: "ses:*"
                Resource: "*"

 最終的には、下記のようなResources定義になります。

Resources:
  BillingIamRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: "sts:AssumeRole"
      Policies:
        -
          PolicyName: "billing_mail_for_lambda"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              -
                Effect: "Allow"
                Action: "cloudwatch:*"
                Resource: "*"
              -
                Effect: "Allow"
                Action: "ses:*"
                Resource: "*"

作成した IAM ロールを Lambda に割り当てる

 続いて、IAM ロールの割り当てをします。上で作った IAM ロールの ARN が何になるかはこの時点では分からないので、CFn の関数を用いて !GetAtt BillingIamRole.Arn という形で取得する必要があります。(BillingIamRole は上で作成した IAM ロールのリソース名です。)

  BillingLambda:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: functions/billing_mail/billing_mail.zip
      Handler: billing_mail.lambda_handler
      Runtime: python3.6
      Role: !GetAtt BillingIamRole.Arn
      Timeout: 30

 AWS Serverless Application Model 入門ハンズオンシリーズ - log4ketancho の第3弾の記事でも紹介しましたが、CloudFormation が提供する関数を用いることで、環境に依存しない、再利用しやすいテンプレートを作ることができます。Cfn 関数のうち、代表的なものの利用方法を下記の本で解説させていただいたので、ご覧いただけると幸いです。

Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)

Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)

 以上で完成となります。実行すると期待通りの IAM ロールができたでしょうか?念のため、Resource 定義の最終型を貼っておきます。

# SAM Resources
Resources:
  SamSampleLambda:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: functions/billing_mail/billing_mail.zip
      Handler: billing_mail.lambda_handler
      Runtime: python3.6
      Role: !GetAtt BillingIamRole.Arn
      Timeout: 30
      Events:
        Timer:
          Type: Schedule
          Properties:
            Schedule: cron(0 0 * * ? *) # JST AM9:00
  BillingIamRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: "sts:AssumeRole"
      Policies:
        -
          PolicyName: "billing_mail_for_lambda"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              -
                Effect: "Allow"
                Action: "cloudwatch:*"
                Resource: "*"
              -
                Effect: "Allow"
                Action: "ses:*"
                Resource: "*"

まとめ

 SAM の使い方を紹介する記事ですが、今回の機能はすべて CloudFormation の機能として提供されているものです。IAM 関連のリソースもプログラマブルに作成することで、「適切な権限管理がなされているか」をコードレビュー形式で確認することができます。なるべく手作業による設定を減らすことで、素早く&確実に環境構築をしていければと思います。

 この記事は、AWS Serveless Application Model 入門シリーズの第6弾です。もしよろしければ他の記事も参考にしていただければと思います。

www.ketancho.net