STS認証を利用してS3のファイルを取得する

やりたいこと

アカウントAのS3にアカウントBがSTSを利用してファイルを取得したい

流れ

  • アカウントAがアカウントBのAWSアカウント番号を聞く
  • アカウントAがポリシーとロール作成
  • アカウントAが作成したロールとS3バケット名をアカウントBへ連絡
  • アカウントBがユーザー作成、疎通確認

アカウントAがポリシーとロール作成

アカウントA(11111111111)、アカウントB(222222222222)とする

ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::mybucket/*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::mybucket"
        }
    ]
}
ロール

222222222222の部分に事前にアカウントBに聞いたAWSアカウント番号を設定

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::222222222222:root"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

ここまで作業したらアカウントBへロール名を伝える
ARNと表示されているものをそのまま伝えればよい
アカウントAのAWS番号が11111111111で、作成したロール名がaccountaroleの場合は以下になる

arn:aws:iam::11111111111:role/accountarole

アカウントBでユーザー作成、疎通確認

ユーザーにアタッチするポリシーを作成する

ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::11111111111:role/accountarole"
        }
    ]
}

作成したポリシーをつけるユーザーを作成する
作成後、アクセスキーを発行する

疎通確認

ここまできたらS3へアクセスできるので確認する
まずはC:\Users\xxxxx\.awsにあるconfig、credentialsを編集する

  • credentials
[hogehoge]
aws_access_key_id = 作成したユーザーのアクセスキー
aws_secret_access_key = 作成したユーザーのシークレットアクセスキー
  • config
[profile fugafuga]
role_arn = arn:aws:iam::11111111111:role/accountarole
source_profile = hogehoge

設定後、以下でアクセスできる

aws s3 ls s3://mybucket/ --profile fugafuga

補足

[profile fugafuga]を設定せず、tokenを取得するケースも多いと思われる
その場合、まずは以下を実行する

aws sts assume-role --role-arn "arn:aws:iam::11111111111:role/accountarole" --role-session-name sts --profile hogehoge

レスポンスとして、AccessKeyId、SecretAccessKey、SessionTokenが取得できるので、それをcredentialsに設定する

[hoge-tmp]
aws_access_key_id = 取得したAccessKeyId
aws_secret_access_key = 取得したSecretAccessKey
aws_session_token = 取得したSessionToken

設定後は同様に取得可能

aws s3 ls s3://mybucket/ --profile hoge-tmp

有効期限があるため、この手順では毎回credentialsを更新するのが手間になる