Amazon web services 在应用之前无法确定数据源上的Terraform:length()?

Amazon web services 在应用之前无法确定数据源上的Terraform:length()?,amazon-web-services,terraform,Amazon Web Services,Terraform,我试图通过aws\u subnet\u id数据源检索公共子网列表,动态声明多个aws\u nat\u gateway数据源。但是,当我尝试将count参数设置为等于子网ID的长度时,我得到一个错误,即count”值取决于资源属性,直到应用…后才能确定 这几乎与事实直接矛盾!。我该如何解决这个问题?他们的文件有错吗 我正在使用Terraform v0.12 data "aws_vpc" "environment_vpc" { id = var.vpc_id } data "aws_subn

我试图通过
aws\u subnet\u id
数据源检索公共子网列表,动态声明多个
aws\u nat\u gateway
数据源。但是,当我尝试将
count
参数设置为等于子网ID的长度时,我得到一个错误,即
count”值取决于资源属性,直到应用…
后才能确定

这几乎与事实直接矛盾!。我该如何解决这个问题?他们的文件有错吗

我正在使用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]
}

您似乎正在尝试获取尚未创建或无法确定的子网,terraform cmd输出建议您添加-target标志以创建VPC和子网,或者先执行另一项任务,然后应用nat_网关资源。我建议您使用AZs列表而不是子网ID,我将在下面添加一个简单的示例

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

我希望对您和其他用户有用。

您执行的是什么命令导致此错误?
terraform apply
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"
  }
}