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

最終更新日: 2019 年 6 月 21 日

別の AWS アカウントの AWS Identity and Access Management (IAM) ユーザーがオブジェクトを私の Amazon Simple Storage Service (Amazon S3) バケットにアップロードしました。そのオブジェクトにアクセスしようとすると、403 Access Denied エラーが表示されます。これを解決する方法を教えてください。 

簡単な説明

デフォルトでは、S3 オブジェクトの所有者はそれをアップロードした AWS アカウントです。これは、バケット所有者が他のアカウントである場合にも当てはまります。オブジェクトへのアクセス権を取得するには、オブジェクト所有者が明示的にあなた (バケット所有者) にアクセス権を付与する必要があります。

オブジェクト所有者は、オブジェクトのアクセスコントロールリスト (ACL) を更新することによって、バケット所有者にオブジェクトのフルコントロールを付与できます。オブジェクト所有者は、put 操作または copy 操作中、またはオブジェクトがバケットに追加された後に ACL を更新できます。

解決方法

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

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

put 操作の場合、オブジェクト所有者は次のコマンドを実行できます。 

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

単一オブジェクトの copy 操作の場合、オブジェクト所有者は以下のいずれかのコマンドを実行できます。 

aws s3api copy-object --bucket destination_awsexammplebucket --key source_awsexamplebucket/myobject --acl bucket-owner-full-control

または

aws s3 cp s3://source_awsexamplebucket/myobject s3://destination_awsexamplebucket/ --acl bucket-owner-full-control

複数のオブジェクトの copy 操作の場合、オブジェクト所有者は次のコマンドを実行できます。

aws s3 cp s3://source_awsexamplebucket/ s3://destination_awsexamplebucket/ --acl bucket-owner-full-control --recursive

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

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

aws s3api put-object-acl --bucket destination_awsexamplebucket --key keyname --acl bucket-owner-full-control

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

バケットポリシーを使用して、別のアカウントでバケットにアップロードされたすべてのオブジェクトが ACL を「bucket-owner-full-control」として設定する必要があることを要求できます。たとえば、「他の AWS アカウントがオブジェクトを自分の Amazon S3 バケットにアップロードしたとき、それらのアカウントがオブジェクトの所有権を付与してくれるように要求する方法を教えてください」を参照してください。