CloudFront と S3 を組み合わせて静的ウェブサイトを公開する構成は、信頼性と高速性に優れており、多くのエンジニアに採用されています。
しかし、ブラウザでアクセスした際に以下のようなエラーが表示され、うまく公開できないというトラブルがよく発生します。
1 2 3 4 |
<Error> <Code>AccessDenied</Code> <Message>Access Denied</Message> </Error> |
この「AccessDenied」エラーは、S3バケットのアクセス許可に問題がある場合に発生します。
本記事では、その原因と対策方法を具体的に解説し、設定例も交えて、同じトラブルに悩むエンジニアの助けとなる情報を提供します。
よくある原因
CloudFrontからS3へのアクセス権限が適切に設定されていない
CloudFrontはデフォルトではS3バケットにアクセスできません。
アクセスを許可するには、S3のバケットポリシーを適切に設定する必要があります。
特に近年では、オリジンアクセスコントロール(OAC)を利用して、署名付きリクエストを経由する構成が推奨されています。
この場合、S3側ではサービスプリンシパル cloudfront.amazonaws.com
を許可し、CloudFrontディストリビューションのARNを指定する必要があります。
バケットポリシーの設定例(OAC利用時)
以下は、CloudFrontがS3バケット内のオブジェクトを取得するためのバケットポリシーの例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCloudFrontAccess", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::バケット名/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::アカウントID:distribution/ディストリビューションID" } } } ] } |
ここで重要なのは、リソース(Resource)と条件(Condition)に指定するARNが正確であることです。
特に AWS:SourceArn
に指定するCloudFrontディストリビューションのARNは、AWSコンソールから正しく取得してください。
確認すべきその他のポイント
S3のパブリックアクセス設定
S3バケットに対してパブリックアクセスを完全にブロックしておくのが推奨される構成です。
バケットの設定画面で以下の項目がすべて有効になっていることを確認してください。
- 新しいアクセス許可をブロック
- 既存のパブリックバケットポリシーをブロック
この状態でCloudFront経由でのみアクセスを許可するようにすることで、セキュリティを保ちながら配信が可能になります。
CloudFrontオリジンの設定
CloudFrontのオリジンには、S3バケットの通常のエンドポイント(バケット名.s3.amazonaws.com
)を使用します。
ウェブサイトホスティング用のエンドポイント(s3-website-
で始まるもの)は使用しないようにしましょう。
CloudFrontのキャッシュ無効化
設定を変更しても、CloudFrontが過去の状態をキャッシュしていることがあります。
キャッシュをクリアするには、CloudFrontの管理画面から「キャッシュ削除」を実行してください。
エラーを解決するための確認リスト
- バケットポリシーに
cloudfront.amazonaws.com
を明示し、SourceArn も正しく設定しているか? - S3のパブリックアクセスブロックが有効になっているか?
- CloudFrontオリジン設定が
s3.amazonaws.com
形式になっているか? - キャッシュの無効化を実行しているか?
- CloudFrontのログまたはS3のアクセスログでリクエストの状況を確認できているか?
トラブル対応の実装例
以下は、CloudFront経由でS3にあるHTMLファイルを配信する前提での手順例です。
CloudFrontのオリジンをS3バケットに設定(署名付きURLを有効)
オリジンタイプ: S3 バケット
署名付きURLまたは署名付きCookie: 使用する
オリジンアクセスコントロール: 作成済みOACを指定
バケットポリシーを設定(上述のJSON形式)
CloudFrontディストリビューションのARNを正しく設定し、バケットへの s3:GetObject
アクションを許可します。
ブラウザで確認する前にキャッシュをクリア
CloudFrontの管理画面で以下を実行。
キャッシュ削除 > キャッシュ削除を作成
対象パス: /*
まとめ
CloudFront と S3 を組み合わせた構成で「AccessDenied」エラーが発生する場合、ほとんどはバケットポリシーの設定ミスまたはCloudFront側の設定不足によるものです。
とくに、オリジンアクセスコントロール(OAC)を利用する構成では、cloudfront.amazonaws.com
を明示し、正しい ARN を指定することが非常に重要です。
セキュリティと機能性を両立した静的サイト公開の構成は基礎中の基礎です。
本記事がトラブル解決の一助となれば幸いです。
問題が再発しないよう、設定の記録や手順の標準化も併せて行うことを強くおすすめします。
コメント