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 エラーのトラブルシューティング記事も見つけました。オリジンの設定の仕方にも言及していました。

Amazon S3 REST API エンドポイントを使用している CloudFront ディストリビューションからのアクセス拒否エラーの解決

まとめ

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

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

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

著者について
広野 祐司

AWSサーバーレスアーキテクチャを駆使して社内クラウド人材育成アプリや教育コンテンツをつくっています。ReactでSPAを書き始めたら、快適すぎて他の開発言語には戻れなくなりました。AWSサーバーレスやReactの仲間を増やしたいです。
取得資格:AWS認定は7つ、ITサービスマネージャ、ITIL v3 Expert、等
2020, 2021 APN AWS Top Engineers 受賞
2022 AWS Partner Ambassador 受賞
好きなAWSサービス:AWS Amplify / Amazon Cognito / AWS Step Functions / AWS CloudFormation

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