IAMロールに付与されているポリシー、ポリシーに付与されている権限をAWS CLIで確認したい

# What's？

「IAMロール（にアタッチしたポリシー）に付与されている権限って、なんでしたっけ？」というのを、AWS CLIで確認する方法がよくわからなくなるので。

軽くまとめておこうと。

* ロールを指定する時はロール名で
* ポリシーを指定する時はポリシーのARNとバージョンで

というのがポイントですね。

# 環境

今回の環境は、こちらです。

```shell
$ aws --version
aws-cli/2.1.27 Python/3.7.3 Linux/5.4.0-65-generic exe/x86_64.ubuntu.20 prompt/off
```

# お題

Amazon ECSの`AWSServiceRoleForECS`サービスロールをお題にして、このIAMロールにどのような権限が付与されているか確認してみましょう。

[Amazon ECS 用のサービスにリンクされたロール](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/using-service-linked-roles.html)

IAMロール自体は、`aws iam get-role`で、`--role-name`でIAMロール名を指定して取得します。

```shell
$ aws iam get-role --role-name AWSServiceRoleForECS
{
    "Role": {
        "Path": "/aws-service-role/ecs.amazonaws.com/",
        "RoleName": "AWSServiceRoleForECS",
        "RoleId": "AROATMCUPBCTB3GEPWE6A",
        "Arn": "arn:aws:iam::[AWSアカウントID]:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS",
        "CreateDate": "2020-07-08T21:38:15+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "ecs.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        },
        "Description": "Role to enable Amazon ECS to manage your cluster.",
        "MaxSessionDuration": 3600,
        "RoleLastUsed": {
            "LastUsedDate": "2021-02-19T06:17:42+00:00",
            "Region": "ap-northeast-1"
        }
    }
}
```

ですが、これではどのようなポリシーがアタッチされているかは確認できません。

IAMロールにアタッチされているポリシーを取得するには、`aws iam list-attached-role-policies`を使い、`--role-name`でIAMロール名を指定します。

```shell
$ aws iam list-attached-role-policies --role-name AWSServiceRoleForECS
{
    "AttachedPolicies": [
        {
            "PolicyName": "AmazonECSServiceRolePolicy",
            "PolicyArn": "arn:aws:iam::aws:policy/aws-service-role/AmazonECSServiceRolePolicy"
        }
    ]
}
```

これで、IAMロールにアタッチされているポリシーがわかります。

ポリシーの内容を取得するには、`aws iam get-policy`で`--policy-arn`にポリシーのARNを指定します。

```shell
$ aws iam get-policy --policy-arn arn:aws:iam::aws:policy/aws-service-role/AmazonECSServiceRolePolicy
{
    "Policy": {
        "PolicyName": "AmazonECSServiceRolePolicy",
        "PolicyId": "ANPAIVUWKCAI7URU4WUEI",
        "Arn": "arn:aws:iam::aws:policy/aws-service-role/AmazonECSServiceRolePolicy",
        "Path": "/aws-service-role/",
        "DefaultVersionId": "v8",
        "AttachmentCount": 1,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "Description": "Policy to enable Amazon ECS to manage your cluster.",
        "CreateDate": "2017-10-14T01:18:58+00:00",
        "UpdateDate": "2021-01-13T20:04:13+00:00",
        "Tags": []
    }
}
```

このコマンドでは、ポリシーに付与されている権限はわかりません。ですが、このコマンドで得られる`DefaultVersionId`は必要です。

最後。`aws iam get-policy-version`で、`--policy-arn`でポリシーのARN、`--version-id`にポリシーのバージョンIDを指定することで、ポリシーの内容を表示できます。

