Amazon CloudFront でオリジンを Amazon S3 にするときのパラメータに注意

こんにちは、広野です。

先日、Amazon CloudFront と Amazon S3 を連携するときに OAI (Origin Access Identity) という設定を仕込んだのですが、それがうまく機能しないことがありました。

調べた結果、Amazon CloudFront の設定パラメータの中で私が今まで気付いていなかった AWS の推奨事項がありましたので紹介します。

現在は、OAI ではなく OAC (Origin Access Control) の使用が推奨となっています。本記事の OAI は OAC に読み替えて頂けましたら幸いです。2022.10.29
Amazon CloudFront オリジンアクセスコントロール(OAC)のご紹介 | Amazon Web Services
本記事は、「Amazon CloudFront introduces Origin Access Contro

OAI について

前提として、OAI について少し説明します。

Amazon S3 バケットに配置した静的 WEB コンテンツを Amazon CloudFront 経由で配信するときに、指定した Amazon CloudFront distribution からのみ Amazon S3 にアクセスできるようにします。Amazon CloudFront には OAI という ID を持たせ、Amazon S3 バケットポリシーにその OAI からのアクセスであれば許可するよう設定します。

このとき、Amazon S3 の設定により Amazon CloudFront からの通信が暗号化されるか (HTTPS/HTTP) が変わります。

  • 標準的な S3 バケット:HTTPS (REST API を使用しているらしい)
  • 静的ウェブサイトホスティングを設定した S3 バケット:HTTP

普通に考えれば、HTTPS の方が安全だよね、という理由から標準的な S3 バケットとの組み合わせ構成を選択することが多いと想像します。本記事はその構成に関する話になります。

ハマったところ

Amazon CloudFront が参照する Amazon S3 バケットのことをオリジンと言います。Amazon CloudFront にオリジンを設定するマネジメントコンソール画面は、以下のようになっています。

モザイク箇所はバケット名です。マネジメントコンソールでは、既存の Amazon S3 バケットを自動的に表示、選択できるようにしてくれています。フォーマットは以下です。

bucket-name.s3.amazonaws.com

長年、この設定の仕方でオリジンの設定に問題はなかったのですが、先日 Access Denied エラーにハマりました。

設定間違ってないよな・・・?と過去につくった他の環境も見比べながら原因を探しても違いは見つからず、AWS 公式ドキュメントを読んだところ推奨設定がガイドされていました。

CloudFront ディストリビューションでのさまざまなオリジンの使用 - Amazon CloudFront
Amazon S3 バケット、Elastic Load Balancing ロードバランサー、MediaStore コンテナ、MediaPackage チャネル、Amazon EC2 インスタンスなど、Amazon CloudFront では、さまざまなオリジンを使用できます。

ドキュメントによると、オリジンを設定するときは以下のように Amazon S3 バケットを設定するようです。

  • 標準的な S3 バケット
    bucket-name.s3.region.amazonaws.com
  • 静的ウェブサイトホスティングを設定した S3 バケット
    http://bucket-name.s3-website-region.amazonaws.com

本記事では標準的な S3 バケットを使用しているので、従来のフォーマットにリージョン名を入れなければならなかったようです。

実際、マネジメントコンソールから選んだままのフォーマットで設定すると、Access Denied エラーの際に「静的ウェブサイトホスティングの URL にアクセスできない」旨のエラーが出ました。どうも静的ウェブサイトホスティングの URL にアクセスを試みたようです。静的ウェブサイトホスティングを有効にしていなかったので、エラーが出るのは当然です。

これまでリージョン名なし設定でも正常に動いていたのは不思議ですが、今後は AWS 公式ドキュメント通りにした方が安全でしょう。

以下のような Access Denied エラーのトラブルシューティング記事も見つけました。オリジンの設定の仕方にも言及していました。

S3 REST API エンドポイントがある CloudFront ディストリビューションで発生する Access Denied エラーを解決する | AWS re:Post
Amazon CloudFront ディストリビューションのオリジンとして Amazon Simple Storage Service (Amazon S3) バケットを使用しています。オリジンドメイン名として S3 REST API エンドポイントを使用しています。CloudFront が Amazon S3 から ...

まとめ

いかがでしたでしょうか?

私は自分の設定が合っていると過信していただけにエラー解決に時間を要してしまいました。

本記事が皆様のお役に立てれば幸いです。

著者について
広野 祐司

AWS サーバーレスアーキテクチャを駆使して社内クラウド人材育成アプリとコンテンツづくりに勤しんでいます。React で SPA を書き始めたら快適すぎて、他の言語には戻れなくなりました。サーバーレス & React 仲間を増やしたいです。AWSは好きですが、それよりもAWSすげー!って気持ちの方が強いです。
取得資格:AWS 認定は12資格、ITサービスマネージャ、ITIL v3 Expert 等
2020 - 2023 Japan AWS Top Engineer 受賞
2022 - 2023 Japan AWS Ambassador 受賞
2023 当社初代フルスタックエンジニア認定
好きなAWSサービス:AWS Amplify / AWS AppSync / Amazon Cognito / AWS Step Functions / AWS CloudFormation

広野 祐司をフォローする
クラウドに強いによるエンジニアブログです。
SCSKは専門性と豊富な実績を活かしたクラウドサービス USiZE(ユーサイズ)を提供しています。
USiZEサービスサイトでは、お客様のDX推進をワンストップで支援するサービスの詳細や導入事例を紹介しています。
AWSクラウド
シェアする
TechHarmony
タイトルとURLをコピーしました