2
votes

I have code to create VPC, with 2 private subnets, 2xec2 instances in private and bastion in public.

ec2 code uses outputs.tf of VPC module subnet_ids. as there are 2 private subnets there are 2 subnet_ids being generated. when these generated subnet_ids are fed into ec2 instances instead of one subnet_id, it is feeding 2 subnet_ids at once as a single value.

As a result terraform couldn't find that subnet_ids value, creation is being failed.

error: The subnet ID 'subnet-0***********,subnet-0*************' does not exist

editing subnets* vpc.tf

private_subnets     = "10.10.20.#/#,10.10.20.#/#"

instanceec2.tf

subnet_id           = "${module.vpc.private_subnets}"

below are modules:

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)}"
}

Expected value is only one subnet ID as value:

Error: supply 2 Subnet IDs as one value.

aws_instance.ec2-instance[0]: 1 error(s) occurred:

  • aws_instance.ec2-instance.0: Error launching source instance: InvalidSubnetID.NotFound: The subnet ID 'subnet-0**********,subnet-0***********' does not exist
2
Is the error coming from terraform plan -out vpc-main.tf? If not, what output does that command provide?lasleyd
error came out from terraform apply. that command provide private subnet_ids.user11411591

2 Answers

0
votes

Since you have 'join'ed the result, you would have to split again if you require just one subnet value. Something like:

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

you are joining the subnet IDs in your output variable:

output "private_subnets" {
  value = "${join(",", aws_subnet.private.*.id)}"
}

When you access this output value from your instanceec2.tf you will only receive this joined string of IDs. So, you again have to slipt the received value as you've done before and access the respective individual ID with your count index of the ec2 resource:

resource "aws_instance" "default" {
    count     = "${length(split(",", module.vpc.private_subnets))}"
    subnet_id = "${element(split(",", module.vpc.private_subnets), count.index)}"
    ....
}    

That should solve you're issue.

Alternatively, you can also output the subnet IDs directly as a list:

output "private_subnets" {
  description = "The IDs of the private subnets as list"
  value       = ["${aws_subnet.private.*.id}"]
}

and then access them with:

subnet_id = "${element(module.vpc.private_subnets, count.index)}"