はじめに
はじめて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
- JSONなら
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
まとめ
公式ドキュメントにちゃんと書いてある。調査不足で反省。