web-dev-qa-db-ja.com

環境に基づいたTerraform条件ブロック

私は 新しい条件 inTerraform v0.11を使用して、基本的に設定ブロックをオンまたはオフにすることを検討しています環境。

たとえば、生産のためにオンにする変数がある場合、条件にしたいブロックを次に示します。

access_logs {
    bucket = "my-bucket"
    prefix = "${var.environment_name}-alb"
}

環境条件をチェックするためのロジックは持っていると思いますが、上記の構成をロジックに組み込む方法がわかりません。

"${var.environment_name == "production" ? 1 : 0 }"

access_logs変数を介してenvironment_nameブロックをオンまたはオフにできますか?これが不可能な場合、回避策はありますか?

19
jmreicha

現在のテラフォームでは、ifステートメントは単なる値であり、ブロックには使用できません。

この場合、回避策があります。 access_logブロックのenabled属性をfalseに設定できます。これは一般的なソリューションではありませんが、access_logブロックでのみ使用できることに注意してください。

access_logs {
    bucket  = "my-bucket"
    prefix  = "${var.environment_name}-alb"
    enabled = "${var.environment_name == "production" ? true : false }"
}

こちらもご覧ください:

14
minamijoyo

TF 0.12以降でこれを達成する1つの方法は、動的ブロックを使用することです。

dynamic "access_logs" {
  for_each = var.environment_name == "production" ? [var.environment_name] : [] 
  bucket  = "my-bucket"
  prefix  = "${var.environment_name}-alb"
}

これにより、var.environment_nameの値に応じて1つまたはゼロのaccess_logsブロックが作成されます。

8
Juho Rutila

コメントに収めるには多すぎるので、Juho Rutilaの答えを拡大する。

これはv0.12のダイナミックブロックを使用して可能ですが、ネストされたcontentブロックにプロパティを含める必要があることがわかりました。 for_eachステートメントも少し扱いに​​くいので、重要なものをより読みやすくするためにそれをローカルに抽出するのが賢明であることがわかりました。

locals {
  isProd = var.environment_name == "production" ? [1] : []

  // Not necessary, but just illustrating that the reverse is possible
  isNotProd = var.environment_name == "production" ? [] : [1]
}

dynamic "access_logs" {
  for_each = local.isProd
  content {
    bucket  = "my-bucket"
    prefix  = "${var.environment_name}-alb"
  }
}

動的ブロックの詳細については、こちらをご覧ください: https://www.terraform.io/docs/configuration/expressions.html#dynamic-blocks

5
Little Mike

現在、terraformの条件は、値を決定するためにのみ使用されており、ブロックをラップするifステートメントとしては使用されていません。

また、条件を使用して、いくつかのロジックに基づいて値を決定することもできます。

https://www.terraform.io/docs/configuration/interpolation.html#conditionals

2
ptierno