🛡️

TerraformでCloudFront+S3をHTTPS化する

2023/06/20に公開

はじめに

前回はCloudFront+S3の構成を作りましたが、
CloudFrontデフォルトのドメインへHTTPS通信を行っていました。

今回は自身のドメイン・ACMの証明書を使用し、独自ドメインでのHTTPSアクセスを試します。
プロビジョニングはTerraformでおこないます。

環境

terraform 1.4.6

方針

  • ACMで証明書を発行
  • dataで証明書を外部参照(terraform)
  • 代替ドメインの設定をcloudfrontへ追加
  • 証明書の設定をcloudfrontへ追加
  • cloudfrontへのAレコードを追加

の方針で進めます。

前提

  • 以下はTerraformで管理しません。
    • ACMで取得した証明書(dataで外部参照)
    • CloudFrontを指定するAレコード
  • 独自ドメイン取得済み
  • パブリックホストゾーン作成済み

わたしはfreenomで取得したドメインで検証しました。
よろしければ参考にして下さい。
https://zenn.dev/not75743/articles/def25e4eedd456

検証

ACMで証明書を発行

過去ALBのHTTPS化手順の中で証明書を作成したため、
同じように作成します。
https://zenn.dev/not75743/scraps/b0304059dbf27c

1点だけ違いがあり、
cloudfrontの場合米国東部 (バージニア北部) (us-east-1)で発行する必要があります。
気をつけましょう。
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/cnames-and-https-requirements.html

dataで証明書を外部参照(terraform)

こんな感じです

provider "aws" {
  alias  = "virginia"
  region = "us-east-1"
}

data "aws_acm_certificate" "acm" {
  provider = aws.virginia
  domain   = "example.com"
}

証明書についてはドメインを指定してdataで参照すればOKです。
この証明書は先述の通り米国東部 (バージニア北部) (us-east-1)に存在するため、
マルチリージョン対応のためにaliasを使用しました。
ap-northeast-1us-east-1を使い分けるイメージです

こちら参考にさせていただきました。
https://y-ni-shi.hatenablog.com/entry/2023/01/29/221103
https://qiita.com/tos-miyake/items/f0e5f28f2a69e4d39422
https://kazuhira-r.hatenablog.com/entry/2020/10/07/000552

代替ドメインの設定をcloudfrontへ追加

resource "aws_cloudfront_distribution" "hugo_cfront" {
  enabled = true
  aliases = ["${data.aws_acm_certificate.acm.domain}"] # これ

cloudfrontデフォルトのドメイン名を代替して、独自ドメインでアクセス可能にする
のようなイメージです。
この設定をしないとホストゾーンにAレコードを作成する際、cloudfrontディストリビューションが選択肢に出てきません。

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

証明書の設定をcloudfrontへ追加

証明書、プロトコルの指定などをします。

resource "aws_cloudfront_distribution" "hugo_cfront" {
// 略
  viewer_certificate {
    cloudfront_default_certificate = false
    acm_certificate_arn      = data.aws_acm_certificate.acm.arn
    ssl_support_method       = "sni-only"
    minimum_protocol_version = "TLSv1"
  }

cloudfrontへのAレコードを追加

最後にcloudfrontへのAレコードを追加します。
先述の通り、選択肢が出ない場合代替ドメインの設定が出来ていない可能性があります。
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/cnames-and-https-procedures.html

動作確認

terraform plan,applyを行い、ディストリビューションのデプロイが完了したら
独自ドメインでアクセス出来ることを確認します。

終わりに

これで鉄板の構成がTerraformで作成できるようになりました。
これを活かして検証を進めていきたいですね。

Discussion