2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[クロスアカウント]S3バケット間でのs3sync(IAMロールによるSTS認証編)

Last updated at Posted at 2023-04-28

はじめに

AWSアカウントを跨いで、ファイル連携をしたい場面が多く、
手軽に実装できるS3を介した連携について、まとめてみました。
S3での連携方法はいくつかありますが、
今回はIAMロールによるSTS認証を使用した方法について記載します。

やりたいこと

アカウントAにあるEC2から、アカウントBが所有するS3バケットにアカウントBのIAMロールを使用してアクセスし、アカウントAが所有するS3バケットにファイル連携がしたいです。
image.png

作成手順

ポリシーの記載内容が混乱しがちなので、主にポリシーについて記載します。

アカウントA側

  • S3バケット作成
    S3バケットポリシーは下記の通りです。
     ※アカウントBのIAMロールからのアクセスを許可する必要があります。
      設定していない場合、ListObjectsV2でAccess Denied (アクセス拒否) エラーとなります。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "{アカウントBのIAMロールARN}"
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "{アカウントAのS3バケットARN}",
                "{アカウントAのS3バケットARN}/*"
            ]
        }
    ]
}
  • EC2作成
  • EC2にアタッチするIAMロール作成
    IAMロールのポリシーは下記の通りです。
     ※アカウントBのIAMロールの権限にてs3syncコマンドを実行する為、
       アカウントBのIAMロールにスイッチロールする権限のみで問題ありません。
     ※SSMでOSにログインする場合は「AmazonSSMManagedInstanceCore」も付与しておきます。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAssumeCrossAccountRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "{アカウントBのIAMロールARN}"
        }
    ]
}

アカウントB側

  • S3バケット作成
  • アカウントAからのスイッチロール先IAMロール作成
    IAMロールのポリシーは下記の通りです。
     ※アカウントBのIAMロールの権限にてS3syncコマンドを実行する為、
       アカウントBのS3バケットへの操作権限に加え、
       アカウントAのS3バケットへの操作権限も必要です。
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:PutObject"
        ],
        "Resource": [
            "{アカウントAのS3バケットARN}",
            "{アカウントAのS3バケットARN}/*",
            "{アカウントBのS3バケットARN}",
            "{アカウントBのS3バケットARN}/*"
        ]
    }
}

以上で設定作業は完了です。

やってみる

s3sync実行前の状況

  • アカウントAのS3バケット
    なにも格納されてません。
    image.png

  • アカウントBのS3バケット
    tst.txtを格納しています。
    image.png

s3sync実行

アカウントAのEC2にSSMにてログインし、アカウントBのロールの権限を使用してs3syncを実行します。
末尾のprofile指定でアカウントBのIAMロールの権限を使用してコマンドを実行しています。

アカウントBのS3バケットに格納していた、「tst.txt」がアカウントAのS3バケットにコピーされました!
EC2_S3sync.png
下記、実行したコマンドのサンプルです。

aws s3 sync s3://{アカウントBのS3バケット名} s3://{アカウントAのS3バケット名} --profile {プロファイル名}

s3sync実行後の状況

  • アカウントAのS3バケット
    コンソール上でも「tst.txt」が存在していることを確認できました。
    image.png

さいごに

ポイントとしては、アカウントBのIAMロールに、アカウントAのS3バケットへの操作権限を設定しつつ、
アカウントAのS3バケットポリシーに、アカウントBのIAMロールからの操作権限を設定することです。
感覚的にはどちらか一方で設定していれば問題ない気がしてしまいますが、
双方で設定する必要があり、ハマりポイントになりやすいので、ご注意ください。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?