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

时间:2019-02-07 18:01:27

标签: terraform terraform-provider-aws

我有一个模块,可以创建可变数量的CloudFormation堆栈。这工作得很好,但是我在尝试使用Stack输出作为模块中的输出时遇到问题。堆栈创建一个子网,我将创建的子网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中有一个Stack输出,该输出具有关键的Subnet,并且是创建的子网的ID。

所有堆栈都已成功创建,但是我似乎无法从terraform模块中导出所有已创建的子网ID。不知道为什么terraform将* .outputs视为列表而不是将* .outputs [“ Subnet”]视为列表。我猜* .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}"
}

0 个答案:

没有答案