エンジニアのはしがき

プログラミングの日々の知見を書き連ねているブログです

IAMポリシーAWSLambdaFullAccessは廃止された模様

f:id:tansantktk:20201120002649p:plain

何があったのか

.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 非推奨の管理ポリシー 」を参照してください。

docs.aws.amazon.com

デプロイ時に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月中頃までは実際のところ正常にデプロイできていました。 実は非公開の猶予期間があったのでしょうか??