我有一个模块,可以创建可变数量的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}"
}