🌟

【Terraform】指定したドメインでCloudFrontにアクセスできない。。。

2025/01/04に公開

Route53 で CloudFront とドメインを関連付け、ACM を適用しました。

だけど、そのドメインにアクセスしてもうまく表示されなかったので、解決していきます。

※Terraform を使って構築しています

環境

  • WSL で Ubuntsu を使用
  • Terraform v1.4.2

ゴール

https://<用意したドメイン(test.hisui-app.com)>/index.html

にアクセスし、下記が表示されるようにしたい

現状

  • <用意したドメイン(test.hisui-app.com)>/index.htmlA レコードに CloudFront のエイリアスを指定
  • ACM にて、test.hisui-app.com のSSL 証明書を取得済み
  • test.hisui-app.com に HTTPS でアクセスできない。。。
  • CloudFront のオリジンには S3 を設定
  • オリジンのS3 には index.html がアップロードされている
  • <CloudFront のドメイン>/index.htmlにアクセスすると、index.html が表示される
  • <用意したドメイン(test.hisui-app.com)>/index.htmlにアクセスすると 下記のように403 エラーが表示される

原因調査

  • test.hisui-app.com に HTTPS でアクセスできない。。。
  • <CloudFront のドメイン>/index.htmlにアクセスすると、index.html が表示される

上記より、CloudFront - S3 間はうまくいっており、ACM - CloudFront がダメかな

と予想しました。

調べてみると、

CloudFront が HTTPS 通信のみを要求していますが、ACM が適用されておらず HTTP でアクセスしていたこと

が原因みたいです。

要は、CloudFront に ACM を適用できていなかったんですねぇ。。。

下記の AWS 公式ドキュメントを見ても、 HTTP でアクセスすると 403 エラーが返ってくるみたい

https://repost.aws/ja/knowledge-center/CloudFront-troubleshoot-403-errors

対処 ①:CloudFront と ACM を紐づける

CloudFront と ACM を紐づけていきます

こちらを参考に、下記のようにコードを修正してみます

# CloudFrontを定義
resource "aws_CloudFront_distribution" "main" {

  ...

  viewer_certificate {
    acm_certificate_arn = aws_acm_certificate.cert.arn
    ssl_support_method = "sni-only"
    minimum_protocol_version = "TLSv1"
  }
}

# ACM証明書を定義
resource "aws_acm_certificate" "cert" {
  domain_name       = "test.hisui-app.com"
  validation_method = "DNS"

  lifecycle {
    create_before_destroy = true
  }
}

これで terraform applyします

エラー ②:ACM のリージョンがダメ

ん、エラーが出ました。。。

╷
│ Error: updating CloudFront Distribution (********): InvalidViewerCertificate: The specified SSL certificate doesn't exist, isn't in us-east-1 region, isn't valid, or doesn't include a valid certificate chain.
│       status code: 400, request id: ********
│
│   with aws_CloudFront_distribution.main,
│   on CloudFront.tf line 2, in resource "aws_CloudFront_distribution" "main":2: resource "aws_CloudFront_distribution" "main" {
│
╵

DeepL で翻訳してみると

指定されたSSL証明書が存在しない、
us-east-1リージョンにない、有効でない、
または有効な証明書チェーンを含んでいない場合です。

ということらしい。

確かに AWS 公式ドキュメントを見ても

CloudFront に適用する場合にはバージニア北部  (us-east-1) リージョンにないとダメらしい

対処 ②:ACM のリージョンをバージニア北部へ

ACM をバージニア北部 (us-east-1) リージョンに作っていきます

ただ、ほかのリソースは基本 東京(ap-northeast-1)リージョンに作成したいので、

エイリアスを使用していきます。

下記のように provider を指定します。

alias を指定していないほうはデフォルトで使用されます。

# デフォルトではこちらの値が使われる
provider "aws" {
  region  = "ap-northeast-1"
}

# こちらを指定するには
# provider = aws.virginia
# と記述する
provider "aws" {
  alias  = "virginia"
  region = "us-east-1"
}

そして、ACM のみ virginia というエイリアスを設定した provider を指定します。

# ACM証明書を定義
resource "aws_acm_certificate" "cert" {
  domain_name       = local.domain_name
  validation_method = "DNS"
  # バージニア北部リージョンを指定したproviderを使用
  provider = aws.virginia

  lifecycle {
    create_before_destroy = true
  }
}

これで terraform applyします

エラー ③:aws_acm_certificate_validation 修正

╷
│ Error: reading ACM Certificate (arn:aws:acm:us-east-1*******:certificate/**********): couldn't find resource
│
│   with aws_acm_certificate_validation.cert,
│   on acm.tf line 13, in resource "aws_acm_certificate_validation" "cert":13: resource "aws_acm_certificate_validation" "cert" {

ACM が見つからないって言ってますね。。。

対処 ③:aws_acm_certificate_validation 修正

aws_acm_certificate_validation のほうもバージニア北部リージョンにする必要がありました

resource "aws_acm_certificate_validation" "cert" {
  certificate_arn = aws_acm_certificate.cert.arn
  validation_record_fqdns = flatten([ values(aws_route53_record.cert)[*].fqdn ])
  provider = aws.virginia
}

これで terraform applyします

とりあえず通りました!

エラー ④:サポートされていないプロトコルが使用

test.hisui-app.com/index.html にアクセスしてみると、以下のエラーが。

サポートされていないプロトコルが使用されています。」???

対処 ④:エイリアスの設定

CloudFront に対して任意のドメインを使用するには代替ドメインを設定する必要があります。

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

これを Terraform に落とし込みます

resource "aws_CloudFront_distribution" "main" {
  aliases = [ "test.hisui-app.com" ]

  ...

}

これで terraform applyします

動作確認

test.hisui-app.com/index.html にアクセスしてみます

無事、表示されました!!!(HTTPS でアクセスできてます)

参考

https://repost.aws/ja/knowledge-center/CloudFront-troubleshoot-403-errors

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

https://inside.luchegroup.com/entry/2018/09/25/220855

https://qiita.com/tos-miyake/items/f0e5f28f2a69e4d39422

Discussion