⚙️

【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 を利用します

https://zenn.dev/kuuki/articles/aws-cloudfront-default-directory-index/

設定してみる

では、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です!!

筆者の場合は、↓ のように表示できました!!!

参考文献

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/CloudFront_distribution

Discussion