Amazon cloudformation 地形插值将不需要的零添加到列表中

Amazon cloudformation 地形插值将不需要的零添加到列表中,amazon-cloudformation,terraform,terraform-provider-aws,Amazon Cloudformation,Terraform,Terraform Provider Aws,我正在Terraform中使用aws_cloudformation_堆栈资源收集有关cloudformation安全组堆栈的ID,如下所示: data "aws_cloudformation_stack" "vpc-prod-sg" { name = "vpc-prod-sg" } 我在main.tf文件中定义了一个列表,其中的名称表示这些安全组,如下所示: sg_ingress = ["DevMyAppLinkingSecurityGroup", "DevDBLinkingSecurit

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

data "aws_cloudformation_stack" "vpc-prod-sg" {
  name = "vpc-prod-sg"
}
我在main.tf文件中定义了一个列表,其中的名称表示这些安全组,如下所示:

sg_ingress = ["DevMyAppLinkingSecurityGroup", "DevDBLinkingSecurityGroup"]
+ security_groups  = [
                  + "0",
                  + "sg-05443559898348",
                  + "sg-05435345443545593"
security_groups = [
  for n in var.sg_ingress : data.aws_cloudformation_stack.vpc-prod-sg.outputs[n]
]
在我的模块中,我将Cloufformation堆栈中的值分配给以下列表中的名称:

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 plan时,列表中填充了我想要的值,但它也向列表中添加了一个值为零的附加条目。看起来是这样的:

sg_ingress = ["DevMyAppLinkingSecurityGroup", "DevDBLinkingSecurityGroup"]
+ security_groups  = [
                  + "0",
                  + "sg-05443559898348",
                  + "sg-05435345443545593"
security_groups = [
  for n in var.sg_ingress : data.aws_cloudformation_stack.vpc-prod-sg.outputs[n]
]

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

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

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
]
这两个元素表达式都是条件,如果它们的表达式为false,则会生成零,因此您看到的零很可能是由其中一个条件为false生成的。然后将零转换为字符串,因为
security\u groups
被定义为字符串的集合

退一步来看原始问题,这里的目标似乎是将一些符号名称(由CloudFormation堆栈导出)映射到它们所表示的物理安全组ID。对于这种映射问题,我建议使用如下方法:

sg_ingress = ["DevMyAppLinkingSecurityGroup", "DevDBLinkingSecurityGroup"]
+ security_groups  = [
                  + "0",
                  + "sg-05443559898348",
                  + "sg-05435345443545593"
security_groups = [
  for n in var.sg_ingress : data.aws_cloudformation_stack.vpc-prod-sg.outputs[n]
]
如果此CloudFormation堆栈还有其他输出,并且您希望确保
var.sg\u入口
只能引用这两个,那么您可以添加一些额外的间接寻址,以确保:

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]
]

如果第一个三元解析为false,那么列表的第0个元素将是
0
。这似乎是最有可能的原因。