異なるAWSアカウント間(クロスアカウント)で、S3バケットにファイルを転送させたいことがありました。
accountA accountB S3bucket ⇐ file
accountAのS3バケットに対して、accountBからファイル転送する場合を例として設定手順を説明します。 同様のことでお悩みの方はぜひ参考にしてみてください。
accountAのS3バケットを操作するIAMポリシーを作成する
まずはaccountAでIAMポリシーを作成します。
以下のようにS3バケットに対する操作権限を付与したポリシーを定義します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", ], "Resource": "arn:aws:s3:::accountA-bucketname" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::accountA-bucketname/*" } ] }
accountAでIAMロールを作成する
1.IAMロールを作成
accountAのIAMロール作成画面を開きます。信頼されたエンティティの種類を選択で「別のアカウント」を選択し、accountBのアカウントIDを入力します。
2.IAMポリシーの紐付け
先程作成したIAMポリシーを選択してロールの作成を完了させます。
このようにすることでaccountBからaccountAのIAMポリシーを使ってaccountAのS3バケットを操作することが可能となります。 (これを信頼ポリシーと呼びます)
3.信頼ポリシーの編集
これまでの設定によりaccountBのルートユーザに対して信頼ポリシーが設定されたことになります。 ルートユーザではない対象(Principal)に信頼ポリシーを設定することもできます。
下記はaccountBのIAMロールに対して信頼ポリシーを設定する場合の手順です。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::222222222222:role/accountB-roleName" }, "Action": "sts:AssumeRole" } ] }
まとめ
IAMロールを使用することで、簡単にクロスアカウントのファイル転送が実現できます。
IAMロールだけでアクセス制限の管理ができるので保守性も高く非常にオススメの方法です。