![](/img/trans.png)
[英]Terraform: length() on data source cannot be determined until apply?
[英]Terraform, get count of length of data source
伙計們,
我正在嘗試為 AWS 區域中可用的每個 aws 可用區創建一個子網。
data "aws_availability_zones" "azs" {
depends_on = [aws_vpc.k3s_vpc]
state = "available"
}
locals {
azs= "${data.aws_availability_zones.azs.names}"
}
resource "aws_subnet" "private_subnets" {
count = length(data.aws_availability_zones.azs.names)
vpc_id = aws_vpc.k3s_vpc.id
cidr_block = var.private_subnets_cidr[count.index]
availability_zone = local.azs[count.index]
}
低於錯誤
錯誤:無效的計數參數
“count”值取決於資源屬性,在應用之前無法確定,因此 Terraform 無法預測將創建多少個實例。 要解決此問題,請使用 -target 參數首先僅應用計數所依賴的資源。
有任何想法嗎?
在您編寫的data "aws_availability-zones" "azs"
塊中depends_on = [aws_vpc.k3s_vpc]
,這意味着 Terraform 在創建 VPC 之前無法查找可用區,但 VPC 不存在但是在計划期間,您會看到此錯誤。
您的賬戶的特定區域的可用區不會因 VPC 的創建而異,因此我不清楚您為什么包含該依賴項。 如果您刪除它,那么 Terraform 應該會看到它能夠在規划階段解析該數據源,從而確定要創建多少子網。
但是,我仍然建議謹慎使用這種方法:如果該查找的結果將來會以在列表末尾以外的任何地方引入可用區的方式發生變化,那么您現有的子網將被重新分配給新的可用區,因此供應商將計划更換它們。 相反,最好使用可用區名稱本身作為子網的標識符,這樣它們在結果列表中出現的順序就無關緊要了:
data "aws_availability_zones" "azs" {
state = "available"
}
locals {
azs = toset(data.aws_availability_zones.azs.names)
}
resource "aws_subnet" "private_subnets" {
for_each = local.azs
vpc_id = aws_vpc.k3s_vpc.id
cidr_block = var.private_subnets_cidr[each.value]
availability_zone = each.value
}
請注意,在這種方法下,您還需要將variable "public_subnets_cidr"
更改為 map 而不是列表,並將可用區名稱作為鍵,以便 CIDR 范圍也直接分配給 AZ,不會被重新分配如果以后新區域出現在您的帳戶中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.