私は 新しい条件 inTerraform v0.11を使用して、基本的に設定ブロックをオンまたはオフにすることを検討しています環境。
たとえば、生産のためにオンにする変数がある場合、条件にしたいブロックを次に示します。
access_logs {
bucket = "my-bucket"
prefix = "${var.environment_name}-alb"
}
環境条件をチェックするためのロジックは持っていると思いますが、上記の構成をロジックに組み込む方法がわかりません。
"${var.environment_name == "production" ? 1 : 0 }"
access_logs
変数を介してenvironment_name
ブロックをオンまたはオフにできますか?これが不可能な場合、回避策はありますか?
現在のテラフォームでは、if
ステートメントは単なる値であり、ブロックには使用できません。
この場合、回避策があります。 access_log
ブロックのenabled
属性をfalse
に設定できます。これは一般的なソリューションではありませんが、access_log
ブロックでのみ使用できることに注意してください。
access_logs {
bucket = "my-bucket"
prefix = "${var.environment_name}-alb"
enabled = "${var.environment_name == "production" ? true : false }"
}
こちらもご覧ください:
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ブロックが作成されます。
コメントに収めるには多すぎるので、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
現在、terraformの条件は、値を決定するためにのみ使用されており、ブロックをラップするif
ステートメントとしては使用されていません。
また、条件を使用して、いくつかのロジックに基づいて値を決定することもできます。
https://www.terraform.io/docs/configuration/interpolation.html#conditionals