2 つの Amazon S3 バケット間でオブジェクトをコピーできないのはなぜですか?
ある Amazon Simple Storage Service (Amazon S3) バケットから別のバケットにオブジェクトをコピーしたいのですが、できません。
解決策
バケットポリシーと IAM ポリシー
バケット間でオブジェクトをコピーするには、正しい権限が設定されていることを確認してください。同じ AWS アカウントのバケット間でオブジェクトをコピーするには、AWS Identity and Access Management (IAM) ポリシーを使用してアクセス権限を設定します。異なるアカウントのバケット間でオブジェクトをコピーするには、関連する IAM ポリシーとバケットポリシーの両方にアクセス権限を設定する必要があります。
**注:**バケットポリシーを変更する方法については、「Amazon S3 コンソールを使用してバケットポリシーを追加する」を参照してください。IAM ユーザーの権限を変更する方法については、「IAM ユーザーの権限の変更」を参照してください。IAM ロールの権限を変更する方法については、「ロールの変更」を参照してください。
以下の必要な権限を確認してください。
- 少なくとも、IAM ID (ユーザーまたはロール) には、ソースバケットに対する s3:ListBucket アクションと s3:GetObject アクションへのアクセス権限が必要です。バケットが同じアカウントにある場合は、IAM ID のポリシーまたは S3 バケットポリシーを使用してこれらの権限を設定します。バケットが異なるアカウントにある場合は、バケットポリシーと IAM ID のポリシーの両方でこれらのアクセス権限を設定します。
- 少なくとも、IAM アイデンティティには、宛先バケットに対する s3:ListBucket アクションと s3:PutObject アクションへのアクセス権限が必要です。バケットが同じアカウントにある場合は、IAM ID のポリシーまたは S3 バケットポリシーを使用してこれらの権限を設定します。バケットが異なるアカウントにある場合は、バケットポリシーと 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 アカウント) が含まれます
- オブジェクトが他のアカウントによって所有されていて、そのオブジェクトにアクセスできる場合は、次のようになります。
オブジェクト所有者のアクセスの下にある正規 ID には (外部アカウント) が含まれています。
他のオブジェクト所有者のアクセスの下にある正規 ID には (あなたの AWS アカウント) が含まれています。 - オブジェクトが他のアカウントによって所有されていて、そのオブジェクトにアクセスできない場合は、次のようになります。
オブジェクト所有者のアクセスと他の AWS アカウントのアクセスの両方の正規 ID フィールドが空です。
バケット間でコピーできないオブジェクトが別のアカウントによって所有されている場合、オブジェクト所有者は以下のオプションのいずれかを実行できます。
- オブジェクト所有者は、バケット所有者にオブジェクトのフルコントロールを付与できます。バケット所有者がオブジェクトを所有すると、バケットポリシーがオブジェクトに適用されます。
- オブジェクト所有者はオブジェクトの所有権を保持できますが、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 オプションを含めてください。
注: AWS CLI コマンドを実行する際にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。 - 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 インスタンスから宛先バケットにオブジェクトをコピーします。
関連情報
関連するコンテンツ
- 質問済み 6年前lg...
- AWS公式更新しました 9ヶ月前
- AWS公式更新しました 3ヶ月前