Amazon S3 バケットにアップロードされたウェブサイトのコンテンツを、別の AWS アカウントからロードできないのはなぜですか?

最終更新日: 2021 年 1 月 27 日

自分のウェブサイトのコンテンツを保存するために、Amazon Simple Storage Service (Amazon S3) バケットを使用しています。別の AWS アカウントのユーザーが、ウェブサイトのオブジェクトを私のバケットにアップロードしました。私のバケットポリシーは正しいのですが、オブジェクトがウェブサイトに取り込まれません。どうすれば解決できますか?

簡単な説明

別の AWS アカウントがオブジェクトをお客様のバケットにアップロードする場合、お客様は、デフォルトではそのオブジェクトを所有しません。その結果、オブジェクトを読み取ることができない場合があります。アップロード元のアカウントは、オブジェクトへのアクセス許可を (バケット所有者である) お客様に明示的に付与しなければなりません。

さらに、バケットポリシーは他のアカウントが所有するバケット内のオブジェクトには適用されません。このため、ウェブサイトのユーザーに読み取りアクセスを許可するバケットポリシーが、他のアカウントによってアップロードされたオブジェクトに自動的に適用されません。

読み込みの問題を解決するには、次のいずれかの方法で、オブジェクトのアクセスコントロールリスト (ACL) を変更します。

  • オブジェクト所有者は、オブジェクトにパブリック読み取りアクセスを付与します。
  • オブジェクト所有者は、バケット所有者にオブジェクトのフルコントロールを付与します。

他のアカウントへバケットアクセスを許可するときは、次の点に注意してください。

  • 別のアカウントによってバケットにアップロードされたオブジェクトは、デフォルトではバケットのアカウントから読み取ることはできません。オブジェクトをアップロードしたアカウントは、読み取りアクセス許可を付与するため、ACL を明示的に更新する必要があります。
  • 別のアカウントによってバケットにアップロードされたオブジェクトは、バケットポリシーで定義されているアクセス許可を自動的に継承しません。バケットポリシーを適用するには、バケットの所有者がオブジェクトの所有権を取得する必要があります。
  • 別のアカウントにバケットへのアクセスを許可する場合は、バケットポリシーを使用するのがベストプラクティスです。バケットポリシーは、アクセス許可を管理するための、より一元的かつ包括的な方法です。
  • 別のアカウントがお客様のバケットへのオブジェクトをアップロードすることを許可する場合は、AWS Identity and Access Management (IAM) ロールを作成します。IAM ロールは、お客様の AWS アカウントから作成し、別の AWS アカウントがロールを引き受けることができるように設定する必要があります。この IAM ロールはご自身のアカウントに属しているので、このロールを使用して他のアカウントがオブジェクトをアップロードすれば、お客様のアカウントはオブジェクトの所有権を持つことができます。IAM ロールを使用したクロスアカウントの設定例については、「バケット所有者が自分が所有しないオブジェクトへのクロスアカウントアクセス許可を付与」をご参照ください。

解決方法

オブジェクト所有者が、オブジェクトにパブリック読み取りアクセスを付与する

オブジェクトをアップロードしたアカウントは、この AWS コマンドラインインターフェイス (AWS CLI) コマンドを実行することによって、オブジェクトにパブリック読み取りアクセスを付与できます。

aws s3api put-object-acl --bucket docexamplebucket --key example.jpg --acl public read

--bucket の値には、ウェブサイトのコンテンツを保存するバケットの名前を入力してください。

注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

オブジェクトへのトラフィックを制限するために、バケット所有者は、特定の IP アドレスまたは VPC からのリクエストのみを許可するバケットポリシーを使用できます。

例えば、このバケットポリシーは、リクエストが「aws:SourceIp」としてリストされている IP アドレスからのものでない限り、docexamplebucket 内のオブジェクトへのアクセスを拒否します。あるいは、リクエストは、「aws:sourceVpc」として指定された VPC からのものである必要があります。

{
    "Version": "2012-10-17",
    "Id": "Policy1415115909152",
    "Statement": [
        {
            "Sid": "Deny-Access-Except-For-Trusted-IPs-and-VPC",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::docexamplebucket/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "1.1.1.1/32",
                        "2.2.2.2/32",
                        "3.3.3.3/32"
                    ]
                },
                "StringNotEquals": {
                    "aws:sourceVpc": "vpc-12345abc"
                }
            }
        }
    ]
}

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

オブジェクトの所有者は、送信先バケットで S3 のオブジェクトの所有権を有効にすることで、バケット所有者にオブジェクトのフルコントロールを自動的に付与できます。この機能は、オブジェクト所有者がオブジェクトをアップロードするときにバケット所有者にコントロールを付与し、bucket-owner-full-control の既定の ACL を含めます。

バケット所有者が S3 のオブジェクトの所有権を「バケット所有者優先」に設定した後、バケット所有者は別のバケットポリシーを追加できます。この追加のバケットポリシーでは、すべての Amazon S3 PUT オペレーションに対して、bucket-owner-full-control の既定の ACL を含めることを求める必要があります。この ACL は、バケット所有者に新しいオブジェクトのフルコントロールを付与します。詳細については、「S3 のオブジェクトの所有権を使用してアップロードされたオブジェクトの所有権の管理」をご参照ください。

バケット所有者にオブジェクトのフルコントロールを付与するには、オブジェクトをアップロードするときに次の 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