別の AWS アカウントから S3 オブジェクトをコピーするにはどうすればよいですか?

最終更新日: 2021 年 2 月 22 日

Amazon Simple Storage Service (Amazon S3) オブジェクトを AWS アカウント間でコピーしたいのですが、コピー先アカウントが、コピーされたオブジェクトを所有するようにしたいと考えています。どうすればそれができますか?

解決方法

デフォルトでは、S3 オブジェクトの所有者はオブジェクトをアップロードしたアカウントです。これは、コピー先バケットが別のアカウントによって所有されている場合でも当てはまります。オブジェクトの所有権は、バケットポリシーを使用してアクセス許可を管理するために重要です。バケットポリシーをバケット内のオブジェクトに適用するには、そのオブジェクトがバケットを所有するアカウントによって所有されている必要があります。

コピー先アカウントが別のアカウントからコピーした S3 オブジェクトを所有していることを確認するには、次の手順に従います。

1.    ソースアカウントで、AWS Identity and Access Management (IAM) カスタマー管理ポリシーを作成します。このポリシーは、IAM ID (ユーザーまたはロール) に適切なアクセス許可を付与します。IAM ユーザーは、ソースバケットからオブジェクトを取得し、コピー先バケットにオブジェクトを戻すためのアクセス権が必要です。次のような IAM ポリシーを使用できます。

{
    "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/*"
            ]
        }
    ]
}

注: この IAM ポリシーの例には、オブジェクトを一覧表示したり、異なるアカウントのバケット間でオブジェクトをコピーしたりするのに最低限必要なアクセス許可のみが含まれています。ユースケースに応じて、許可された S3 アクションをカスタマイズする必要があります。例えば、ユーザーがオブジェクトタグを持つオブジェクトをコピーする必要がある場合は、s3:GetObjectTagging のアクセス許可も付与する必要があります。

2.    ソースアカウントで、コピー先バケットへのオブジェクトのコピーに使用する IAM ID にカスタマー管理ポリシーをアタッチします

3.    コピー先アカウントで、コピー先バケットの S3 オブジェクトの所有権をバケット所有者が優先されるように設定しますS3 オブジェクトの所有権を設定すると、アクセスコントロールリスト (ACL) が bucket-owner-full-control に設定されている状態でアップロードされた新しいオブジェクトは、バケットのアカウントによって自動的に所有されます。

4.    コピー先アカウントで、コピー先バケットのバケットポリシーを変更し、ソースアカウントにオブジェクトをアップロードするためのアクセス許可を付与します。さらに、バケットポリシーにオブジェクトのアップロードを必要とする条件を含め、ACL を bucket-owner-full-control に設定します。次のようなステートメントが使えます。

注: destination-DOC-EXAMPLE-BUCKET をコピー先バケットの名前に置き換えます。次に、arn:aws:iam::222222222222:user/Jane を、ソースアカウントの IAM ID の Amazon リソースネーム (ARN) に置き換えます。

{
    "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"
        }
    ]
}

注: このバケットポリシーの例には、必要な ACL を持つオブジェクトをアップロードするために最低限必要なアクセス許可のみが含まれています。ユースケースに応じて、許可された S3 アクションをカスタマイズする必要があります。例えば、ユーザーがオブジェクトタグを持つオブジェクトをコピーする必要がある場合は、s3:GetObjectTagging のアクセス許可も付与する必要があります

5.    IAM ポリシーとバケットポリシーを設定した後、ソースアカウントの IAM ID は、オブジェクトをコピー先バケットにアップロードする必要があります。ACL が bucket-owner-full-control に設定されていることを確認します。例えば、ソース IAM ID は、--acl オプションを指定して cp AWS CLI コマンドを実行する必要があります。

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

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

S3 オブジェクトの所有権をバケット所有者優先に設定すると、bucket-owner-full-control ACL でアップロードされたオブジェクトは、コピー先バケットのアカウントによって自動的に所有されます。

重要: S3 バケットで AWS Key Management Service (AWS KMS) を有効にしたデフォルトの暗号化がある場合は、AWS KMS キーのアクセス許可も変更する必要があります。手順については、「Amazon S3 バケットにカスタム AWS KMS キーを使用したデフォルトの暗号化があります」を参照してください。ユーザーにバケットからのダウンロードとバケットへのアップロードを許可するにはどうすればよいですか?