行動すれば次の現実

ほどよくモダンなシステム開発を目指しています。メインテーマは生産性、Ruby、Javascriptです。

別のAWSアカウント間でS3バケットにあるファイルを転送する方法

異なるAWSアカウント間(クロスアカウント)で、S3バケットにファイルを転送することがありました。

accountA        accountB
 S3bucket   ⇐    file

アカウントAのS3バケットに対して、アカウントBからファイル転送する場合を例として設定手順を説明します。 同様のことでお悩みの方はぜひ参考にしてみてください。

アカウントAのS3バケットを操作するIAMポリシーを作成する

まずはアカウントAで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/*"
        }
    ]
}

アカウントAでIAMロールを作成する

1.IAMロールを作成

アカウントAのIAMロール作成画面を開きます。信頼されたエンティティの種類を選択で「別のアカウント」を選択し、アカウントBのアカウントIDを入力します。

f:id:furu07yu:20211016174540j:plain

2.IAMポリシーの紐付け

先程作成したIAMポリシーを選択してロールの作成を完了させます。

f:id:furu07yu:20211016174916j:plain
ロールにポリシーを紐付ける

このようにすることでアカウントBからアカウントAのIAMポリシーを使ってアカウントAのS3バケットを操作することが可能となります。 (これを信頼ポリシーと呼びます)

3.信頼ポリシーの編集

これまでの設定によりアカウントBのルートユーザに対して信頼ポリシーが設定されたことになります。 ルートユーザではない対象(Principal)に信頼ポリシーを設定することもできます。

下記はアカウントBのIAMロールに対して信頼ポリシーを設定する場合の手順です。

f:id:furu07yu:20211016180813j:plain

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::222222222222:role/accountB-roleName"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

まとめ

いかがだったでしょうか。 IAMロールを使用することで、簡単にクロスアカウントのファイル転送が実現できます。

IAMロールだけでアクセス制限の管理ができるので保守性も高く非常にオススメの方法です。