【问题标题】:Terraform interpolation adding unwanted zero to listTerraform 插值将不需要的零添加到列表中
【发布时间】:2020-01-11 11:26:02
【问题描述】:

我正在使用 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 计划时,列表中会填充我想要的值,但它还会向列表中添加一个附加条目,其值为 0。它看起来像这样:

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

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

【问题讨论】:

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

标签: amazon-cloudformation terraform terraform-provider-aws


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多