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]
]
我正在使用 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]
]