```shell
$ aws iam get-policy-version --policy-arn arn:aws:iam::aws:policy/aws-service-role/AmazonECSServiceRolePolicy --version-id v8
{
    "PolicyVersion": {
        "Document": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Sid": "ECSTaskManagement",
                    "Effect": "Allow",
                    "Action": [
                        "ec2:AttachNetworkInterface",
                        "ec2:CreateNetworkInterface",
                        "ec2:CreateNetworkInterfacePermission",
                        "ec2:DeleteNetworkInterface",
                        "ec2:DeleteNetworkInterfacePermission",
                        "ec2:Describe*",
                        "ec2:DetachNetworkInterface",
                        "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
                        "elasticloadbalancing:DeregisterTargets",
                        "elasticloadbalancing:Describe*",
                        "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
                        "elasticloadbalancing:RegisterTargets",
                        "route53:ChangeResourceRecordSets",
                        "route53:CreateHealthCheck",
                        "route53:DeleteHealthCheck",
                        "route53:Get*",
                        "route53:List*",
                        "route53:UpdateHealthCheck",
                        "servicediscovery:DeregisterInstance",
                        "servicediscovery:Get*",
                        "servicediscovery:List*",
                        "servicediscovery:RegisterInstance",
                        "servicediscovery:UpdateInstanceCustomHealthStatus"
                    ],
                    "Resource": "*"
                },
                {
                    "Sid": "AutoScaling",
                    "Effect": "Allow",
                    "Action": [
                        "autoscaling:Describe*"
                    ],
                    "Resource": "*"
                },
                {
                    "Sid": "AutoScalingManagement",
                    "Effect": "Allow",
                    "Action": [
                        "autoscaling:DeletePolicy",
                        "autoscaling:PutScalingPolicy",
                        "autoscaling:SetInstanceProtection",
                        "autoscaling:UpdateAutoScalingGroup"
                    ],
                    "Resource": "*",
                    "Condition": {
                        "Null": {
                            "autoscaling:ResourceTag/AmazonECSManaged": "false"
                        }
                    }
                },
                {
                    "Sid": "AutoScalingPlanManagement",
                    "Effect": "Allow",
                    "Action": [
                        "autoscaling-plans:CreateScalingPlan",
                        "autoscaling-plans:DeleteScalingPlan",
                        "autoscaling-plans:DescribeScalingPlans"
                    ],
                    "Resource": "*"
                },
                {
                    "Sid": "CWAlarmManagement",
                    "Effect": "Allow",
                    "Action": [
                        "cloudwatch:DeleteAlarms",
                        "cloudwatch:DescribeAlarms",
                        "cloudwatch:PutMetricAlarm"
                    ],
                    "Resource": "arn:aws:cloudwatch:*:*:alarm:*"
                },
                {
                    "Sid": "ECSTagging",
                    "Effect": "Allow",
                    "Action": [
                        "ec2:CreateTags"
                    ],
                    "Resource": "arn:aws:ec2:*:*:network-interface/*"
                },
                {
                    "Sid": "CWLogGroupManagement",
                    "Effect": "Allow",
                    "Action": [
                        "logs:CreateLogGroup",
                        "logs:DescribeLogGroups",
                        "logs:PutRetentionPolicy"
                    ],
                    "Resource": "arn:aws:logs:*:*:log-group:/aws/ecs/*"
                },
                {
                    "Sid": "CWLogStreamManagement",
                    "Effect": "Allow",
                    "Action": [
                        "logs:CreateLogStream",
                        "logs:DescribeLogStreams",
                        "logs:PutLogEvents"
                    ],
                    "Resource": "arn:aws:logs:*:*:log-group:/aws/ecs/*:log-stream:*"
                },
                {
                    "Sid": "ExecuteCommandSessionManagement",
                    "Effect": "Allow",
                    "Action": [
                        "ssm:DescribeSessions"
                    ],
                    "Resource": "*"
                },
                {
                    "Sid": "ExecuteCommand",
                    "Effect": "Allow",
                    "Action": [
                        "ssm:StartSession"
                    ],
                    "Resource": [
                        "arn:aws:ecs:*:*:task/*",
                        "arn:aws:ssm:*:*:document/AmazonECS-ExecuteInteractiveCommand"
                    ]
                }
            ]
        },
        "VersionId": "v8",
        "IsDefaultVersion": true,
        "CreateDate": "2021-01-13T20:04:13+00:00"
    }
}
```

ちょっと長いですね。

AWSのマネジメントコンソールで確認したくなります…。

インラインポリシーが含まれる場合は、`aws iam get-role-policy`で`--role-name`、`--policy-name`を指定するようです。ここは、ポリシー名で`INLINE_POLICY`の模様。

つまり、以下のようになります、と。

```shell
$ aws iam get-role-policy --role-name [IAMロール名] --policy-name INLINE_POLICY
```

今回はIAMロールについて見ていきましたが、IAMユーザーやグループの場合もコマンドの読み替えでできそうですね。