別の AWS アカウントから Amazon S3 オブジェクトをコピーする方法を教えてください。
Amazon Simple Storage Service (Amazon S3) オブジェクトを AWS アカウント間でコピーし、コピー先のアカウントがコピーしたオブジェクトを所有できるようにしたいです。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
オブジェクトをアップロードした AWS アカウントは、自動的には Amazon S3 のオブジェクト所有者になりません。S3 Object Ownership の設定を変更する際は、[バケット所有者の強制] 設定を使用することがベストプラクティスです。[バケット所有者の強制] 設定を使用すると、Amazon S3 に保存されているデータのアクセス管理を簡素化できます。ただし、このオプションでは、すべてのバケットのアクセスコントロールリスト (ACL) と、バケット内のすべてのオブジェクトに対する ACL が無効になります。
S3 Object Ownership で [バケット所有者の強制] 設定を使用すると、同じバケット所有者が Amazon S3 バケット内のすべてのオブジェクトを自動的に所有することになります。既存のバケットでは、ACL を明示的に無効化しない限り、S3 オブジェクトをアップロードしたアカウントがオブジェクトの所有者になります。
既存の方法では ACL を使用してオブジェクトを共有している場合は、ACL を使用してオブジェクトにアクセスするプリンシパルを特定します。詳細については、「ACL を無効化するための前提条件」を参照してください。
ACL を無効にできない場合は、バケットポリシーを調整できるようになるまで、次の手順を実行してオブジェクトの所有権を取得してください。
-
ソースアカウントで、IAM ID にクロスアカウントアクセスを付与する AWS Identity and Access Management (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 のアクセス許可も付与する必要があります。アクセス許可のエラーが発生した場合は、管理者ユーザーを使用して IAM に関連する問題を切り分けます。
-
ソースアカウントで、カスタマーマネージドポリシーを IAM ID にアタッチします。
-
宛先アカウントで、宛先バケットの [S3 Object Ownership の設定] を [バケット所有者優先] に設定します。こうすることで、ACL を bucket-owner-full-control に設定してアップロードした新しいオブジェクトは、自動的に宛先アカウントにより所有されます。
-
宛先アカウントで宛先のバケットポリシーを変更し、ソースアカウントにオブジェクトをアップロードするためのアクセス許可を付与します。さらに、バケットポリシーにオブジェクトのアップロードを必要とする条件を含め、ACL を bucket-owner-full-control に設定します。
ポリシーの例:{ "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" } ] }注: 実際のものでそれぞれ、destination-DOC-EXAMPLE-BUCKET を宛先バケット名に、arn:aws:iam::222222222222:user/Jane をソースアカウントの IAM ID の ARN に置き換えます。
このバケットポリシーの例には、必要な ACL を持つオブジェクトをアップロードするために最低限必要なアクセス許可のみが含まれています。ユースケースに基づいて、許可される S3 アクションをカスタマイズします。 -
ソースアカウントの IAM ID が宛先バケットにオブジェクトをアップロードすることを許可するには、ACL を bucket-owner-full-control に設定する必要があります。例えば、ソースの IAM ID は、AWS CLI コマンド cp に —acl オプションを付与して実行する必要があります。
aws s3 cp s3://source-DOC-EXAMPLE-BUCKET/object.txt s3://destination-DOC-EXAMPLE-BUCKET/object.txt --acl bucket-owner-full-control上記の例では、コマンドが object.txt ファイルをコピーします。フォルダ全体をコピーするには、次のコマンドを実行します。
aws s3 cp directory/ s3://bucketname/directory --recursive --acl bucket-owner-full-control注: AccessDenied エラーが発生する場合は、「Amazon S3 で発生するアクセス拒否 (403 Forbidden) エラーのトラブルシューティング」を参照してください。
**重要:**S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html) バケットで AWS キー管理サービス (AWS KMS)[ が有効になっているデフォルトの暗号化が有効になっている場合は、AWS KMS キー権限も変更する必要があります。手順については、「私の Amazon S3 バケットには、カスタム AWS KMS キーを使用してデフォルトで暗号化されている」を参照してください。ユーザーがそのバケットでダウンロードやアップロードを行えるようにする方法を教えてください」を参照してください。
S3 バケット間で大量のデータをコピーする方法については、「ある Amazon S3 バケットから別のバケットに大量のデータを転送するのに最適の方法を教えてください」を参照してください。 さらに、「Amazon S3 に大量のデータをアップロードする場合に、パフォーマンスを最適化する方法を教えてください」も参照してください。
関連情報
例 2: バケット所有者がクロスアカウントのバケットアクセス許可を付与する
他の AWS アカウントによってオブジェクトがアップロードされたときに、Amazon S3 バケットでオブジェクト所有権を変更する方法を教えてください

