Terraform 插值将不需要的零添加到列表

Terraform interpolation adding unwanted zero to list

我正在使用 Terraform 中的 aws_cloudformation_stack 资源来收集有关 cloudformation 安全组堆栈的 ID,如下所示:

data "aws_cloudformation_stack" "vpc-prod-sg" {
  name = "vpc-prod-sg"
}

我在 main.tf 文件中定义了一个列表,其中的名称代表这些安全组,如下所示:

sg_ingress = ["DevMyAppLinkingSecurityGroup", "DevDBLinkingSecurityGroup"]

在我的模块中,我将 Clouffformation 堆栈中的值分配给列表中的名称:

security_groups = [contains(var.sg_ingress, "DevMyAppLinkingSecurityGroup") ? "${data.aws_cloudformation_stack.vpc-prod-sg.outputs["DevMyAppLinkingSecurityGroup"]}" : 0, contains(var.sg_ingress, "DevDBLinkingSecurityGroup") ? "${data.aws_cloudformation_stack.vpc-prod-sg.outputs["DevDBLinkingSecurityGroup"]}" : 0]

但是,当我 运行 terraform 计划时,列表中填充了我想要的值,但它还会向列表中添加一个值为零的附加条目。它看起来像这样:

+ security_groups  = [
                  + "0",
                  + "sg-05443559898348",
                  + "sg-05435345443545593"

我很困惑这个零是从哪里来的,或者我该如何处理它。有人遇到过类似的事情吗?

让我们先在表达式中添加一些垂直空格,以便于阅读:

security_groups = [
  contains(var.sg_ingress, "DevMyAppLinkingSecurityGroup") ?
  "${data.aws_cloudformation_stack.vpc-prod-sg.outputs["DevMyAppLinkingSecurityGroup"]}" :
  0,
  contains(var.sg_ingress, "DevDBLinkingSecurityGroup") ?
  "${data.aws_cloudformation_stack.vpc-prod-sg.outputs["DevDBLinkingSecurityGroup"]}" :
  0
]

这两个元素表达式都是条件表达式,如果它们的表达式为假,则生成零,因此您看到的零很可能是由这些条件之一为假而生成的。然后将零转换为字符串,因为 security_groups 被定义为字符串集合。

退一步看看最初的问题,您的目标似乎是从一些符号名称(由您的 CloudFormation 堆栈导出)映射到它们所代表的物理安全组 ID。对于这种映射问题,我建议使用 for expressions,像这样:

security_groups = [
  for n in var.sg_ingress : data.aws_cloudformation_stack.vpc-prod-sg.outputs[n]
]

如果此 CloudFormation 堆栈还有其他输出并且您想确保 var.sg_ingress 只能引用这两个,您可以添加一些额外的间接以确保:

locals {
  allowed_security_group_outputs = ["DevMyAppLinkingSecurityGroup", "DevDBLinkingSecurityGroup"]
  security_group_ids = {
    for n in local.allowed_security_group_outputs :
    n => data.aws_cloudformation_stack.vpc-prod-sg.outputs[n]
  }
}

...然后:

security_groups = [
  for n in var.sg_ingress : local.security_group_ids[n]
]