行動すれば次の現実

テック中心の個人ブログ

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

異なる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を入力します。

f:id:furu07yu:20211016174540j:plain

2.IAMポリシーの紐付け

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

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

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

3.信頼ポリシーの編集

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

下記はaccountBの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ロールだけでアクセス制限の管理ができるので保守性も高く非常にオススメの方法です。