Lambda のAWS マネージドポリシーが変わり面倒だったこと

#内容#

|新|旧|
|---|---|
|AWSLambda_FullAccess|AWSLambdaFullAccess|
|AWSLambda_ReadOnlyAccess|AWSLambdaReadOnlyAccess|

2021/3/1日以降、旧ポリシーをアタッチすることができなくなった。

何が面倒かというと、新ポリシーでアクセス許可が全て満たされていたら良いが、満たされていない場合、カスタマー管理ポリシーを作らなければいけないというところ。

例えば、既に開発環境では、旧ポリシーで動作しているが良いが、2021/3/1日以降にステージングや本番環境をデプロイしようとした時に、新ポリシーでないといけない。（もちろん、旧ポリシーのままだとそんな管理ポリシーはないよーと怒られてしまう。）

で、そんな仕様について書かれているそキュメントが↓のページ

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/access-control-identity-based.html

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/security_iam_troubleshoot.html#security_iam_troubleshoot-admin-deprecation

#比較#

```json:AWSLambdaFullAccess
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:DescribeChangeSet",
                "cloudformation:DescribeStackResources",
                "cloudformation:DescribeStacks",
                "cloudformation:GetTemplate",
                "cloudformation:ListStackResources",
                "cloudwatch:*",
                "cognito-identity:ListIdentityPools",
                "cognito-sync:GetCognitoEvents",
                "cognito-sync:SetCognitoEvents",
                "dynamodb:*",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcs",
                "events:*",
                "iam:GetPolicy",
                "iam:GetPolicyVersion",
                "iam:GetRole",
                "iam:GetRolePolicy",
                "iam:ListAttachedRolePolicies",
                "iam:ListRolePolicies",
                "iam:ListRoles",
                "iam:PassRole",
                "iot:AttachPrincipalPolicy",
                "iot:AttachThingPrincipal",
                "iot:CreateKeysAndCertificate",
                "iot:CreatePolicy",
                "iot:CreateThing",
                "iot:CreateTopicRule",
                "iot:DescribeEndpoint",
                "iot:GetTopicRule",
                "iot:ListPolicies",
                "iot:ListThings",
                "iot:ListTopicRules",
                "iot:ReplaceTopicRule",
                "kinesis:DescribeStream",
                "kinesis:ListStreams",
                "kinesis:PutRecord",
                "kms:ListAliases",
                "lambda:*",
                "logs:*",
                "s3:*",
                "sns:ListSubscriptions",
                "sns:ListSubscriptionsByTopic",
                "sns:ListTopics",
                "sns:Publish",
                "sns:Subscribe",
                "sns:Unsubscribe",
                "sqs:ListQueues",
                "sqs:SendMessage",
                "tag:GetResources",
                "xray:PutTelemetryRecords",
                "xray:PutTraceSegments"
            ],
            "Resource": "*"
        }
    ]
}
```

```json: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/*"
        }
    ]
}
```

#iam:PassRole#

今回ひっかっかたのが、この `iam:PassRole` だ。

`iam:PassRole` はユーザーがIAMロールをAWSサービスに渡すアクセス許可を定義する。
このアクションが許可されていないと、そもそも IAMロールをパスできない。

- 旧ポリシーの場合 : パスするIAMロールやパス先サービスを制限せずに、iam:PassRole を丸っと許可しています。

```json:
        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": "*"
        }
```

- 新ポリシーの場合 : Lambdaに対してのみIAMロールをAWSサービスに渡すアクセスを許可する。

```json:
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": "lambda.amazonaws.com"
                }
```

ドキュメントは、次のページがシンプルだ。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_iam-passrole-service.html

#リンク#
[AWS Lambda](https://qiita.com/leomaro7/items/5b56ae9710d236545497)
[AWS IAM](https://qiita.com/leomaro7/items/7b7018c120830bfe730e)