こんにちは!
クラウドインテグレーション部(CI部)技術2課の反町です。
別アカウントに存在するS3同士でオブジェクトをコピーする方法を知りたかったので、公式ドキュメントを参考にやってみました!!
構成

今回のゴール
- BアカウントにあるオブジェクトをAアカウントにコピー
- AアカウントのEC2インスタンスにオブジェクトをダウンロード
- EC2インスタンスからファイルの中身が見れる!
ここまでを今回の目標にします。
以下に示す必要なリソースは作成しておきました。
Aアカウント:EC2、S3バケット
Bアカウント:EC2、S3バケット
Bアカウントでやること
EC2インスタンスに権限付与
オブジェクトとコピー用EC2インスタンスに次の内容のポリシーを持ったインスタンスプロファイルを付与します。
内容はコピー元バケットのバケット表示と取得を許可する権限と、コピー先バケットのバケット表示とバケットにオブジェクトを置く権限を付与しています。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::コピー元バケット名",
"arn:aws:s3:::コピー元バケット名/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::コピー先バケット名",
"arn:aws:s3:::コピー先バケット名/*"
]
}
]
}

Aアカウントでやること
オブジェクト所有権をバケット所有者が優先されるように設定
S3コンソール>コピー先バケット>アクセス許可>オブジェクト所有者>編集からオブジェクト所有者が「バケット所有者の強制」になっていることを確認します。
※デフォルト設定で作成したS3バケットはデフォルトでオブジェクト所有者が「バケット所有者の強制」になっていました。
バケットポリシーを編集
コピー先バケットのバケットポリシーを次の内容に編集します。
内容はコピー元EC2インスタンスに付与したIAMロールにコピー先バケットへのオブジェクト配置とバケット表示を許可しています。
{
"Version": "2012-10-17",
"Id": "Policy1611277539797",
"Statement": [
{
"Sid": "Stmt1611277535086",
"Effect": "Allow",
"Principal": {
"AWS": "コピー元EC2インスタンスに付与したIAMロールのarn"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::コピー先バケット/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
},
{
"Sid": "Stmt1611277877767",
"Effect": "Allow",
"Principal": {
"AWS": "コピー元EC2インスタンスに付与したIAMロールのarn"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::コピー先バケット"
}
]
}

オブジェクトコピーを実行
「testfile.txt」という名前のテスト用ファイルを用意して、コピー元S3にアップしておきました。
BアカウントEC2からオブジェクトコピーを実施します。
コマンドは以下です。
aws s3 cp s3://コピー元バケット/testfile.txt s3://コピー先バケット/testfile.txt --acl bucket-owner-full-control
コピーされました!!

オブジェクトのダウンロード
Aアカウントに作成したファイル取得&閲覧用EC2からコピーしたオブジェクトのダウンロードと内容を見ることができるか確認します。
コマンドは以下です。
aws s3 cp s3://コピー先バケット/testfile.txt /tmp
ダウンロード成功しました!!!

中身が見れるかも確認です。

テストファイルが存在し、中身も見れました~!
まとめ
今回は他アカウントのオブジェクトをコピーしてEC2から見てみるということをやりましたが、EC2から直接別のアカウントにあるS3のオブジェクトを取得するということもできるようなので、また時間があるときに挑戦してみたいと思います。ポリシー関係はややこしく感じてしまう部分だと思うので、どなたかの参考になれば幸いです!