例えばこの辺のリソースで、変数によって特定のruleの出し分けをしたい場合。
variableのis_maintenanceがtrueのときだけredirect actionを設定したいとか。
resource "google_compute_security_policy" "policy" {
    name = "my-policy"
  rule {
    action   = "allow"
    priority = "2147483647"
    match {
      versioned_expr = "SRC_IPS_V1"
      config {
        src_ip_ranges = ["*"]
      }
    }
    description = "default rule"
  }
  // is_maintenanceがtrueのときだけ設定したい
  rule {
    action   = "redirect"
    priority = "1000"
		match {
      versioned_expr = "SRC_IPS_V1"
      config {
        src_ip_ranges = ["*"]
      }
    }
    
    redirect_option {
      type = "EXTERNAL_302"
      target = "https://example.com/maintenance"
    }
  }
}
その場合は、dynamic blockの機能を使えば実現できます。
// 省略
  dynamic rule {
    for_each = var.is_maintenance ? [1] : []
    content {
      action   = "redirect"
      priority = "1000"
		  match {
        versioned_expr = "SRC_IPS_V1"
        config {
          src_ip_ranges = ["*"]
        }
      }
    
      redirect_option {
        type = "EXTERNAL_302"
        target = "https://example.com/maintenance"
      }
    }
  }
この場合、is_maintenanceがtrueならruleを作成して、falseならrule丸ごと削ってくれます。
コードの可読性が下がるのでdynamic blockはあまり使わないようにしてましたが、こんな使い方もあったんですね。