terraform - 使用 terraform 0.12+ 计算输出变量

标签 terraform terraform0.12+

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

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
}

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

谢谢,

最佳答案

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

关于terraform - 使用 terraform 0.12+ 计算输出变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57756494/

相关文章:

amazon-web-services - Terraform 不会将 alb 目标组附加到负载均衡器

amazon-web-services - 使用 Terraform 对 DynamoDB 表启用 SSE 加密

local-exec DESTROY provisioner 中的 terraform 和引用

function - Terraform - 迭代模板中的对象列表

ssh - 集成 Terraform 和 Serverspec

terraform - 我们使用 terraform 创建了 okta_group 成员资格。我们正在创建多个用户,但我们只想要选定的用户

amazon-web-services - aws_acm_certificate 似乎已经改变了它的状态输出,可能是由于提供者更新——我做错了吗?

amazon-web-services - Terraform 错误 : ClientException: When the volume parameter is specified, 仅应使用一种卷配置类型

terraform - AWS Codepipeline with Terraform - 如何动态创建阶段

iteration - Terraform - 迭代从数据 block 上的 for_each 生成的列表