IAMユーザーに与える権限(Lambdaコンソール編)

# はじめに
この記事は、Lambdaコンソールのみを操作する権限を持ったIAMユーザーを作成する方法の記事です。(Lambdaコンソール編と書いてあるが他があるわけではない)

# 前提
マネジメントコンソールで作業を行う環境にて、特定のリソースのみにアクセスできるようにIAMユーザーを作成しなければいけない要件がありました。

Lambdaアクセス用にはAWSLambda_FullAccess権限を付与しました。
しかし、Lambdaコンソールから関数を作成しようとすると以下のようなエラーを吐いて関数の作成に失敗してしまいました。

![Lambda_iam_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269896/a57bc394-f163-2e0a-7567-4653b9d8b110.png)

CreateRole権限がないためLambdaが作成するデフォルトロールが作成できずエラーを吐いているようです。

# 原因
原因としては単純でAWSLambda_FullAccess権限にCreateRole権限とCreatePolicy権限がないため弾かれています。

実際に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の部分に注目してみると,Get,List,Passの権限しか持っていないことが分かります。
事前に別のロールを用意しておいてアタッチする分には問題ないですが、デフォルトのロールを作成しようとすると問題が発生する権限になっています。

# 許可の範囲
今回の要件では、特定のリソース(今回だとLambda)のみへのアクセス権限を与える必要があります。単純にCreateRole,CreatePolicyを付与してしまうとIAMコンソールからロールを作成できるようになり要件から外れてしまいます。

そのため、今回は命名による切り分けを行い、Lambdaで作成されるロールにのみ権限を行使できるようにしました。

以下のポリシーを追加します。

```
{
            "Effect": "Allow",
            "Action": [
                "iam:CreatePolicy",
                "iam:ListPolicies",
                "iam:CreateRole",
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy",
                "iam:CreatePolicyVersion"
            ],
            "Resource": [
                "arn:aws:iam:::role/service-role/*-role-*",
                "arn:aws:iam:::policy/service-role/AWSLambdaBasicExecutionRole-*",
                "arn:aws:iam:::policy/service-role/AWSLambdaVPCAccessExecutionPolicy-*"
            ]
        }

```

Resourceセクションにてデフォルトで作られるロール、ポリシーの名前を指定しています。
ロールは関数名-role-関数ID、ポリシーはAWSLambdaBasicExecutionRole-関数IDとなるのでワイルドカードを利用して指定します。(関数名に命名規則がある場合はそれを指定するとさらに範囲が狭まって良い)

また、VPC内にLambdaを置きたい場合はAWSLambdaVPCAccessExecutionPolicyも指定してください。

# さいごに
今回は、Lambdaコンソールを利用するIAMユーザーの権限を作成しました。
個人で試す際は大きめの権限でやっていることもあり、AWSLambda_FullAccessだと足りない権限があることに気づきませんでした。
この記事が誰かの助けになれば幸いです。