Я создаю ресурс «aws_subnet», используя выражение count. Я бы хотел использовать for_each вместо count, но мне нужна помощь с правильным синтаксисом.
variable "privateSubnetCIDR" {
type = list(string)
default = ["10.0.1.0/24","10.0.2.0/24"]
}
data "aws_availability_zones" "availableAZ" {}
resource "aws_subnet" "privatesubnet" {
count = length(var.privateSubnetCIDR)
cidr_block = tolist(var.privateSubnetCIDR)[count.index]
vpc_id = aws_vpc.dev_vpc.id
map_public_ip_on_launch = false
availability_zone = data.aws_availability_zones.availableAZ.names[count.index]
tags = {
name = "${var.environment}-privatesubnet-${count.index + 1}"
AZ = data.aws_availability_zones.availableAZ.names[count.index]
Environment = "${var.environment}-privatesubnet"
}
}
Ошибок нет, работает. Я просто хочу понять, как использовать for_each в этом случае.
Вы уже используете для каждого в for_each = toset(var.publicSubnetCIDR)
? Итак, если это работает, в чем проблема?
Моя вина, выложил неверный код. Вот рабочий пример со счетом
Один из способов использования for_each
будет следующим:
resource "aws_subnet" "privatesubnet" {
for_each = toset(var.privateSubnetCIDR)
cidr_block = each.key
vpc_id = aws_vpc.dev_vpc.id
map_public_ip_on_launch = false
availability_zone = element(data.aws_availability_zones.availableAZ.names, index(var.privateSubnetCIDR, each.key))
tags = {
name = "environment-privatesubnet-${index(var.privateSubnetCIDR, each.key) + 1}"
AZ = element(data.aws_availability_zones.availableAZ.names, index(var.privateSubnetCIDR, each.key))
Environment = "environment-privatesubnet"
}
}
Более простой способ:
resource "aws_subnet" "privatesubnet" {
for_each = {for idx, val in var.privateSubnetCIDR: idx => val}
cidr_block = each.value
vpc_id = aws_vpc.dev_vpc.id
map_public_ip_on_launch = false
availability_zone = element(data.aws_availability_zones.availableAZ.names, each.key)
tags = {
name = "environment-privatesubnet-${each.key + 1}"
AZ = element(data.aws_availability_zones.availableAZ.names, each.key)
Environment = "environment-privatesubnet"
}
}
Теперь у меня проблемы с получением subnet_id в следующем блоке: resource "aws_route_table_association" "nat_routeTableAssociation" { count = length(var.privateSubnetCIDR) route_table_id = aws_route_table.nat_routetable[count.index].id subnet_id = aws_subnet.privatesubnet[count.index].id
Я не могу использовать for_each здесь, потому что route_table использует count. Есть ли способ получить subnet_id без for_each в этом блоке?
@bohdan Если у вас есть новые проблемы, следует задать новый вопрос SO. Мой ответ правильно относится к вашему текущему вопросу.
Вы забыли объяснить, что не так с вашим кодом? Есть ошибки?