【AWS】IAM Roleの権限を実際に確認する【tips】

# はじめに
あるIAM Roleの権限が適切かどうか／必要なAWS APIを実行できるか、意図したとおりになっているか確認するためには、通常はPolicy Simulatorを利用することになるかと思います。

IAMPolicy Simulator を使用した IAM ポリシーのテスト
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_testing-policies.html

ただ、一部のリソースベースのPolicyに対応していなかったり、実際に動作させてみないと分からないことがあります。

特に最近困ったのは、ECRのdockerリポジトリに対して、pull/push出来るかどうか直ぐに確認できなかったことです。
このような場合、自分のIAM Userアカウントから対象のIAM RoleをAssumeRoleすることにより、少し簡単に確認することが可能です。

# 手順概要
1. 対象となるIAM RoleのTrust Relationshipsに、自分自身のIAM Entity（User/Role）を追加する
2. CLIからAssumeRoleし、temporary credentialsを環境変数にセットする
3. 実行できるか確認したいAWS APIを実行する
4. Trust Relationshipsから、自分自身のIAM Entity（User/Role）をはずす


# 動作確認環境・構成
- AWSアカウントID: 999999999999
- Region: ap-northeast-1
- IAM User: test-user（AssumeRoleする権限はあるものとします。）
- IAM Role: test-role (CodeBuild用のRoleとします)

## IAM RoleのTrush Relationships
```json:TrustRelationships
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "codebuild.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

# 手順詳細
## 1. 対象となるIAM RoleのTrust Relationshipsに、自分自身のIAM Entity（User/Role）を追加する

AWS Management Consoleから、対象のRoleのTrust Relationshipsを編集します。
https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/roles/test-role?section=trust

```json:TrustRelationships(変更後）
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "codebuild.amazonaws.com",
        "AWS": "arn:aws:iam::999999999999:user/test-user"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```


## 2. CLIからAssumeRoleし、temporary credentialsを環境変数にセットする
aws configureを実行するか環境変数等で、test-userのAccessKey/SecretAccessKeyが利用されるように設定します。

自分自身のIAM User権限でAWS APIが実行されることを確認します。

```bash:get-caller-identity
$ aws sts get-caller-identity
{
    "Account": "999999999999", 
    "UserId": "AIDAXXXXXXXXXXXXXXXXX", 
    "Arn": "arn:aws:iam::999999999999:user/test-user"
}
```

AWS CLIからAssumeRoelを実行します。

```bash:assume-role
$ aws sts assume-role --role-arn "arn:aws:iam::999999999999:role/test-role" --role-session-name "you-can-put-any-string"
{
    "AssumedRoleUser": {
        "AssumedRoleId": "AROAXXXXXXXXXXXXXXXXX:you-can-put-any-string",
        "Arn": "arn:aws:sts::999999999999:assumed-role/test-role/you-can-put-any-string"
    },
    "Credentials": {
        "SecretAccessKey": "0hq4**********************************",
        "SessionToken": "FQoD************************************************************************************************************************************************************************************************************",
        "Expiration": "2018-06-08T12:34:56Z",
        "AccessKeyId": "ASIAXXXXXXXXXXXXXXXX"
    }
}
```

取得したtemporary credentialsを、下記のように環境変数にセットします。

```bash
$ export AWS_ACCESS_KEY_ID="ASIAXXXXXXXXXXXXXXXX"
$ export AWS_SECRET_ACCESS_KEY="0hq4**********************************"
$ export AWS_SESSION_TOKEN="FQoD************************************************************************************************************************************************************************************************************"
```

## 3. 実行できるか確認したいAWS APIを実行する
AWS CLIから、確認したいAWS APIを実行します。
今回は、ECR上のDocker Imageをpull出来るかどうかを確認します。

```bash:
### Docker loginする
$ $(aws ecr get-login --no-include-email --region ap-northeast-1)
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded

### Docker pullする
$ docker pull 999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/test-docker:latest
```


## 4. Trust Relationshipsから、自分自身のIAM Entity（User/Role）をはずす
AWS Management Consoleから、対象のRoleのTrust Relationshipsを編集し、変更前の状態に戻します。
https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/roles/test-role?section=trust