こんにちは、広野です。
先日、Amazon CloudFront と Amazon S3 を連携するときに OAI (Origin Access Identity) という設定を仕込んだのですが、それがうまく機能しないことがありました。
調べた結果、Amazon CloudFront の設定パラメータの中で私が今まで気付いていなかった AWS の推奨事項がありましたので紹介します。
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 公式ドキュメントを読んだところ推奨設定がガイドされていました。
ドキュメントによると、オリジンを設定するときは以下のように 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 エラーのトラブルシューティング記事も見つけました。オリジンの設定の仕方にも言及していました。
まとめ
いかがでしたでしょうか?
私は自分の設定が合っていると過信していただけにエラー解決に時間を要してしまいました。
本記事が皆様のお役に立てれば幸いです。