今回のゴール
別アカウントのS3にアクセスする方法は下記の3つの方法があります。
- ACL
- バケットポリシー
- IAM
今回はIAMを使用してアカウントAのS3にアカウントBからアクセスしてみたいと思います。
参考にしたサイト
https://aws.amazon.com/jp/premiumsupport/knowledge-center/cross-account-access-s3/
Amazon S3 バケットにあるオブジェクトへのクロスアカウントアクセスを提供する方法を教えてください。
設定 アカウントA側(S3側)
テスト用S3バケットの作成
手順は割愛しますが、テスト用のS3バケットを作成します。
今回はバケット名を”cross-account-test-2020″としました
ポリシーの作成
S3へアクセスするポリシーを作成します。
ポリシーの作成より[JSON]タブを指定して下記ポリシーを貼り付けます。
バケット名は変更してください。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:ListAllMyBuckets" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::*" ] }, { "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": "arn:aws:s3:::cross-account-test-2020" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::cross-account-test-2020/*" } ] }
ロールの作成
先ほど作成したポリシーをアタッチするロールを作成します。
ロールの作成より、「別のAWSアカウント」を選択して、[アカウントID]を入力します。(アクセスする側のアカウントID)

作成済みのポリシーを選択します。
ポリシー名は”AllowCrossAccountTestRole”として作成完了しました。

設定 アカウントB側(S3へアクセスする側)
ポリシーの作成
アカウントAで作成したポリシーを引き受ける(AssumeRole)ポリシーを作成します。
ポリシーの作成より[JSON]タブを指定して下記ポリシーを貼り付けます。
アカウント名、ロール名は変更してください。
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::AccountA:role/AllowCrossAccountTestRole" } }
確認
今回は管理コンソールで動作を確認していきます。
アカウントB(アクセスする側)のIAMユーザーに上記で作成したAssumeRoleのポリシーをアタッチします。
その後、管理コンソールからそのユーザーでログインします。
ログイン後、管理コンソール右上のアカウントメニューから”ロールの切り替え”をクリックしてロールを切り替えます。
S3サービスメニューより該当のバケットにファイルがアップロード・ダウンロードできるかを確認します。
また、下記の動作が禁止されるかを確認して完了とします。
- アップロードしたファイルを削除できない。
- アカウントAの他のS3バケットにアクセスできない。