他の AWS アカウントから S3 オブジェクトをコピーする方法を教えてください。

最終更新日: 2019 年 10 月 17 日

Amazon Simple Storage Service (Amazon S3) オブジェクトを別の AWS アカウントのバケットにコピーしたいです。次に、コピーしたオブジェクトを送信先のアカウントで所有していることを確認したいと思います。どうすればよいですか? 

簡単な説明

別のアカウントからコピーされた S3 オブジェクトをコピー先アカウントが所有していることを確認するには、クロスアカウントコピーを実行するアクセス許可を送信先アカウントに付与します。クロスアカウントのアクセス許可を設定して、アカウント A のソースバケットからアカウント B の送信先バケットにオブジェクトをコピーするには、以下の手順に従います。

1.    アカウント A のソースバケットに、バケットポリシーを添付します。

2.    アカウント B のユーザーまたはロールに AWS Identity and Access Management (IAM) ポリシーを添付します。

3.    アカウント B の IAM ユーザーまたはロールを使用して、クロスアカウントコピーを実行します。

デフォルトでは、S3 オブジェクトの所有者はオブジェクトをアップロードしたアカウントです。そのため、クロスアカウントコピーを実行するアクセス許可を送信先アカウントに付与することで、コピーされたオブジェクトをコピー先が所有していることを確認できます。アクセスコントロールリスト (ACL)bucket-owner-full-control に変更することで、オブジェクトの所有権を変更することもできます。ただし、オブジェクト ACL は複数のオブジェクトに対する管理が困難な場合があるため、プログラムによるクロスアカウントアクセス許可を送信先アカウントに付与することを推奨します。

オブジェクトの所有権は、バケットポリシーを使用してアクセス許可を管理するために重要です。バケットポリシーをバケット内のオブジェクトに適用するには、そのオブジェクトがバケットを所有するアカウントによって所有されている必要があります。オブジェクトの ACL を使用して、オブジェクトのアクセス許可を管理することもできます。ただし、オブジェクト ACL は複数のオブジェクトに対する管理が困難な場合があるため、アクセス許可を設定するための一元的な方法として、バケットポリシーを使用することを推奨します。

解決方法

アカウント A のソースバケットにバケットポリシーを添付する

1.    アカウント B (送信先アカウント) の AWS アカウント ID 番号を取得します。

2.    次のように、アカウント A からアカウント B がオブジェクトの取得を許可するソースバケットに、バケットポリシーを添付します。

重要: Principal の値は、222222222222 をアカウント B の AWS アカウント ID に置き換えます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DelegateS3Access",
            "Effect": "Allow",
            "Principal": {"AWS": "222222222222"},
            "Action": ["s3:ListBucket","s3:GetObject"],
            "Resource": [
                "arn:aws:s3:::awsexamplesourcebucket/*",
                "arn:aws:s3:::awsexamplesourcebucket"
            ]
        }
    ]
}

アカウント B のユーザーまたはロールに IAM ポリシーを添付する

1.    アカウント B から、IAM ユーザーまたはロールがアカウント A のソースバケットからアカウント B の送信先バケットにオブジェクトをコピーできる IAM カスタマー管理ポリシーを作成します。ポリシーは次の例のようになります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::awsexamplesourcebucket",
                "arn:aws:s3:::awsexamplesourcebucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::awsexampledestinationbucket",
                "arn:aws:s3:::awsexampledestinationbucket/*"
            ]
        }
    ]
}

2.    アカウント間でオブジェクトをコピーするために使用する IAM ユーザーまたはロールに、カスタマー管理ポリシーを添付します。

アカウント B の IAM ユーザーまたはロールを使用して、クロスアカウントコピーを実行する

バケットポリシーと IAM ポリシーを設定すると、アカウント B の IAM ユーザーまたはロールはアカウント A からアカウント B へのコピーを実行できます。次に、アカウント B がコピー済みオブジェクトを所有します。

アカウント A のソースバケットからすべてのコンテンツをアカウント B の送信先バケットに同期するには、アカウント B の IAM ユーザーまたはロールで AWS コマンドラインインターフェイス (AWS CLI) を使用して sync コマンドを実行します。

aws s3 sync s3://awsexamplesourcebucket s3://awsexampledestinationbucket