![](/img/trans.png)
[英]CloudFormation, passing a List<AWS::EC2::Subnet::Id> parameter as a comma separated string?
[英]Terraform AWS subnet_id list is treated as single value string for ec2 instance
我有创建VPC的代码,其中包含2个私有子网,2xec2私有实例和公共堡垒。
ec2代码使用VPC模块subnet_ids的outputs.tf。 由于有2个私有子网,因此将生成2个subnet_id。 当将这些生成的subnet_id而不是一个subnet_id馈入ec2实例时,它将一次作为单个值馈入2个subnet_id。
结果是terraform无法找到subnet_ids的值,创建失败。
错误:子网ID'subnet-0 ***********,subnet-0 *************'不存在
编辑子网* vpc.tf
private_subnets = "10.10.20.#/#,10.10.20.#/#"
instanceec2.tf
subnet_id = "${module.vpc.private_subnets}"
以下是模块:
vpc_main.tf
// Private subnet/s
resource "aws_subnet" "private" {
vpc_id = "${aws_vpc.vpc.id}"
cidr_block = "${element(split(",", var.private_subnets), count.index)}"
availability_zone = "${element(split(",", var.azs), count.index)}"
count = "${length(split(",", var.private_subnets))}"
tags {
Name = "${var.name}-private-${element(split(",", var.azs), count.index)}"
Team = "${var.team}"
Environment = "${var.environment}"
Service = "${var.service}"
Product = "${var.product}"
Owner = "${var.owner}"
Description = "${var.description}"
managed_by = "terraform"
}
}
resource "aws_route_table" "private" {
vpc_id = "${aws_vpc.vpc.id}"
count = "${length(split(",", var.private_subnets))}"
tags {
Name = "${var.name}-private-${element(split(",", var.azs), count.index)}"
Team = "${var.team}"
Environment = "${var.environment}"
Service = "${var.service}"
Product = "${var.product}"
Owner = "${var.owner}"
Description = "${var.description}"
managed_by = "terraform"
}
}
resource "aws_route_table_association" "private" {
subnet_id = "${element(aws_subnet.private.*.id, count.index)}"
route_table_id = "${element(aws_route_table.private.*.id, count.index)}"
count = "${length(split(",", var.private_subnets))}"
}
``````
vpc_outputs.tf
```````
output "private_subnets" {
value = "${join(",", aws_subnet.private.*.id)}"
}
期望值只是一个子网ID作为值:
错误:提供2个子网ID作为一个值。
aws_instance.ec2-instance [0]:发生1个错误:
由于您已“加入”结果,因此,如果只需要一个子网值,就必须再次拆分。 就像是:
element(split(",", var.private_subnets), 0)
您在输出变量中加入了子网ID:
output "private_subnets" {
value = "${join(",", aws_subnet.private.*.id)}"
}
当您从instanceec2.tf
访问此输出值时,您将仅收到此连接的ID字符串。 因此,您必须像以前一样再次滑动接收的值,并使用您的ec2资源的计数索引访问各自的ID:
resource "aws_instance" "default" {
count = "${length(split(",", module.vpc.private_subnets))}"
subnet_id = "${element(split(",", module.vpc.private_subnets), count.index)}"
....
}
那应该解决您的问题。
另外,您也可以直接将子网ID作为列表输出:
output "private_subnets" {
description = "The IDs of the private subnets as list"
value = ["${aws_subnet.private.*.id}"]
}
然后使用以下命令访问它们:
subnet_id = "${element(module.vpc.private_subnets, count.index)}"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.