Amazon Simple Storage Service (Amazon S3) バケットを使用してウェブサイトのコンテンツを保存しています。別の AWS アカウントのユーザーが、ウェブサイトのオブジェクトを私のバケットにアップロードしました。私のバケットポリシーは正しいのですが、オブジェクトがウェブサイトにロードされません。
簡単な説明
バケットでアクセスコントロールリスト (ACL) が有効になっている場合、デフォルトでは、他の AWS アカウントがバケットにアップロードしたオブジェクトを所有することはありません。その結果、オブジェクトを読み取ることができない場合があります。アップロードするアカウントは、あなた、すなわちバケットの所有者にオブジェクトへのアクセス許可を明示的に付与している必要があります。
また、バケットポリシーは、他のアカウントが所有するバケット内のオブジェクトには適用されません。したがって、ウェブサイトのユーザーに読み取りアクセス権を付与するバケットポリシーは、他のアカウントがアップロードするオブジェクトには自動的に適用されません。
この問題を解決するには、以下のいずれかの方法を使用してください。
- S3 バケットの ACL を無効にします (ベストプラクティス)。
- オブジェクト所有者にオブジェクトのパブリック読み取りアクセス権を付与してもらいます。
- オブジェクト所有者にオブジェクトのフルコントロールを付与してもらいます。
解決策
S3 バケットの ACL を無効にする (ベストプラクティス)
Amazon S3 バケットの ACL を無効にするには、バケット所有者が強制するオブジェクト所有権設定を選択します。この設定を適用すると、ACL はオフになり、バケット内のすべてのオブジェクトを自動的に所有して、完全にコントロールできるようになります。クロスアカウントでアップロードされたオブジェクトの場合でも、このオブジェクトの所有権はバケット所有者に帰属します。バケット所有者は、それらのオブジェクトに適用される読み取りアクセス権を付与するバケットポリシーもコントロールします。
前提条件
ACL を非アクティブ化する前に、 「ACL を無効にするための前提条件」を参照してください。
**ACL をオフにする **
- Amazon S3 コンソールを開きます。
- **[バケット] **を選択し、S3 オブジェクト所有権設定を適用するバケットの名前を選択します。
- [アクセス許可] タブを選択します。
- [オブジェクト所有権] ** で [編集]**を選択します。
- [オブジェクト所有権] ** で[バケット所有者強制]**を選択します。
- [保存] を選択します。
使用事例で ACL を無効にできない場合は、以下の代替方法のいずれかを使用してください。
オブジェクト所有者にオブジェクトにパブリック読み取りアクセス権を付与してもらう
**注:**AWS CLI コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用していることを確認してください。
オブジェクトをアップロードしたアカウントは、オブジェクトにパブリック読み取りアクセスを付与できます。これを行うには、次の AWS コマンドラインインターフェイス (AWS CLI) コマンドを実行します。
aws s3api put-object-acl --bucket docexamplebucket --key example.jpg --acl public read
**注:****--bucket ** を、ウェブサイトのコンテンツを保存するバケットの名前に置き換えてください。
オブジェクト所有者にオブジェクトのフルコントロールを付与してもらう
オブジェクト所有者は、バケット所有者に、オブジェクトのフルコントロールを自動的に付与できます。これを行うには、宛先バケットでS3 オブジェクト所有権を有効にします。これにより、オブジェクト所有者がオブジェクトをアップロードするときに、バケット所有者にコントロールが付与されます。これには、bucket-owner-full-control の既定 ACL も含まれます。
バケット所有者が S3 オブジェクト所有権をバケット所有者優先に設定すると、バケット所有者は別のバケットポリシーを追加できます。この追加バケットポリシーでは、すべての Amazon S3 PUT オペレーションにbucket-owner-full-control の既定 ACL を含める必要があります。この ACL は、バケット所有者に、新しいオブジェクトのフルコントロールを付与します。
バケット所有者にオブジェクトのフルコントロールを付与するには、アップロードするアカウントは、オブジェクトのアップロード時に CLI 構文を使用する必要があります。
aws s3api put-object --bucket docexamplebucket --key example.jpg --acl bucket-owner-full-control
これで、バケット所有者はオブジェクトを所有するようになり、オブジェクトはバケットポリシーに設定された権限を継承します。
S3 オブジェクト所有権を有効にする前にアップロードされた既存のオブジェクトの場合、オブジェクト所有者はバケット所有者にオブジェクトに対する権限を付与する必要があります。次に、バケット所有者は、オブジェクト自体をコピーする必要があります。
バケット所有者にオブジェクトのフルコントロールを付与するには、アップロードするアカウントで CLI 構文を使用する必要があります。
aws s3api put-object-acl --bucket docexamplebucket --key example.jpg --acl bucket-owner-full-control
オブジェクトのオブジェクト所有権を継承するには、バケット所有者はオブジェクト自体をコピーする必要があります。
aws s3 cp s3://docexamplebucket/example.jpg s3://docexamplebucket/example.jpg --acl bucket-owner-full-control
これで、バケット所有者はオブジェクトを所有するようになり、オブジェクトはバケットポリシーに設定された権限を継承します。
クロスアカウントアップロードでは、バケット所有者にオブジェクトのフルコントロールを付与することを要求する
別のアカウントからのすべてのアップロード (s3: PutObject) がバケット所有者に完全なオブジェクト制御を付与するように要求するには、次の例のようなバケットポリシーを使用します。
{
"Id": "Policy1541018284691",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "RequireBucketOwnerFullControlOnPuts",
"Principal": {
"AWS": [
"arn:aws:iam::111122223333:user/iam_user"
]
},
"Action": [
"s3:PutObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::docexamplebucket/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
}
]
}
このバケットポリシーでは、他のアカウント (111122223333) のユーザーは、ユーザーがオブジェクトの ACL を指定した場合にのみ、バケットにアップロードできます。オブジェクトの ACL は、バケット所有者にフルコントロールを付与する必要があります。次に、他のアカウントユーザーは、次のコマンドのようにオブジェクトをアップロードする必要があります。
aws s3 cp path/to/local/file s3://docexamplebucket --acl bucket-owner-full-control
関連情報
Amazon S3 がリクエストを承認する方法
アクセスポリシーガイドライン
Web サイトへのアクセス権限の設定
ユーザーポリシーによるバケットへのアクセスの制御