【初心者向け】S3オブジェクトを別アカウントのS3にコピーしてみた

記事タイトルとURLをコピーする

こんにちは!

クラウドインテグレーション部(CI部)技術2課の反町です。

別アカウントに存在するS3同士でオブジェクトをコピーする方法を知りたかったので、公式ドキュメントを参考にやってみました!!

aws.amazon.com

構成

f:id:swx-miyu-sorimachi:20220125134238p:plain

今回のゴール

  1. BアカウントにあるオブジェクトをAアカウントにコピー
  2. AアカウントのEC2インスタンスにオブジェクトをダウンロード
  3. 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:::コピー先バケット名/*"
            ]
        }
    ]
}

f:id:swx-miyu-sorimachi:20220125134253p:plain

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:::コピー先バケット"
        }
    ]
}

f:id:swx-miyu-sorimachi:20220125134305p:plain

オブジェクトコピーを実行

「testfile.txt」という名前のテスト用ファイルを用意して、コピー元S3にアップしておきました。

BアカウントEC2からオブジェクトコピーを実施します。

コマンドは以下です。

aws s3 cp s3://コピー元バケット/testfile.txt s3://コピー先バケット/testfile.txt --acl bucket-owner-full-control

コピーされました!! f:id:swx-miyu-sorimachi:20220125111526p:plain

オブジェクトのダウンロード

Aアカウントに作成したファイル取得&閲覧用EC2からコピーしたオブジェクトのダウンロードと内容を見ることができるか確認します。

コマンドは以下です。

aws s3 cp s3://コピー先バケット/testfile.txt /tmp

ダウンロード成功しました!!! f:id:swx-miyu-sorimachi:20220125112853p:plain

中身が見れるかも確認です。 f:id:swx-miyu-sorimachi:20220125115648p:plain

テストファイルが存在し、中身も見れました~!

まとめ

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