Amazon S3 静的ウェブサイトのホスティングエンドポイントを使用すると、Access Denied エラーが発生した理由を知りたいです。
Amazon Simple Storage Service (Amazon S3) バケットを使用して、S3 静的ウェブサイトのホスティングエンドポイントで静的ウェブサイトをホストしました。S3 静的ウェブサイトのホスティングエンドポイントから返された Access Denied エラーをトラブルシューティングしたいです。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
バケット内のオブジェクトはパブリックアクセス可能である必要があります
S3 静的ウェブサイトのエンドポイントは、パブリックアクセス可能なコンテンツのみをサポートします。S3 バケット内のオブジェクトがパブリックにアクセス可能かどうかを確認するには、ウェブブラウザでオブジェクトの URL を開きます。または、その URL に curl コマンドを実行しても確認できます。
S3 オブジェクトの URL は、次のような形式です。
http://doc-example-bucket.s3-website-us-east-1.amazonaws.com/index.html
ウェブブラウザまたは curl コマンドで Access Denied エラーが返される場合、そのオブジェクトにはパブリックアクセスできません。この問題を解決するには、バケット内のすべてのオブジェクトにパブリック読み取りアクセスを許可するバケットポリシーを作成します。
S3 バケットポリシーが s3:GetObject アクションへのアクセスを許可している必要があります
バケットポリシーに、s3:GetObject アクションに対する読み取りパブリックアクセスをブロックする Deny ステートメントが含まれているかどうかを確認します。バケットポリシーに s3:GetObject に対する明示的な Allow ステートメントがある場合も、明示的な deny ステートメントは常に、明示的な allow ステートメントよりも優先されます。
バケットポリシーを確認するには、次の手順を実行します。
- Amazon S3 コンソールを開き、該当するバケットを選択します。
- [アクセス許可] タブを選択します。
- バケットポリシーで、"Action": "s3:GetObject" または "Action": "s3:*" を含むステートメントを確認します。
- ステートメントが s3:GetObject への読み取りパブリックアクセスをブロックしている場合は、バケットポリシーを変更します。
バケットの所有者である AWS アカウントは、オブジェクトの所有者でもある必要があります
オブジェクトへのパブリック読み取りアクセスを許可するには、バケットの所有者である AWS アカウントがオブジェクトの所有者でもある必要があります。バケットまたはオブジェクトを作成した AWS Identity and Access Management (IAM) アカウントが、そのバケットまたはオブジェクトの所有者になります。
注: S3 Object Ownership は、オブジェクトのアクセスコントロールリスト (ACL) が付与する読み取りパブリックアクセスには適用されません。
Amazon S3 コンソールでバケットとオブジェクトの所有者を確認することもできます。所有者は、バケットまたはオブジェクトの [アクセス許可] タブで確認できます。
AWS CLI を使用して、同じアカウントが Amazon S3 バケットとオブジェクトを所有しているかどうかを確認するには、次の手順を実行します。
-
バケット所有者の S3 正規 ID を取得するには、list-buckets コマンドを実行します。
aws s3api list-buckets --query Owner.ID
-
オブジェクト所有者の S3 正規 ID を取得するには、list-objects コマンドを実行します。
aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html
注: 上記のコマンドでは、単一のオブジェクトを返します。複数のオブジェクトを確認するには、list コマンドを実行します。
-
バケットとオブジェクトの所有者の正規 ID が一致していない場合は、オブジェクトの所有者をバケットの所有者に変更します。オブジェクト所有者のアカウントから get-object-acl コマンドを実行し、オブジェクトに割り当てられている ACL のアクセス許可を取得します。
aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
-
オブジェクトに ACL アクセス許可 bucket-owner-full-control がない場合は、オブジェクト所有者のアカウントから put-object-acl コマンドを実行します。
aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control
-
オブジェクトに ACL アクセス許可 bucket-owner-full-control がある場合は、バケット所有者のアカウントから次のコマンドを実行します。
aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html --storage-class STANDARD
注: 上記のコマンドは、オブジェクトをそれ自体に上書きコピーすることで、オブジェクトの所有者を変更します。
匿名ユーザーまたは他のアカウントがアップロードしたオブジェクトの所有権を、S3 Object Ownership を使用して自動的にバケット所有者に付与することもできます。
オブジェクトに AWS KMS 暗号化を使用することはできません
AWS Key Management Service (AWS KMS) は、匿名リクエストをサポートしていません。したがって、匿名アクセスまたはパブリックアクセスを許可している Amazon S3 バケットは、AWS KMS で暗号化されたオブジェクトには適用されません。オブジェクトから AWS KMS 暗号化を削除するには、Amazon S3 静的ウェブサイトのエンドポイントを使用する必要があります。
注: AWS KMS 暗号化ではなく、Amazon S3 マネージドキーによるサーバー側の暗号化を使用してオブジェクトを暗号化します。
Amazon S3 コンソールを使用すると、オブジェクトに KMS 暗号化が使われているかどうかを確認できます。[オブジェクトの概要] ページの [暗号化] ダイアログボックスで、AWS-KMS が選択されているかどうかを確認します。AWS CLI コマンド head-object を実行しても確認できます。コマンドで server-side encryption の戻り値が aws:kms である場合は、オブジェクトは AWS KMS で暗号化されています。
Amazon S3 コンソールを使用してオブジェクトの暗号化設定を変更する方法については、「Amazon S3 マネージドキー (SSE-S3) を使用してサーバー側の暗号化を指定する」を参照してください。
AWS CLI を使用してオブジェクトの暗号化設定を変更するために、そのオブジェクトのバケットにデフォルトの暗号化が設定されていないことを確認します。バケットにデフォルトの暗号化が設定されていない場合は、次のコマンドを実行することで、オブジェクトをそれ自体で上書きコピーし、オブジェクトの暗号化を解除します。
aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html --storage-class STANDARD --sse AES256
警告: オブジェクトを自体に上書きコピーすると、Amazon S3 により、storage-class と website-redirect-location の設定が削除されます。これらの設定を新しいオブジェクトでも維持するには、コピーリクエストで storage-class または website-redirect-location の値を明示的に指定します。
バケットでバージョニングが有効な場合、暗号化を変更すると、デフォルトの暗号化によってオブジェクトの新しいバージョンが作成されます。
リクエストされたオブジェクトは S3 バケットに配置されている必要があります
リクエストを実行するユーザーに s3:ListBucket アクセス許可がない場合、そのユーザーに対し、オブジェクトが欠けていることを示す Access Denied エラーが発生します。
オブジェクトがバケット内にあるかどうかを確認するには、AWS CLI コマンド head-object を実行します。
注: Amazon S3 オブジェクト名では、大文字と小文字が区別されます。リクエストに有効なオブジェクト名がない場合、Amazon S3 はオブジェクトが欠けていることを報告します。
バケット内にオブジェクトがある場合は、Access Denied エラーによって 404 Not Found エラーがマスキングされることはありません。Access Denied エラーを解決するには、他の設定要件を確認します。
オブジェクトがバケット内にない場合は、Access Denied エラーによって 404 Not Found エラーがマスキングされます。欠けているオブジェクトに関連する問題を解決します。
注: セキュリティ上の理由で、s3:ListBucket のパブリックアクセスは有効にしないことをおすすめします。s3:ListBucket のパブリックアクセスにより、ユーザーはバケット内のすべてのオブジェクトを閲覧したり、一覧表示したりすることができます。このアクセス許可により、ユーザーにオブジェクトのダウンロード許可がない場合も、キーやサイズなどのメタデータの詳細が公開されます。
バケットの Amazon S3 パブリックアクセスブロックを無効にする
Amazon S3 パブリックアクセスブロックは、パブリック読み取りアクセスを許可するアクセス権限を上書きできます。Amazon S3 パブリックアクセスブロック設定を S3 バケットまたはアカウントに設定していないことを確認します。
関連情報
Application Load Balancer、S3、AWS PrivateLink を使用して内部の HTTPS 静的ウェブサイトをホストする
関連するコンテンツ
- 質問済み 5年前lg...
- 質問済み 7年前lg...
- AWS公式更新しました 3ヶ月前