#amazon-web-services #foreach #routes #terraform #nat
#amazon-веб-сервисы #foreach #маршруты #terraform #nat
Вопрос:
Это то, что я пытаюсь сделать. У меня есть 3 шлюзов NAT, развернутых в отдельных AZS. Сейчас я пытаюсь создать 1 таблицу маршрутов для моих частных подсетей, указывающую на шлюз NAT. В terraform я создал шлюзы NAT с использованием for_each. Сейчас я пытаюсь связать эти шлюзы NAT с частной таблицей маршрутов и получаю сообщение об ошибке, потому что я создал шлюзы NAT с использованием for_each. По сути, я пытаюсь ссылаться на ресурсы, созданные с помощью for_each в ресурсе, который мне не нужно использовать «for_each». Ниже приведен код и сообщение об ошибке. Буду признателен за любой совет.
resource "aws_route_table" "nat" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.main[each.key].id
}
tags = {
Name = "${var.vpc_tags}_PrivRT"
}
}
resource "aws_eip" "main" {
for_each = aws_subnet.public
vpc = true
lifecycle {
create_before_destroy = true
}
}
resource "aws_nat_gateway" "main" {
for_each = aws_subnet.public
subnet_id = each.value.id
allocation_id = aws_eip.main[each.key].id
}
resource "aws_subnet" "public" {
for_each = var.pub_subnet
vpc_id = aws_vpc.main.id
cidr_block = cidrsubnet(aws_vpc.main.cidr_block, 8, each.value)
availability_zone = each.key
map_public_ip_on_launch = true
tags = {
Name = "PubSub-${each.key}"
}
}
Ошибка
Error: Reference to "each" in context without for_each
on vpc.tf line 89, in resource "aws_route_table" "nat":
89: nat_gateway_id = aws_nat_gateway.main[each.key].id
The "each" object can be used only in "resource" blocks, and only when the
"for_each" argument is set.
Ответ №1:
Проблема в том, что вы ссылаетесь each.key
на nat_gateway_id
свойство "aws_route_table" "nat"
ресурса, не имея for_each
нигде в этом ресурсе или подблоке.
Добавьте for_each к этому ресурсу, и это должно сработать:
Вот несколько примеров кода (непроверенных):
resource "aws_route_table" "nat" {
for_each = var.pub_subnet
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.main[each.key].id
}
}
Комментарии:
1. Привет, спасибо за совет. Я думаю, что это определенно в правильном направлении. Однако использование динамического блока по-прежнему выдает мне ту же ошибку. Я обновлю вопрос своими изменениями.
2. Я обновил ответ, чтобы настроить его, поскольку понял, что предложенное мной не сработает, но я не думаю, что это решит проблему в вашем обновлении… можете ли вы подтвердить, какую версию terraform вы используете?
3. Привет, я использую terraform 0.12.26. Я попробовал то, что вы опубликовали ранее, и получил ту же ошибку, что и в моем обновлении.
4. хорошо, я провел некоторое исследование и вместо «каждого» в случае этого динамического блока должно быть «route», поэтому я снова обновил, надеюсь, это приблизит к решению
5. Эй, я думаю, что это становится ближе. Появляется ошибка с указанием неподдерживаемого атрибута. Я обновлю с точной ошибкой.