Let's write β

プログラミング中にできたことか、思ったこととか

Terraformでbool型変数でブロック型属性の有無を制御する

背景

TerraformでAWS CodePipelineを組んでいる時に、社内環境等とプロダクションで承認ステップをはさむか挟まないかをtrue, falseのフラグで制御したかった。 そのために、stageブロックの有無を変数によって制御したかったが、情報がすぐに見つけられなかったのでここにメモとして残しておきます。 そのためには、ブロック単位で出し入れする必要があったため、boolの変数とdynamicブロックで実現した

環境

  • Terraform: v1.0.1

やりたかった事

AWS CodePipelineをterraformで定義していくと以下のようなstepの定義が必要になる

resource "aws_codepipeline" "default" {
  // .... other stages
  stage {
      name = "Confirmation"
      action {
        name     = "confirmation"
        category = "Approval"
        owner    = "AWS"
        provider = "Manual"
        version  = "1"
      }
  }

  // ... rest stages
}

この承認ステージを、confirmation_required というboolの変数で承認ステージを作るか作らないかを制御したい。

やった事

dynamicブロック機能を利用して、 以下のようにフラグがtrueの時はブロックを1つ作成し、そうでない時はブロックを生成しないようにした

variable "confirmation_required" {
  type        = bool
  default     = true
  description = "デプロイに承認を挟むかどうか"
}

resource "aws_codepipeline" "default" {
  // ... rest stages
  dynamic "stage" {
    for_each = var.confirmation_required ? [1] : []
    content {
      name = "Confirmation"
      action {
        name     = "confirmation"
        category = "Approval"
        owner    = "AWS"
        provider = "Manual"
        version  = "1"
      }
    }
  }
}

dynamicブロックでは、for_each というプロパティーに渡ってきたlistの内容それぞれにたいして、 contentを内容としたブロックをdynamicキーワードの隣に指定した名前の属性として生成する事ができます。

そのため、フラグがtrueの時には、for_eachには [1] という、とりあえず要素が一つはいった配列をわたし、falseの時には空配列を渡します。 あとは、当初指定したかったブロックのなかみ をcontentに指定しておきます。

このようにする事で、変数のtrue, falseによってブロックが1つ生成されるか、一つも生成されないかを切りかえられるので、ブロックの有無を制御する事ができるようになります。