[小ネタ]TerraformでCloudFrontディストリビューションに代替ドメイン名を設定する際にハマったこと

![001samune.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984127/ab107ca8-25a2-470c-ad83-bb01ac365adc.png)

結論：CloudFrontディストリビューションに代替ドメインを設定するときは、Route 53のDNSレコードも必ず一緒に作成しよう

# 概要
Amazon Route 53 + ACM + Amazon CloudFront + Amazon S3のサーバレスウェブサイトをTerraformで作成していた時にハマったことと解決方法について備忘録として残しておきます。

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3984127/4c39ab5c-68e4-483f-9f70-bb5cfb6efa4f.png)


# ハマったところ
### ディストリビューションの作成が全く終わらない
ディストリビューションのコードは以下の通りで、特段記載内容に問題はなく、紐づける証明書のDNS検証は終わっている状態でした。
```terraform:modules/main.tf
resource "aws_cloudfront_distribution" "distribution" {
  enabled             = true
  wait_for_deployment = true
  default_root_object = "index.html"
  origin {
    origin_id   = "S3CustomOrigin"
    domain_name = var.website_endpoint
    custom_origin_config {
      http_port              = 80
      origin_protocol_policy = "http-only"
      https_port             = 443
      origin_ssl_protocols   = ["TLSv1"]
    }
  }
  default_cache_behavior {
    target_origin_id       = "S3CustomOrigin"
    viewer_protocol_policy = "redirect-to-https"
    allowed_methods        = ["GET", "HEAD"]
    cached_methods         = ["GET", "HEAD"]
    forwarded_values {
      query_string = false
      cookies {
        forward = "none"
      }
    }
  }
  custom_error_response {
    error_caching_min_ttl = 10
    error_code            = 404
    response_code         = 200
    response_page_path    = "/error.html"
  }
  aliases = [var.cloudfront_fqdn]
  viewer_certificate {
    cloudfront_default_certificate = false
    acm_certificate_arn            = var.cloudfront_cert_arn
    ssl_support_method             = "sni-only"
  }
  restrictions {
    geo_restriction {
      restriction_type = "none"
    }
  }
}
```

実際に *terraform deploy* を実行するも、プロンプトにはひたすら作成中の文字が流れ続ける。。。
```terminal
module.cloudfront.aws_cloudfront_distribution.distribution: Still creating... [55m elapsed]
```

# 解決方法
### 代替ドメインのDNSレコードも一緒に作成する
そうですそれだけです。
ディストリビューションに設定した代替ドメインに合わせてDNSレコードも作成すればすんなり作成が完了しました。
```diff_terraform:modules/main.tf
resource "aws_cloudfront_distribution" "distribution" {
  enabled             = true
  wait_for_deployment = true
  default_root_object = "index.html"
  origin {
    origin_id   = "S3CustomOrigin"
    domain_name = var.website_endpoint
    custom_origin_config {
      http_port              = 80
      origin_protocol_policy = "http-only"
      https_port             = 443
      origin_ssl_protocols   = ["TLSv1"]
    }
  }
  default_cache_behavior {
    target_origin_id       = "S3CustomOrigin"
    viewer_protocol_policy = "redirect-to-https"
    allowed_methods        = ["GET", "HEAD"]
    cached_methods         = ["GET", "HEAD"]
    forwarded_values {
      query_string = false
      cookies {
        forward = "none"
      }
    }
  }
  custom_error_response {
    error_caching_min_ttl = 10
    error_code            = 404
    response_code         = 200
    response_page_path    = "/error.html"
  }
  aliases = [var.cloudfront_fqdn]
  viewer_certificate {
    cloudfront_default_certificate = false
    acm_certificate_arn            = var.cloudfront_cert_arn
    ssl_support_method             = "sni-only"
  }
  restrictions {
    geo_restriction {
      restriction_type = "none"
    }
  }
}

+ resource "aws_route53_record" "cloudfront_recordset" {
+   zone_id = var.public_hostzone_id
+   name    = var.cloudfront_fqdn
+   type    = "A"
+   alias {
+     name                   = aws_cloudfront_distribution.distribution.domain_name
+     zone_id                = aws_cloudfront_distribution.distribution.hosted_zone_id
+     evaluate_target_health = true
+   }
+ }
```

:::note warn
ちなみにCloudFormationでは、代替ドメインDNSレコードが無くても問題なくデプロイされました
:::

# まとめ
今回は、CloudFrontディストリビューションに代替ドメインを設定する際にハマったことを備忘録として記事にしました。
ディストリビューションの作成が完了しないケースに、ACMの検証が終わってない状態でディストリビューションに証明書を紐づけて作成しようとするパターンは知っていましたが、今回のようなケースがあるとは思いませんでした。
非常に稀なケースだと思いますが、どなたかの役に立てば幸いです。