Terraform 尝试将堆栈输出列表用作模块输出

Terraform 尝试将堆栈输出列表用作模块输出,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我有一个模块,可以创建数量可变的CloudFormation堆栈。这很好,但我在尝试将堆栈输出用作模块中的输出时遇到问题。堆栈创建一个子网,我将创建的子网id指定为堆栈的输出。然后,我想返回所有子网ID的列表,作为模块输出的一部分。我认为我的输出应该是这样的: output "subnets" { value = ["${aws_cloudformation_stack.subnets.*.outputs["Subnet"]}"] } 当我这样做时,我得到一个整数解析错误。Terrafor

我有一个模块,可以创建数量可变的CloudFormation堆栈。这很好,但我在尝试将堆栈输出用作模块中的输出时遇到问题。堆栈创建一个子网,我将创建的子网id指定为堆栈的输出。然后,我想返回所有子网ID的列表,作为模块输出的一部分。我认为我的输出应该是这样的:

output "subnets" {
  value = ["${aws_cloudformation_stack.subnets.*.outputs["Subnet"]}"]
}
当我这样做时,我得到一个整数解析错误。Terraform似乎将输出视为列表而不是地图。有什么办法让它工作吗

编辑:这里是我声明堆栈的地方:

resource "aws_cloudformation_stack" "subnets" {
  count = "${local.num_zones}"

  name = "Subnet-${element(local.availability_zones, count.index)}"
  on_failure = "DELETE"
  template_body = "${file("${path.module}/templates/subnet.yaml")}"
  parameters {
    CIDR = "${cidrsubnet(var.cidr,ceil(log(local.num_zones * 2, 2)), count.index)}"
    AZ = "${element(local.availability_zones, count.index)}"
    VPC = "${aws_cloudformation_stack.vpc.outputs["VPCId"]}"
  }
}
然后,subnet.yaml中有一个堆栈输出,它具有密钥subnet,并且是所创建子网的id

堆栈都已成功创建,但我似乎无法从terraform模块导出所有创建的子网ID。不清楚为什么terraform将*.outputs视为列表,而将*.outputs[“子网”]保留为列表。我猜*.outputs正在转换为映射列表,但我需要映射中特定密钥(子网)的列表

我有一个非列表示例用于堆栈,并使用堆栈的输出作为terraform模块输出:

resource "aws_cloudformation_stack" "vpc" {
  name = "${var.name_prefix}-VPC"
  on_failure = "DELETE"
  template_body = "${file("${path.module}/templates/vpc.yaml")}"
  parameters {
    CIDR = "${var.cidr}"
  }
}

output "vpc" {
  value = "${aws_cloudformation_stack.vpc.outputs["VPCId"]}"
}
我可以通过声明创建后查找子网的数据来解决这个问题。这并不理想,但让我通过了被卡住。让我知道,如果有人知道如何做我原来想做的事。以下是我的想法:

data "aws_subnet_ids" "subnets" {
  depends_on = ["aws_cloudformation_stack.subnets"]
  vpc_id = "${aws_cloudformation_stack.vpc.outputs["VPCId"]}"
}

output "subnets" {
  value = "${data.aws_subnet_ids.subnets.ids}"
}

该语法将返回一个列表:。您可以利用
map
函数(),但更多信息会有所帮助。请尝试:输出“子网”{value=“${aws\u cloudformation\u stack.subnets.*.outputs[“Subnet”]}”}@victorm-两种方法都返回相同的错误,它将输出转换为一个列表,然后尝试对其进行数字索引,因此引发以下错误:strconv.ParseInt:解析“子网”:@MattSchuchard-更多信息最终将是我希望能够获得从该模块创建的子网ID列表,作为逗号分隔字符串,以便在另一个模块中使用。考虑到您提供的额外信息,您需要从映射列表中筛选该特定键的值。我不完全确定在<0.12中是否可以这样做。该语法将返回一个列表:。您可以利用
map
函数(),但更多信息会有所帮助。请尝试:输出“子网”{value=“${aws\u cloudformation\u stack.subnets.*.outputs[“Subnet”]}”}@victorm-两种方法都返回相同的错误,它将输出转换为一个列表,然后尝试对其进行数字索引,因此引发以下错误:strconv.ParseInt:解析“子网”:@MattSchuchard-更多信息最终将是我希望能够获得从该模块创建的子网ID列表,作为逗号分隔字符串,以便在另一个模块中使用。考虑到您提供的额外信息,您需要从映射列表中筛选该特定键的值。我不完全确定在<0.12时是否可能。