user606006
user606006

Reputation: 459

Terraform: length() on data source cannot be determined until apply?

I am trying to dynamically declare multiple aws_nat_gateway data sources by retrieving the list of public subnets through the aws_subnet_ids data source. However, when I try to set the count parameter to be equal to the length of the subnet IDs, I get an error saying The "count" value depends on resource attributes that cannot be determined until apply....

This is almost in direct contradiction to the example in their documentation!. How do I fix this? Is their documentation wrong?

I am using Terraform v0.12.

data "aws_vpc" "environment_vpc" {
  id = var.vpc_id
}

data "aws_subnet_ids" "public_subnet_ids" {
  vpc_id = data.aws_vpc.environment_vpc.id
  tags = {
    Tier = "public"
  }
  depends_on = [data.aws_vpc.environment_vpc]
}

data "aws_nat_gateway" "nat_gateway" {
  count      = length(data.aws_subnet_ids.public_subnet_ids.ids)  # <= Error
  subnet_id  = data.aws_subnet_ids.public_subnet_ids.ids.*[count.index]
  depends_on = [data.aws_subnet_ids.public_subnet_ids]
}

I expect to be able to apply this template successfully, but I am getting the following error:

Error: Invalid count argument

  on ../src/variables.tf line 78, in data "aws_nat_gateway" "nat_gateway":
  78:   count      = "${length(data.aws_subnet_ids.public_subnet_ids.ids)}"

The "count" value depends on resource attributes that cannot be determined
until apply, so Terraform cannot predict how many instances will be created.
To work around this, use the -target argument to first apply only the
resources that the count depends on.

Upvotes: 4

Views: 1770

Answers (1)

Hugo Lesta
Hugo Lesta

Reputation: 789

It seems you are trying to fetch subnets that weren't created yet or they couldn't be determinated, the terraform cmd output suggests you add -target flag to create the VPC and subnets or do another task first, after that, you'll apply the nat_gateway resource. I suggest you use the AZs list instead of subnets ids, I'll add a simple example below.

variable "vpc_azs_list" {
  default = [
    "us-east-1d",
    "us-east-1e"
  ]
}

resource "aws_nat_gateway" "nat" {
  count         = var.enable_nat_gateways ? length(var.azs_list) : 0
  allocation_id = "xxxxxxxxx"
  subnet_id     = "xxxxxxxxx"
  depends_on = [
    aws_internet_gateway.main,
    aws_eip.nat_eip,
  ]
  tags = {
    "Name"       = "nat-gateway-name"
    "costCenter" = "xxxxxxxxx"
    "owner"      = "xxxxxxxxx"
  }
}

I hope will be useful to you and other users.

Upvotes: 1

Related Questions