何があったのか
.NET CoreをLambdaへデプロイしようとdotnet lambda deploy-serverless
を叩いたところ、CloudFormationからエラーが返りデプロイできなくなりました。
$ dotnet lambda deploy-serverless --region ap-northeast-1 --stack-name HogeFunction --s3-bucket hoge-bucket
原因
管理者であり、管理ポリシー AWS から非推薦の Lambda へ移行します
2021 年 3 月 1 日を過ぎると、AWS マネージドポリシーである AWSLambdaReadOnlyAccess と AWSLambdaFullAccess は非推奨となり、新しい IAM ユーザーにアタッチできなくなります。ポリシーの非推奨の詳細については、 IAM ユーザーガイド の「 AWS 非推奨の管理ポリシー 」を参照してください。
デプロイ時にIAMポリシーAWSLambdaFullAccess
をLambdaにアタッチする設定がserverless.template
に記述されていたのですが、ポリシーが非推奨になった為にアタッチできずにエラーになっていた模様。
互換性を維持する為、非推奨になったポリシーでも既に何らかのUser, Group, Roleにアタッチされている場合、動作自体はするようです。 (ただし、1度ポリシーを外してしまうと二度と再アタッチは出来ないとのこと)
serverless.template
{ ... "Resources" : { "AspNetCoreFunction" : { "Type" : "AWS::Serverless::Function", "Properties": { "Handler": "HogeFunction::HogeFunction.LambdaEntryPoint::FunctionHandlerAsync", "Runtime": "dotnetcore2.1", "CodeUri": "", "MemorySize": 256, "Timeout": 30, "Role": null, "Policies": [ "AWSLambdaFullAccess" ], // 古いポリシーをアタッチしている "Environment" : { "Variables" : { "AppS3Bucket" : { "Fn::If" : ["CreateS3Bucket", {"Ref":"Bucket"}, { "Ref" : "BucketName" } ] } } }, "Events": { "PutResource": { "Type": "Api", "Properties": { "Path": "/{proxy+}", "Method": "ANY" } } } } }, "Bucket" : { "Type" : "AWS::S3::Bucket", "Condition" : "CreateS3Bucket", "Properties" : { "BucketName" : { "Fn::If" : ["BucketNameGenerated", {"Ref" : "AWS::NoValue" }, { "Ref" : "BucketName" } ] } } } }, ... }
対応
AWSLambdaFullAccess
の代わりに新しいポリシーAWSLambda_FullAccess
が用意されていますので、ポリシー名を差し替えるだけで無事動くようになりました。
ただし、以前のポリシーと比較すると許可するアクション内容が大幅に削減されているので、Lambda関数が動作するかどうか確認した方が良いと思います。 例えばS3へPUTをするような処理をさせるのであれば、別途手動でS3へのアクセスを許可するポリシーをアタッチする必要があります。
AWSLambda_FullAccess
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudformation:DescribeStacks", "cloudformation:ListStackResources", "cloudwatch:ListMetrics", "cloudwatch:GetMetricData", "ec2:DescribeSecurityGroups", "ec2:DescribeSubnets", "ec2:DescribeVpcs", "kms:ListAliases", "iam:GetPolicy", "iam:GetPolicyVersion", "iam:GetRole", "iam:GetRolePolicy", "iam:ListAttachedRolePolicies", "iam:ListRolePolicies", "iam:ListRoles", "lambda:*", "logs:DescribeLogGroups", "states:DescribeStateMachine", "states:ListStateMachines", "tag:GetResources", "xray:GetTraceSummaries", "xray:BatchGetTraces" ], "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "*", "Condition": { "StringEquals": { "iam:PassedToService": "lambda.amazonaws.com" } } }, { "Effect": "Allow", "Action": [ "logs:DescribeLogStreams", "logs:GetLogEvents", "logs:FilterLogEvents" ], "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/*" } ] }
問題のポリシーは2021/3/1に廃止ということでしたが、3月中頃までは実際のところ正常にデプロイできていました。 実は非公開の猶予期間があったのでしょうか??