別の AWS アカウントにより自分の Amazon S3 バケットにアップロードされたオブジェクトにアクセスできないのはなぜですか?

最終更新日: 2022 年 1 月 24 日

別の AWS アカウントの AWS Identity and Access Management (IAM) ユーザーが、自分の Amazon Simple Storage Service (Amazon S3) バケットへオブジェクトをアップロードしました。そのオブジェクトにアクセスしようとすると、403 アクセス拒否エラーが表示されます。どうすれば解決できますか?

簡単な説明

デフォルトのオブジェクト所有権が設定された既存の Amazon S3 バケットの場合、オブジェクト所有者はオブジェクトをバケットにアップロードした AWS アカウントになります。これらの既存のバケットでは、オブジェクト所有者はオブジェクトに (アクセスコントロールリストを添付して) アクセス許可を明確に付与する必要がありました。これをしないと、バケット所有者はオブジェクトにアクセスできなくなります。

S3 Object Ownerships を使用することで、バケット所有者は自分のバケットにアップロードされたオブジェクトの所有権を管理できるようになりました。デフォルトでは、新しく作成されたすべての S3 バケットでは、bucket owner enforced 設定が有効になっています。bucket owner enforced が有効になっている場合、バケット所有者はバケット内のすべてのオブジェクトのオブジェクト所有者になります。また、バケットとそのオブジェクトの ACL はすべて無効になります。

bucket owner enforced 設定または bucket owner preferred 設定を有効にすることで、既存のバケットに S3 Object Ownership を設定することもできます。bucket owner preferred 設定が有効になっても、ACL は引き続き有効です。また、bucket-owner-full-control ACL を使用してバケットにアップロードされたオブジェクトだけが、バケット所有者によって所有されます。既存のバケットで bucket owner enforced 設定を有効にする場合は、いつでも無効にできることに注意してください。(既存のバケットでバケット bucket owner enforced 設定を無効にすると、以前に適用されていたバケットとオブジェクト ACL が再度有効になります。)

バケット所有者は、IAM およびバケットポリシーを介してアクセス許可を管理すると同時に、新規および既存のバケットに bucket owner enforced 設定を使用することをお勧めします。

重要:既存のバケットの ACL を無効にする前に、潜在的な影響を評価してください。1 つのオブジェクトまたはバケットに複数の ACL がある場合は、バケットと IAM ポリシーを確認して更新し、必要なアクセス許可を付与します。

解決方法

バケットの ACL を無効にし、バケット内のすべてのオブジェクトの所有権を取得するには、次のコマンドを実行します。

aws s3api put-bucket-ownership-controls --bucket example-bucket --ownership-controls 'Rules=[{ObjectOwnership=BucketOwnerEnforced}]'

バケットで ACL を無効にできない場合は、以下のオプションを使用してバケット内のオブジェクトへのアクセスを許可します。

put または copy 操作中にアクセスを許可する

put または copy 操作中、オブジェクト所有者は、オブジェクトの ACL がバケット所有者にフルコントロールを与えるように指定できます。

入力オペレーションの場合、オブジェクト所有者は、次のコマンドを実行して許可を付与できます。

aws s3api put-object --bucket destination_DOC-EXAMPLE-BUCKET --key dir-1/my_images.tar.bz2 --body my_images.tar.bz2 --acl bucket-owner-full-control

注: AWS Command Line Interface (AWS CLI) のコマンド実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用するようにしてください

単一のオブジェクトのコピーオペレーションの場合、オブジェクト所有者は、以下のコマンドのいずれかを実行して許可を付与できます。

aws s3api copy-object --bucket destination_DOC-EXAMPLE-BUCKET --key source_DOC-EXAMPLE-BUCKET/myobject --acl bucket-owner-full-control

- または -

aws s3 cp s3://source_DOC-EXAMPLE-BUCKET/myobject s3://destination_DOC-EXAMPLE-BUCKET/ --acl bucket-owner-full-control

複数のオブジェクトのコピーオペレーションの場合、オブジェクト所有者は、以下のコマンドを実行して許可を付与できます。

aws s3 cp s3://source_DOC-EXAMPLE-BUCKET/ s3://destination_DOC-EXAMPLE-BUCKET/ --acl bucket-owner-full-control --recursive

オブジェクトがバケットに追加された後にアクセスを許可する

オブジェクトがすでに別のアカウントのバケットに入っている場合、オブジェクト所有者は put-object-acl コマンドでバケット所有者にアクセス権を付与できます。

aws s3api put-object-acl --bucket destination_DOC-EXAMPLE-BUCKET --key keyname --acl bucket-owner-full-control

オブジェクトがバケット所有者にフルコントロールを付与することを要求する

バケットポリシーを使用して、別のアカウントによってバケットにアップロードされたすべてのオブジェクトで、ACL を「bucket-owner-full-control」に設定するよう指定することができます。例については、「他の AWS アカウントが私の S3 バケットにオブジェクトをアップロードするときに、それらのアカウントがオブジェクトの所有権を私に付与することを義務付けるにはどうすればよいですか?」を参照してください。