2 つの Amazon S3 バケット間でオブジェクトをコピーできないのはなぜですか?
ある Amazon Simple Storage Service (Amazon S3) バケットから別のバケットにオブジェクトをコピーしたいのですが、できません。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
バケットポリシーと IAM ポリシー
バケット間でオブジェクトをコピーするには、正しい権限が設定されていることを確認してください。同じ AWS アカウントのバケット間でオブジェクトをコピーするには、AWS Identity and Access Management (IAM) ポリシーを使用してアクセス権限を設定します。異なるアカウントのバケット間でオブジェクトをコピーするには、関連する IAM ポリシーとバケットポリシーの両方にアクセス権限を設定する必要があります。
**注:**バケットポリシーを変更する方法については、「Amazon S3 コンソールを使用したバケットポリシーの追加」を参照してください。IAM ユーザーのアクセス許可を変更する方法については、「IAM ユーザーのアクセス許可を変更する」を参照してください。IAM ロールのアクセス許可を変更する方法については、「ロールに対するアクセス許可を更新する」を参照してください。
以下の必要なアクセス権限を確認してください。
- 少なくとも、IAM ID (ユーザーまたはロール) には、ソースバケットに対する s3:GetObject アクションへのアクセス権限が必要です。バケットが同じアカウントにある場合は、IAM ID のポリシーを使用してこれらのアクセス権限を設定します。S3 バケットポリシーで IAM ID を明示的に許可することもできます。バケットが異なるアカウントにある場合は、バケットポリシーと IAM ID のポリシーの両方でこれらのアクセス権限を設定します。
- 少なくとも、IAM アイデンティティには、宛先バケットに対する s3:PutObject アクションへのアクセス権限が必要です。バケットが同じアカウントにある場合は、IAM ID のポリシーを使用してこれらのアクセス権限を設定します。S3 バケットポリシーで IAM ID を明示的に許可することもできます。バケットが異なるアカウントにある場合は、バケットポリシーと IAM ID のポリシーの両方でこれらのアクセス権限を設定します。
- 関連するバケットポリシーと IAM ポリシーを確認して、必要な権限と矛盾する明示的な拒否ステートメントがないことを確認します。明示的な拒否ステートメントが、許可ステートメントを上書きしてしまうからです。
- 特定のオペレーションについては、IAM ID にオペレーション内の必要なすべてのアクションに対するアクセス権限があることを確認してください。たとえば、aws s3 cp というコマンドを実行するには、s3:GetObject と s3:PutObject に対するアクセス権限が必要です。--recursive オプションを使用して aws s3 cp コマンドを実行するには、s3:GetObject、s3:PutObject、および s3:ListBucket に対するアクセス権限が必要です。コマンド aws s3 sync を実行するには、s3:GetObject、s3:PutObject、およびs3:ListBucket へのアクセス権限が必要です。
注:AssumeRole API オペレーションを使用して Amazon S3 にアクセスする場合は、信頼関係が正しく設定されていることを確認してください。 - バージョン固有の操作については、IAM ID にバージョン固有のアクションに対する権限があることを確認してください。たとえば、オブジェクトの特定のバージョンをコピーするには、s3:GetObjectVersion と s3:GetObject の権限が必要です。
- オブジェクトタグのあるオブジェクトをコピーするには、IAM ID にs3:GetObjectTagging と s3:PutObjectTagging の権限が必要です。ソースオブジェクトに対する s3:GetObjectTagging 権限と宛先バケット内のオブジェクトに対する s3:PutObjectTagging 権限が必要です。
- 関連するバケットポリシーと IAM ポリシーを見直して、リソース要素のパスが正しいことを確認します。バケットレベルの権限の場合、リソース要素はバケットを指している必要があります。オブジェクトレベルの権限の場合、リソーズ要素は 1 つまたは複数のオブジェクトを指している必要があります。
たとえば、s3:ListBucket などのバケットレベルのアクションのポリシーステートメントでは、リソース要素でバケットを指定する必要があります。
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
s3:GetObject または s3:PutObject などのオブジェクトレベルのアクションのポリシーステートメントでは、リソース要素内の 1 つまたは複数のオブジェクトを指定する必要があります。
"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
オブジェクトの所有権
バケットポリシーに正しい権限があっても、バケット間でオブジェクトをコピーできない場合は、オブジェクトを所有しているアカウントを確認してください。バケットポリシーは、バケット所有者に属するオブジェクトにのみ適用されます。他のアカウントに属するオブジェクトは、そのアクセス制御リスト (ACL) に対して競合する権限を持っている可能性があります。
**注:**オブジェクトの所有権と ACL の問題は通常、アカウント間で AWS サービスログをコピーするときに発生します。サービスログの例には、AWS CloudTrail ログや Elastic Load Balancing アクセスログなどがあります。
オブジェクトを所有するアカウントを検索するには、以下の手順に従ってください。
- Amazon S3 コンソールを開きます。
- バケット間でコピーできないオブジェクトに移動します。
- オブジェクトの [アクセス権限] タブを選択します。
- [被付与者] の値を確認します。
アカウントがオブジェクトを所有している場合、[被付与者] の [オブジェクト所有者 (AWS アカウント)] に表示される [正規 ID] に AWS アカウントが含まれます。別のアカウントがオブジェクトを所有していて、そのオブジェクトにアクセスできる場合は、次の両方が当てはまります。
- [オブジェクト所有者 (AWS アカウント)] の [正規 ID] には外部アカウントが含まれています。
- [認証済みユーザーグループ (AWS アカウントを持つすべてのユーザー)] の [正規 ID] には、お客様の AWS アカウントが含まれています。
アクセスできないオブジェクトを別のアカウントが所有している場合、[オブジェクト所有者 (AWS アカウント)] と他の被付与者の [正規 ID] フィールドは空になります。
バケット間でコピーできないオブジェクトが別のアカウントによって所有されている場合、オブジェクト所有者は以下のオプションのいずれかを実行できます。
- オブジェクト所有者は、バケット所有者にオブジェクトのフルコントロールを付与できます。バケット所有者がオブジェクトを所有すると、バケットポリシーがオブジェクトに適用されます。セキュリティ上のベストプラクティスとして、バケット所有者はバケット ACL を無効にして、オブジェクトの所有権をバケット所有者強制に設定できます。
- オブジェクト所有者はオブジェクトの所有権を保持できますが、ACL をユースケースに必要な設定に変更する必要があります。
AWS KMS 暗号化
オブジェクトは AWS Key Management Service (AWS KMS) キーで暗号化される場合があります。この場合は、IAM ID にキーに対する正しいアクセス権限があることを確認してください。IAM ID と AWS KMS キーが同じアカウントに属している場合は、キーポリシーによって必要な AWS KMS アクセス権限が付与されていることを確認してください。
IAM ID と AWS KMS キーが異なるアカウントに属している場合は、キーと IAM ポリシーの両方に必要なアクセス権限が付与していることを確認します。
たとえば、2 つのバケット間でオブジェクトをコピーする場合 (各バケットには独自のキーがある場合)、IAM ID には次の権限を指定する必要があります。
- 最初の KMS キーを参照する kms:Decrypt権限
- 2 番目の KMS キーを参照する kms:GenerateDataKey 権限と kms:Decrypt 権限
詳細については、「AWS KMS でのキーポリシーの使用」および「AWS Key Management Service のアクション、リソース、条件キー」を参照してください。
Amazon Archive ストレージクラスまたは Amazon Glacier および Intelligent Archive ストレージクラス
Amazon S3 Glacier ストレージクラスからオブジェクトをコピーすることはできません。オブジェクトをコピーする前に、まず Amazon S3 Glacier からオブジェクトを復元する必要があります。手順については、「アーカイブされたオブジェクトの復元」を参照してください。
リクエスタ支払いがバケットで有効化されました
ソースまたは宛先バケットのリクエスタ支払いが有効になっていて、他のアカウントからバケットにアクセスしたい場合は、リクエストを確認してください。リクエストに正しいリクエスタ支払いパラメータが含まれていることを確認してください。
- AWS コマンドラインインターフェイス (AWS CLI) コマンドには --request-payer オプションを含めてください。
- GET、HEAD、POST リクエストの場合は、x-amz-request-payer: リクエスタを含めてください。
- 署名付き URL の場合は、x-amz-request-payer=requester を含めてください。
AWS Organizations のサービスコントロールポリシー
AWS Organizations を使用している場合は、サービスコントロールポリシーをチェックして、Amazon S3 へのアクセスが許可されていることを確認してください。
たとえば、このポリシーでは、Amazon S3 にアクセスしようとすると 403 Forbidden エラーが発生します。これは、アクセスを明示的に拒否するためです。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "S3:*", "Resource": "*" } ] }
AWS Organizations の機能の詳細については、「組織内ですべての機能を有効にする」を参照してください。
Amazon S3 の VPC エンドポイントに関するクロスリージョンリクエストの問題
Amazon S3 の VPC エンドポイントは、異なる AWS リージョンにわたるリクエストをサポートしていません。たとえば、リージョン A に Amazon Elastic Compute Cloud (Amazon EC2) インスタンスがあるとします。このインスタンスには、関連するルートテーブルに仮想プライベートクラウド (VPC) エンドポイントが設定されています。EC2 インスタンスは、リージョン B からリージョン A のバケットにオブジェクトをコピーできません。代わりに、次の例のようなエラーメッセージが表示されます。
"An error occurred (AccessDenied) when calling the CopyObject operation: VPC endpoints do not support cross-region requests"
このクロスリージョンリクエストの問題をトラブルシューティングするには、以下の方法を使用してください。
- ルートテーブルから VPC エンドポイントを削除します。VPC エンドポイントを削除する場合、インスタンスは代わりにインターネットに接続できる必要があります。
- VPC エンドポイントを使用しない他のインスタンスから copy コマンドを実行します。または、リージョン A にもリージョン B にもないインスタンスから copy コマンドを実行します。
- VPC エンドポイントを使用する必要がある場合は、まず GET リクエストを送信して、ソースバケットから EC2 インスタンスにオブジェクトをコピーします。次に、PUT リクエストを送信して EC2 インスタンスから宛先バケットにオブジェクトをコピーします。

