代码之家  ›  专栏  ›  技术社区  ›  mike01010

Terraform:引用使用对象映射变量创建的资源

  •  0
  • mike01010  · 技术社区  · 9 月前

    我对地形和学习有点陌生。我在我的varables.tf中定义了以下内容作为对象映射,这将允许我配置多个子网(目前只有1个子网):

    variable "subnets" {
      type        = map(object({name=string, cidr=string, az=string, public=bool}))
      default     = {
        "public_subnet" = {
           name="public",
           cidr="10.123.1.0/24",
           az="us-east-1a",
           public=true
       }
    }
    

    在main.tf中,我有以下内容:

    resource "aws_subnet" "subnets" {
      for_each                = var.subnets
      vpc_id                  = aws_vpc.vpc.id
      cidr_block              = each.value.cidr
      availability_zone       = each.value.az
      map_public_ip_on_launch = each.value.public 
      
      tags = {
        Name = "${each.value.name}_subnet"
      }
    }
    

    现在我的问题是,如何对aws_route_table_association和aws_instance进行编码,以使用可变映射中的特定子网? 通常情况下,如果我没有地图,我会这样做:

    resource "aws_route_table_association" "public_rta" {
      subnet_id      = aws_subnet.subnet.id
      route_table_id = aws_route_table.public_rt.id
    }
    

    在这种情况下,我不知道如何引用在循环中创建的子网id。

    1 回复  |  直到 9 月前
        1
  •  1
  •   Marko E    9 月前

    为了让它发挥作用,你必须使用 for_each 以及路由表关联资源(或引用不同的键)。在您希望所有子网都连接到同一路由表的情况下,您可以使用 resource chaining with for_each 在这种情况下:

    resource "aws_subnet" "subnets" {
      for_each                = var.subnets
      vpc_id                  = aws_vpc.vpc.id
      cidr_block              = each.value.cidr
      availability_zone       = each.value.az
      map_public_ip_on_launch = each.value.public 
      tags = {
        Name = "${each.value.name}_subnet"
      }
    
    resource "aws_route_table_association" "public_rta" {
      for_each       = aws_subnet.subnets
      subnet_id      = each.value.id
      route_table_id = aws_route_table.public_rt.id
    }