紙一重の積み重ね

35歳のエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。

【CloudFormation】Lambdaの Role を定義する際は !GetAtt を使って明示的に指定する

f:id:yokoyantech:20181207175720p:plain

はじめに

はじめてCloudFormationでLambdaをデプロイした際にハマったのでメモ。

実行環境

  • AWS CloudFormation
    • IAM Roles作成
    • S3に配置したzipからLambdaを作成する

作成したIAMロール

IAMRoleForLambda:
  Type: 'AWS::IAM::Role'
  Properties:
    AssumeRolePolicyDocument:
      Version: "2012-10-17"
      Statement:
        -
          Effect: "Allow"
          Principal:
            Service:
              - "lambda.amazonaws.com"
          Action:
            - "sts:AssumeRole"
    ManagedPolicyArns:
      - 'arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess'
      - 'arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess'
      - 'arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole'
    MaxSessionDuration: 3600
    Path: "/"
    RoleName: "hogeRole"

CloudFormationでエラーになったLambdaのRole定義

EC2では、!RefでIAMロールを参照できるため、Lambdaでも同様の書き方をしてしまったが、この書き方だと、Roleでエラーになる。

HogeLambda:
  Type: "AWS::Lambda::Function"
  Properties:
    Code:
      S3Bucket: fuga-dev
      S3Key: hoge.zip
    FunctionName: !Sub "${ENV}_func"
    Handler: lambda_handler
    MemorySize: 128
    Role:
      - !Ref IAMRoleForLambda
    Runtime: python3.6
    Timeout: 300

正しいLambdaのRole定義

  • 明示的に!GetAttで、Arnを指定する必要がある。
    • JSONならFn::GetAtt
HogeLambda:
  Type: "AWS::Lambda::Function"
  Properties:
    Code:
      S3Bucket: fuga-dev
      S3Key: hoge.zip
    FunctionName: !Sub "${ENV}_func"
    Handler: lambda_handler
    MemorySize: 128
    Role:
      !GetAtt IAMRoleForLambda.Arn
    Runtime: python3.6
    Timeout: 300

まとめ

公式ドキュメントにちゃんと書いてある。調査不足で反省。

docs.aws.amazon.com