Terraform conditional block based on environment

冷暖自知 提交于 2019-12-20 16:54:23

问题


I'm looking at using the new conditionals in Terraform v0.11 to basically turn a config block on or off depending on the evnironment.

Here's the block that I'd like to make into a conditional, if, for example I have a variable to turn on for production.

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

I think I have the logic for checking the environment conditional, but I don't know how to stick the above configuration into the logic.

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

Is it possible to turn the access_logs block on and off via the environment_name variable? If this is not possible, is there a workaround?


回答1:


In the current terraform, the if statement is only a value and can not be used for the block.

There is a workaround in this case. You can set the enabled attribute of the access_log block to false. Note that this is not a general solution but can only be used with the access_log block.

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

See also:

  • https://www.terraform.io/docs/providers/aws/r/elb.html#access_logs
  • https://www.terraform.io/docs/providers/aws/r/alb.html#access_logs
  • https://github.com/hashicorp/terraform/pull/11120



回答2:


One way to achieve this with TF 0.12 onwards is to use dynamic blocks:

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

This will create one or zero access_logs blocks depending on the value of var.environment_name.




回答3:


Expanding on Juho Rutila's answer as it's too much to fit in a comment.

This is possible using dynamic blocks from v0.12, but I found the properties had to be included in a nested content block. The for_each statement is also a bit tricky, so I found it sensible to extract that into a local to make the important stuff more readable:

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"
  }
}

You can read more about dynamic blocks here: https://www.terraform.io/docs/configuration/expressions.html#dynamic-blocks




回答4:


Conditionals in terraform are currently only to be used to determine a value, not to be used as an if statement wrapping a block.

And you can also use conditionals to determine a value based on some logic.

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



来源:https://stackoverflow.com/questions/42461753/terraform-conditional-block-based-on-environment

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!