用terraform 0.12+计入输出变量

时间:2019-09-02 11:52:03

标签: terraform terraform0.12+

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

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

然后如何有条件地输出此资源的值?我尝试玩耍,而Terraform似乎自相矛盾

首先,它告诉我在输出中使用count。

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
}

任何想法现在如何运作?

谢谢

1 个答案:

答案 0 :(得分:2)

为资源设置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值都将在该资源的对象列表的范围内。