0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-05-29

初めに

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

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

手順

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

image.png

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

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

image.png

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

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

image.png

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

image.png

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

image.png

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

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0