LoginSignup
1
0

More than 1 year has passed since last update.

[Terraform] CloudFront のテンプレートをモジュール化するにあたって、ダイナミックにACMをセットできるようにする

Posted at

Terraform で CloudFront のテンプレートをモジュール化したいとき、ACMつけるときと付けない時の viewer_certificate{} の中身を変えないといけないので、モジュール化できなくて枕を濡らしたことはありませんか?

ACM無し
viewer_certificate{
  cloudfront_default_certificate = true
}
ACM有り
viewer_certificate{
  acm_certificate_arn      = aws_acm_certificate.cert.arn
  ssl_support_method       = "sni-only"
  minimum_protocol_version = "TLSv1.2_2021"
  cloudfront_default_certificate = false
}

そんな時は dynamic ブロックを使えばいいんです。
dynamic ブロックは、配列の中身の分だけ動的に設定してくれるので default_cert を使う場合と、ACM を使う場合用の dynamic ブロックを用意しておく感じです。

こんな感じ

variables "acm_arn" { default = "" }
variables "aliases" {
  type = list
  default = []
}

locals {
  aliases          = var.acm_arn == "" ? [] : var.aliases
  use_default_cert = var.acm_arn == "" ? [true] : []
  use_custom_cert  = var.acm_arn == "" ? [] : [var.acm_arn]
}

resource "aws_cloudfront_distribution" "site" {
  enabled             = true
  aliases             = local.aliases
  price_class         = "PriceClass_All"
  http_version        = "http2and3"

  # CloudFront のデフォルト証明書を使用する場合
  dynamic "viewer_certificate" {
    for_each = local.use_default_cert
    content {
      cloudfront_default_certificate = viewer_certificate.value
    }
  }
  # ACM を使用する場合
  dynamic "viewer_certificate" {
    for_each = local.use_custom_cert
    content {
      acm_certificate_arn      = viewer_certificate.value
      ssl_support_method       = "sni-only"
      minimum_protocol_version = "TLSv1.2_2022"
      cloudfront_default_certificate = false
    }
  }

  # :
}

var.acm_arn に何もセットされていない場合、以下のようになります。

  • local.use_default_cert[ true ]
  • local.use_custom_cert[]

なので、1つ目の dynamic "viewer_certificate" {} ブロックしか実行されません。

var.acm_arn に何かがセットされている場合、以下のようになります。

  • local.use_default_cert[]
  • local.use_custom_cert[var.acm_arn]

なので、2つ目の dynamic "viewer_certificate" {} ブロックしか実行されません。

これで、モジュール化しても安心ですね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0