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