comment faire référence aux ressources créées avec for_each dans terraform

Aug 20 2020

C'est ce que j'essaie de faire. J'ai 3 passerelles NAT déployées dans des AZ distinctes. J'essaie maintenant de créer 1 table de routage pour mes sous-réseaux privés pointant vers la passerelle NAT. Dans terraform, j'ai créé les passerelles NAT en utilisant for_each. J'essaie maintenant d'associer ces passerelles NAT à une table de routage privée et j'obtiens une erreur car j'ai créé les passerelles NAT à l'aide de for_each. Essentiellement, j'essaie de faire référence à des ressources créées avec for_each dans une ressource que je n'ai pas besoin d'utiliser "for_each". Vous trouverez ci-dessous le code et le message d'erreur. Tout avis sera le bienvenu.

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

Erreur

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.

Réponses

2 JDD Aug 20 2020 at 01:23

Le problème est que vous faites référence each.keyà la nat_gateway_id propriété de la "aws_route_table" "nat"ressource sans for_eachn'importe où dans cette ressource ou sous-bloc.

Ajoutez un for_each à cette ressource et cela devrait faire l'affaire :

Voici un exemple de code (non testé):

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