【问题标题】:Count in output vars with terraform 0.12+使用 terraform 0.12+ 计算输出变量
【发布时间】:2020-01-05 11:08:47
【问题描述】:

我有条件地创建一个带有计数的资源:

resource "aws_kms_key" "this" {
  count       = var.create_kms_key == true ? 1 : 0
  ...
}

然后我如何有条件地输出这个资源的价值?我试着到处玩,Terraform 似乎自相矛盾

首先它告诉我在输出中使用计数。

For example, to correlate with indices of a referring resource, use:
    aws_kms_key.this[count.index]

然后当我尝试它说我不能使用计数。

The "count" object can be used only in "resource" and "data" blocks, and only
when the "count" argument is set.

以前我们可以执行以下操作,但现在这会触发我之前发布的计数错误。

output "kms_key_arn" {
    value = aws_kms_key.this.*.arn
}

知道它现在是如何工作的吗?

谢谢,

【问题讨论】:

    标签: terraform terraform0.12+


    【解决方案1】:

    当为资源设置count 时,对该资源的引用会返回一个对象列表而不是单个对象,因此我们需要在编写其他表达式时牢记这一点。

    在您的情况下,该列表可以有零个或一个元素,因此我们必须在引用它的任何表达式中处理这两种情况。

    要编写一个从该资源传播属性的输出,我们需要决定在列表为空的情况下我们将返回什么。例如,在这种情况下,我们可以选择将输出设置为null

    output "kms_key_arn" {
        value = concat(aws_kms_key.this.*.arn, [null])[0]
    }
    

    这里的技术是从一个有零个或一个元素的列表变成一个有一个或两个元素的列表,然后取第一个元素。 concat 函数可能返回的结果有两种可能性:

    ["arn:aws:....", null]
    [null]
    

    在这两种情况下,使用[0] 获取第零个元素都是有效的。在第二种情况下,它会选择null作为结果。


    如果您还有其他以var.create_kms_key 为条件的资源,则此方法有一个变体:

    resource "aws_kms_key" "example" {
      count = var.create_kms_key ? 1 : 0
    
      # ...
    }
    
    resource "anything_else" "example" {
      count = length(aws_kms_key.example) # only if KMS key is created
    
      any_argument = aws_kms_key.example[count.index].arn
    }
    

    此变体依赖于这样一个事实,即这两个资源对于count 具有相同的值,因此我们可以在第二个资源中使用count.index,以便与第一个资源的实例相关联。 count.index 只能在设置了count 的资源中使用,但在这种特殊情况下,它 已设置,并且因为我们将count 设置为其他资源的长度,所以我们知道所有count.index 值都将在该资源的对象列表的范围内。

    【讨论】:

    • 感谢您花时间回答这个问题,感谢您在 TF 上所做的所有工作。最后我的问题是在另一段代码中我没有使用 count 因此为什么 TF 错误似乎是矛盾的。一切实际上都按预期工作。
    猜你喜欢
    • 2020-07-10
    • 2020-11-21
    • 2019-10-06
    • 2021-02-02
    • 2019-11-19
    • 1970-01-01
    • 2021-01-03
    • 2017-05-26
    • 2020-05-30
    相关资源
    最近更新 更多