我正在 Terraform 中使用 aws_cloudformation_stack 资源来收集有关 cloudformation 安全组堆栈的 ID,如下所示:
data "aws_cloudformation_stack" "vpc-prod-sg" {
name = "vpc-prod-sg"
}
我在 main.tf 文件中定义了一个列表,其中的名称代表这些安全组,如下所示:
sg_ingress = ["DevMyAppLinkingSecurityGroup", "DevDBLinkingSecurityGroup"]
在我的模块中,我将 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 计划时,列表中会填充我想要的值,但它还会向列表中添加一个值为零的附加条目。它看起来像这样:
+ 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]
]
关于aws-cloudformation - Terraform 插值将不需要的零添加到列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57858344/