Amazon web services Terraform AWS子网id列表被视为ec2实例的单值字符串

Amazon web services Terraform AWS子网id列表被视为ec2实例的单值字符串,amazon-web-services,amazon-ec2,terraform,vpc,private-subnet,Amazon Web Services,Amazon Ec2,Terraform,Vpc,Private Subnet,我有创建VPC的代码,有2个私有子网,2个私有EC2实例和一个公共堡垒 ec2代码使用VPC模块子网ID的outputs.tf。由于有2个专用子网,因此生成了2个子网ID。当这些生成的子网_id被馈送到ec2实例而不是一个子网_id时,它将作为单个值同时馈送两个子网_id 结果terraform找不到子网ID值,创建失败 错误: 子网ID“subnet-0*******,subnet-0**********”不存在 编辑子网* vpc.tf instanceec2.tf subnet_id

我有创建VPC的代码,有2个私有子网,2个私有EC2实例和一个公共堡垒

ec2代码使用VPC模块子网ID的outputs.tf。由于有2个专用子网,因此生成了2个子网ID。当这些生成的子网_id被馈送到ec2实例而不是一个子网_id时,它将作为单个值同时馈送两个子网_id

结果terraform找不到子网ID值,创建失败

错误: 子网ID“subnet-0*******,subnet-0**********”不存在

编辑子网* vpc.tf

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_实例。ec2实例[0]:发生1个错误:

  • aws_实例.ec2实例.0:启动源实例时出错:InvalidSubnetID.NotFound:子网ID“subnet-0*******,subnet-0**********”不存在

由于您已经“加入”了结果,如果您只需要一个子网值,就必须再次拆分。 比如:

element(split(",", var.private_subnets), 0) 

您正在将子网ID加入输出变量:

output "private_subnets" {
  value = "${join(",", aws_subnet.private.*.id)}"
}
当您从
实例ec2.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)}"

错误是否来自terraform plan-out vpc-main.tf?若并没有,那个命令提供了什么输出?TerraformApply出现了错误。该命令提供了专用子网ID。我想给出多个子网,但作为一个值。我有2个子网,其中必须有ec2实例。它也应该是动态的,不指定0、1等。每个ec2实例只能驻留在一个子网中。它不能跨越多个子网。这是有道理的,那么位于不同AZ中的实例之间如何进行同步呢?两个AZ是否具有相同的VPC_id、子网_id和实例_id以及相同的实例。2AZ是指克隆人吗?所有属性都相同??非常感谢您的回答。您所说的实例之间的同步是什么意思?count.index不起作用,因为outputs.tf是VPC模块的,我在不同的模块ec2.tf中使用该输出。当然,但我认为您也应该在ec2实例资源定义中使用
count=…
。还可以为大于ID数组长度的实例指定计数。例如,当计数为3时,Terraform会将子网0分配给实例0,将子网1分配给实例1,并将子网0再次分配给实例3,依此类推。“加入”和“拆分”对我有效,“列表”和“元素”方式对我无效。谢谢!
subnet_id = "${element(module.vpc.private_subnets, count.index)}"