🪣

AWS S3バケット間ファイル転送をしたい時に読む記事

2023/02/24に公開

概要

S3バケットに保存しているファイルを別アカウントのS3バケットに転送する時、毎回設定を忘れてしまうのでここにシンプルにまとめておく。

作業内容

  • コピー先S3バケットの「オブジェクト所有者」を「希望するバケット所有者」に変更する
  • ソースアカウントのIAMユーザーに適切なアクセス許可を付与する
  • コピー先S3バケットのバケットポリシーを編集し、ソースアカウントからのアクセスを許可する
  • CLIで--acl bucket-owner-full-controlオプションをつけてコピーを実行する

以上4つです。では順番に見ていきましょう。

コピー先S3バケットの「オブジェクト所有者」を「希望するバケット所有者」に変更する

他アカウントからオブジェクトが書き込まれるので、そのままだとオブジェクト所有者がソースアカウントになってしまいます。
こうなるとコピー先S3バケットの所有者がこのオブジェクトを管理できません。これだと困るので、コピー完了時にオブジェクト所有者とバケット所有者が同じになるように設定しておきましょう。
マネジメントコンソール→S3→オブジェクトを書き込みたいS3バケット→アクセス許可→オブジェクト所有者を編集→「希望するバケット所有者」に変更する。
これを設定しておき、かつCLIにオプションを付与してコピーを実行する事でオブジェクト所有者が自動的にバケット所有者になります。

ソースアカウントのIAMユーザーに適切なアクセス許可を付与する

  • コピー対象オブジェクトの読み込みができる
  • コピー先S3バケットへの書き込みができる

これらの権限を付与します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::source-DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::source-DOC-EXAMPLE-BUCKET/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": [
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*"
      ]
    }
  ]
}

注意点として、もしオブジェクトタグを持つオブジェクトをコピーする場合はs3:GetObjectTaggingも追加して下さい。

コピー先S3バケットのバケットポリシーを編集し、ソースアカウントからのアクセスを許可する

以下のサンプルを例にバケットポリシーを設定します。ソースアカウントがコピー先S3バケットに書き込めるようにする為の権限です。

{
  "Version": "2012-10-17",
  "Id": "Policy1611277539797",
  "Statement": [
    {
      "Sid": "Stmt1611277535086",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::222222222222:user/Jane"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": "bucket-owner-full-control"
        }
      }
    },
    {
      "Sid": "Stmt1611277877767",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::222222222222:user/Jane"
      },
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET"
    }
  ]
}

CLIで--acl bucket-owner-full-controlオプションをつけてコピーを実行する

ここまでこれば準備完了です。AWS CLIを使ってコピーを実行しましょう。

aws s3 cp s3://source-DOC-EXAMPLE-BUCKET/object.txt s3://destination-DOC-EXAMPLE-BUCKET/object.txt --acl bucket-owner-full-control

ポイントは--acl bucket-owner-full-controlをオプションとして付ける事です。これを付与する事でアップロードされたオブジェクトの所有者は、自動的にコピー先バケットのアカウントになります。
実行する前に--dryrunを付けて結果が予想通りかどうかを確認しましょう。特に(copy)になっているかどうかは要確認です。
私はコピー先のS3バケットの記述が間違っていて、その名前で(download)してしまうというミスをした事があります。ダウンロードは料金が高いので注意!!
ちなみにS3バケット間コピーは速度がだいたい250MiB/sほど出ます。(東京リージョン内での転送)

参考

https://repost.aws/ja/knowledge-center/copy-s3-objects-account
https://dev.classmethod.jp/articles/amazon-s3-object-ownership-enables-bucket-owners-to-automatically-assume-ownership/

Discussion