AWS IAM 別のアカウントから自分のアカウントのリソースにアクセスしてほしいとき

# 初めに

**アカウントA**のリソースを使用したい**アカウントB**がいるとします。
そのための手順は以下の通りです。

1. **アカウントA**は、**アカウントB**にリソースの使用を許可するためのポリシーを作成する
2. **アカウントA**は、信頼されたエンティティを**アカウントB**としたロールを作成し、1 で作成したポリシーをアタッチする。
3. **アカウントB**は、2 で作成されたロールを引き受けるためのポリシーを作成する
4. **アカウントB**は、ロールを作成し、3 で作成したポリシーをアタッチする
5. **アカウントB**は、2 で作成されたロールを引き受ける

# 手順

**アカウントB**にロールを割り当てることで、**アカウントA**で作成した以下のバケットが**アカウントB**から見ることができるか検証します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/1ab0a29b-7ca5-47d1-d04c-09be05583427.png)


## 1. アカウントAでポリシーの作成

ここではリストと読み取りを許可します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/680668ae-8315-3eb7-6d15-57ccdc76fa0f.png)

## 2. アカウントAでロールの作成

別の AWS アカウントを選択し、**アカウントB**のアカウント ID を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/63c1f5c6-161b-ebfd-1bec-8beb39619e9a.png)

1 で作成したポリシーを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/dafcaeed-08c4-ff9a-0afd-7622549a0248.png)

作成後、以下のように信頼されたエンティティには**アカウントB**のアカウントIDが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/876890e9-2a67-692a-b22d-be0e20cd2316.png)

## 3. アカウントBでポリシーの作成

既存のロールがあればそこにインラインポリシーとして記述することが可能です。

`Resource` に 2 で作成されたロールの ARN を指定します。

```json
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::ACCOUNT_A_ID:role/assume_s3_role"
    }
}
```

## 4. アカウントBでロールの作成

3 で作成したポリシーをアタッチし、EC2 が アカウントAのロールを引き受けることを許可するロールを作成します。

## 5. アカウントBでロールの引き受け

### 方法 1

以下のコマンドを実行すると、一時認証情報を得ることができます。`--role-arn` には**アカウントA**のロールを指定します。`--role-session-name`には適当な文字を渡します。

```
$ aws sts assume-role --role-arn arn:aws:iam::ACCOUNT_B_ID:role/assume_s3_role --role-session-name "Account-B"
{
    "AssumedRoleUser": {
        "AssumedRoleId": "aaaaaaaaaaaaaaaaaaaaa:Account-B",
        "Arn": "arn:aws:sts::ACCOUNT_B_ID:assumed-role/assume_s3_role/Account-B"
    },
    "Credentials": {
        "SecretAccessKey": "xxxxxxxxxxxxxxxxxxx",
        "SessionToken": "yyyyyyyyyyyyyyyyyy",
        "Expiration": "2021-05-29T02:58:31Z",
        "AccessKeyId": "zzzzzzzzzzzzzzzzzz"
    }
}
```

これらを環境変数にセットして引き受け完了です。

```
$ export AWS_ACCESS_KEY_ID="zzzzzzzzzzzzzzzzzz"
$ export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxx"
$ export AWS_SESSION_TOKEN="xxxxxxxxxxxxxxxxxxx"
```

以下のようにバケットを見ることができるか確認できました。

```
$ aws s3 ls
2021-05-25 10:19:49 account-a-bucket-0525
```

#### 自分のロールを確認する

**アカウントB**でロール引き受け前

```
$ aws sts get-caller-identity
{
    "Account": "ACCOUNT_B_ID",
    "UserId": "bbbbbbbbbbbbbbbbbbbbbb:i-abc012",
    "Arn": "arn:aws:sts::ACCOUNT_B_ID:assumed-role/S3FullAccessFromEC2/i-abc012"
}
```

**アカウントB**でロール引き受け後

```
$ aws sts get-caller-identity
{
    "Account": "ACCOUNT_A_ID",
    "UserId": "aaaaaaaaaaaaaaaaaaaaa:Account-B",
    "Arn": "arn:aws:sts::ACCOUNT_A_ID:assumed-role/assume_s3_role/Account-B"
}
```

ロール引き受け後に、**アカウントA**のアカウントIDに切り替わっていました。

### 方法 2

こちらは `~/.aws/config` ファイルにプロファイルを作成し、**アカウントA** のロールを設定する方法です。
まず、以下のコマンドにより `test` というプロファイルを作成します。

```
$ aws configure --profile test
```

アクセスキー ID やシークレットアクセスキーは何も入力せずにエンターを押します。

```
$ aws configure --profile test
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

すると `test` プロファイルが作成されます。

```
$ cat ~/.aws/config
[profile test]
output = json
region = ap-northeast-1
```

`~/.aws/config` を以下のように編集します。

```
[profile test]
output = json
region = ap-northeast-1
role_arn = arn:aws:sts::ACCOUNT_A_ID:role/assume_s3_role
credential_source = Ec2InstanceMetadata
```

プロファイルを指定してロールを引き受けることができたかどうか確認します。

```
$ aws sts get-caller-identity --profile test
{
    "Account": "ACCOUNT_A_ID",
    "UserId": "ccccccccccccccc:botocore-session-1234567890",
    "Arn": "arn:aws:sts::ACCOUNT_A_ID:assumed-role/assume_s3_role/botocore-session-1234567890"
}
```

プロファイルを指定して S3 にアクセスします。

```
$ aws s3 ls --profile test
```

# 参考記事

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html

https://aws.amazon.com/jp/premiumsupport/knowledge-center/iam-assume-role-cli/

https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-instance-access-bucket/