aws-cloudformation - Terraform 插值将不需要的零添加到列表中

标签 aws-cloudformation terraform terraform-provider-aws

我正在 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/

相关文章:

amazon-web-services - Cloudformation 未在所需区域启动 WAF 堆栈

amazon-web-services - 使用 PyYAML 库解析 AWS CloudFormation 模板

amazon-web-services - AWS 中 Terraform 资源的强制标记

azure - 如何使用 yaml 文件中的标签 - terraform

amazon-web-services - 如何为 AWS 中国 cn-north-1 配置 Terraform

地形云 : Import existing resource

amazon-web-services - AWS Cloudwatch警报将参数传递给另一个参数

amazon-web-services - 如何在cloudformation yml中获取最新的lambda版本?

Terraform 创建 Lambda 函数时出错 : ResourceConflictException with the resource just created by Terraform apply

amazon-web-services - Terraform 配置 LB 属性失败