【问题标题】:Create conditional resource in terraform after count is already used在计数已经使用后在 terraform 中创建条件资源
【发布时间】:2020-11-10 03:05:51
【问题描述】:

我正在为services 字符串变量的给定值中的每个服务创建一个 route53 健康检查。

当我传递服务变量的值时,我的 tfvars 文件如下所示

services = "servicea serviceb serviced"

如果var.env == prod,我只需要进行这些健康检查。

有经过试验和测试的方法可以使用,那就是使用count = var.env == prod ? 1:0,但由于我已经在使用 count 来计算和迭代服务字符串,我无法在同一个资源块中再次使用 count ,因为如果我尝试这样做,terraform 0.12 会给我以下错误消息。

在同一资源块中使用多个计数时出错

Error: Attribute redefined

  on <stdin> line 514:   (source code not available)

The argument "count" was already set at <stdin>:513,2-7. Each argument may be set only once.

地形配置


variable "services" {
  default = ""
}


resource aws_route53_health_check "app_healthcheck" {
  count             = length(split(",", replace(var.services, "/\\s/", ",")))
  fqdn              = "${var.super_cluster}-${var.region}.domainname.com"
  port              = 443
  type              = "HTTPS"
  resource_path     = "/canSchedule?appName=${element(split(",", replace(var.services, "/\\s/", ",")), count.index)}"
  request_interval  = "10"
  failure_threshold = "1"
  enable_sni        = true
  tags              = local.common_tags


}

在资源块中使用count 后,如何创建条件资源?

【问题讨论】:

    标签: terraform amazon-route53 terraform0.12+


    【解决方案1】:

    要解决这个问题,您可以引入一个新的本地来检查 env 变量的值:

    locals {
      is_prod = var.env == "prod" ? true : false
    }
    

    然后在您的资源块中,在这样的条件表达式中使用该本地:

    count = local.is_prod ? length(split(",", replace(var.services, "/\\s/", ","))) : 0

    【讨论】:

    • 您的解决方案奏效了!但我很想知道这里当地人的用例。我之前想过使用它,但如果我的理解是正确的,那么只有当你想从 TF config 中删除重复时才应该使用本地人!从我上面的代码中可以看出,我已经在使用 local.common_tags 在我的资源中到处传播标签。
    • 你说得对,根据TF docs,避免重复正是当地人的本意。但是,当它帮助我们克服 TF 限制/限制时,只使用一次它们并没有什么坏处;)
    • 这也可以在没有本地值的情况下编写:count = var.env == "prod" ? length(split(",", replace(var.services, "/\\s/", ","))) : 0。使用局部值有时可以通过将表达式简化为更直观的方式来提高可读性,例如“is prod”标志,但这是一种风格权衡,而不是 Terraform 限制。
    猜你喜欢
    • 1970-01-01
    • 2019-08-04
    • 2020-06-02
    • 1970-01-01
    • 2018-06-26
    • 2020-04-16
    • 1970-01-01
    • 2021-01-03
    相关资源
    最近更新 更多