for_eachで作成されたリソースをterraformで参照する方法

Aug 20 2020

これが私がやろうとしていることです。3つのNATゲートウェイを別々のAZに展開しています。現在、NATゲートウェイを指すプライベートサブネット用に1つのルートテーブルを作成しようとしています。テラフォームでは、for_eachを使用してNATゲートウェイを作成しました。for_eachを使用してNATゲートウェイを作成したため、これらのNATゲートウェイをプライベートルートテーブルに関連付けようとしていますが、エラーが発生します。基本的に、「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.

回答

2 JDD Aug 20 2020 at 01:23

問題は、そのリソースまたはサブブロックのどこにも存在しないリソースeach.keynat_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
  }
}