【CloudFront】デフォルトルートオブジェクトを設定する
S3 をオリジンとした CloudFrontを作成しました。
しかし、ディストリビューションのルート URL にアクセスするとエラーを返し、 index.html と打たないとアクセスできません。。。
そこで、デフォルトルートオブジェクトを設定し、ルート URL にアクセスするだけで index.html が表示されるようにします
Terraformを使って設定していきます
・バージョン
$ terraform providers -version
Terraform v1.4.2
on linux_amd64
+ provider registry.terraform.io/hashicorp/aws v4.67.0
デフォルトルートオブジェクトとは?
公式ドキュメントによると、
ユーザーがディストリビューション内のオブジェクトではなくディストリビューションのルート URL をリクエストした場合に特定のオブジェクト (デフォルトのルートオブジェクト) を返すように CloudFront を設定できます。 デフォルトのルートオブジェクトを指定すると、ディストリビューションのコンテンツが公開されなくなります。
要するに、
デフォルトルートオブジェクト = ルート URL アクセス時に表示したいもの
ということです。
ルート URL とは、、、 FQDN(CloudFront だと、ディストリビューションのドメイン名)のこと。<FQDN>/about など、サブディレクトリ(/about の部分)が含まれるものとは異なる。
ディストリビューションのドメインや代替ドメインにアクセスすると、
デフォルトルートオブジェクトが表示されるということです。
また、
「デフォルトのルートオブジェクトを指定すると、ディストリビューションのコンテンツが公開されなくなります。」
とあります。
ルート URL にアクセスしたとき、以下のエラー画面が表示されなくなるということだと思います
サブディレクトリを含む URL にアクセスすると適用されない??
こちらも公式ドキュメントによると、
デフォルトルートオブジェクトを定義しても、ディストリビューションのサブディレクトリに対するエンドユーザーリクエストはデフォルトルートオブジェクトを返しません。例えば、
index.html
がデフォルトルートオブジェクトであり、CloudFront が CloudFront ディストリビューション下のinstall
ディレクトリに対するエンドユーザーリクエストを受け取ったと仮定します。
https://d111111abcdef8.cloudfront.net/install/
index.html
のコピーがinstall
ディレクトリ内にあっても、CloudFront はデフォルトルートオブジェクトを返しません。
デフォルトルートオブジェクトに index.html を設定している場合は、
https://<CloudFront のドメイン>/ ⇒ index.html が表示される
https://<CloudFront のドメイン>/about/ ⇒ index.html は表示されない
ということになります。
サブディレクトリに対しても、
index.html を表示させるには CloudFront Functions を利用します
設定してみる
では、Terraform で設定していきます。
↓ のように、aws_CloudFront_distribution に default_root_object を指定するのみです。
resource "aws_CloudFront_distribution" "main" {
...
default_root_object = "index.html"
...
}
plan , apply していきます
$ terraform plan
$ terraform apply -auto-approve
ダウンタイムはなかったと思います。。。
動作確認
apply が終わったら、
CloudFront のルート URL にアクセスしてみて index.html が表示されれば OKです!!
筆者の場合は、↓ のように表示できました!!!
参考文献
Discussion