count や dynamic + for_each で resource や要素の生成を切り替えたい

備忘録。環境などの条件によって Terraform の resource 生成を切り替えたい。たまに使う。

例) cloudfront functions の resource 生成 & ビヘイビアへの関連付け

resource 自体の生成は count で切り替える。variables にフラグを用意して呼び出し元で切り替えを宣言できるようにする。なるほど。

resource "aws_cloudfront_function" "example" {
  count   = var.enable_function ? 1 : 0
  name    = "example"
  runtime = "cloudfront-js-1.0"
  comment = "example function"
  publish = true
  code    = file("${path.module}/example.js")
}

resource 内の要素の生成は dynamicfor_each で切り替える。

resource "aws_cloudfront_distribution" "distribution" {
  origin {
    ...
  }
  default_cache_behavior {
    ...
    dynamic "function_association" {
      for_each = var.enable_function ? ["1"] : []
      content {
        event_type   = "viewer-request"
        function_arn = aws_cloudfront_function.example[0].arn
      }
    }
  }
}

さらにこう書くと resource の存否で分岐できる。(学び)

resource "aws_cloudfront_distribution" "distribution" {
  origin {
    ...
  }
  default_cache_behavior {
    ...
    dynamic "function_association" {
      for_each = aws_cloudfront_function.example
      content {
        event_type   = "viewer-request"
        function_arn = function_association.value.arn
      }
    }
  }
}

現場からは以上です。