条件によってブロックを出し分ける

Terraformのdynamicブロックを使うと条件によってブロックを出し分けできる。

例えば環境がproductionの場合はaws_instancemetadata_optionsを設定する場合を考える。

var.envproductionのときは以下のようにmetadata_optionsを設定し、それ以外の値のときは設定しないようにしたい。

resource "aws_instance" "example" {
  ...
  # var.envがproductionのときのみ以下のmetadata_optionsを設定したい
  metadata_options {
    http_endpoint = "enabled"
    http_tokens   = "required"
  }
}

上記のようにmetadata_optionsを設定するかしないかの条件分岐をdynamicブロックで実現できる。

resource "aws_instance" "example" {
  ...
  dynamic "metadata_options" {
    for_each = var.env == "production" ? [true] : []
    content {
      http_endpoint = "enabled"
      http_tokens   = "required"
    }
  }
}

dynamicブロックで条件によって分岐するパターン

dynamicブロックで条件によって分岐するパターンは以下の通り。

ブロック名 {
  ブロックの中身
}

というブロックを条件によって出し分けるには以下のパターンを記述する。

dynamic "ブロック名" {
  for_each = 条件式 ? [true] : []
  content {
    ブロックの中身
  }
}

dynamicブロックはfor_eachに与えたリストの要素数分だけブロックを出力する。
そのため条件を満たす場合は長さ1のリストをfor_eachに与え、条件を満たさない場合は空のリストをfor_eachに与える。
長さ0のリストをfor_eachに与えるとブロックは出力されない。

[true]は長さ1のリストであれば何でも良いので、[1][""]などでも良い。