初めに
アカウントAのリソースを使用したいアカウントBがいるとします。
そのための手順は以下の通りです。
- アカウントAは、アカウントBにリソースの使用を許可するためのポリシーを作成する
- アカウントAは、信頼されたエンティティをアカウントBとしたロールを作成し、1 で作成したポリシーをアタッチする。
- アカウントBは、2 で作成されたロールを引き受けるためのポリシーを作成する
- アカウントBは、ロールを作成し、3 で作成したポリシーをアタッチする
- アカウントBは、2 で作成されたロールを引き受ける
手順
アカウントBにロールを割り当てることで、アカウントAで作成した以下のバケットがアカウントBから見ることができるか検証します。
1. アカウントAでポリシーの作成
ここではリストと読み取りを許可します。
2. アカウントAでロールの作成
別の AWS アカウントを選択し、アカウントBのアカウント ID を入力します。
1 で作成したポリシーを選択します。
作成後、以下のように信頼されたエンティティにはアカウントBのアカウントIDが表示されます。
3. アカウントBでポリシーの作成
既存のロールがあればそこにインラインポリシーとして記述することが可能です。
Resource
に 2 で作成されたロールの ARN を指定します。
{
"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
参考記事