【问题标题】:Terraform For_Each: How to reference created resource IDTerraform For_Each:如何引用创建的资源 ID
【发布时间】:2021-04-15 22:18:24
【问题描述】:

我创建了一个创建 AWS 子网的模块。在模块中,我使用 for_each 循环来创建子网。我假设我可以索引给定子网的资源 ID,但似乎循环不会以可预测的顺序输出子网 ID 索引...不确定我在这里遗漏了什么。任何帮助表示赞赏!

ma​​in.tf

module "subnets" {
  source = "./modules/subnets/"
  vpc_id = aws_vpc.main.id
  subnets = [
    {
      name              = "private-1a"
      cidr_block        = "10.0.0.0/28"
      availability_zone = "us-east-1a"
    },
    {
      name              = "private-1b"
      cidr_block        = "10.0.1.0/24"
      availability_zone = "us-east-1b"
    },
    {
      name              = "public-1a"
      cidr_block        = "10.0.2.0/24"
      availability_zone = "us-east-1a"
    },
    {
      name              = "public-1b"
      cidr_block        = "10.0.3.0/24"
      availability_zone = "us-east-1b"
    }
  ]
}


output "private1a" {
  value = module.security_subnets.subnet_id[0]
} 
output "private1b" {
  value = module.security_subnets.subnet_id[1]
} 
output "public1a" {
  value = module.security_subnets.subnet_id[2]
} 
output "public1b" {
  value = module.security_subnets.subnet_id[3]
} 

模块

locals {
  subnets = {
    for i in var.subnets :
    i.name => i
  }
}

resource "aws_subnet" "main" {
  for_each          = local.subnets
  vpc_id            = var.vpc_id
  cidr_block        = each.value.cidr_block
  availability_zone = each.value.availability_zone

  tags = merge(
    {
      "Name" = format("%s", each.value.name)
    }
  )

}

output subnet_id {
  value = values(aws_subnet.main)[*].id
}

【问题讨论】:

    标签: amazon-web-services terraform terraform-provider-aws


    【解决方案1】:

    作为一般规则,依赖于返回项目的顺序不是一个好习惯,因为如果您决定在两者之间添加某些内容或删除某些内容,这可能会导致将来出现问题。 p>

    尽管如此,在您的情况下,返回项目的顺序是定义明确的。由于您使用的是values,因此顺序为:

    这些值由其对应的键以字典顺序返回,因此这些值的返回顺序与它们的键从键返回的顺序相同。

    【讨论】:

      【解决方案2】:

      subnets 变量使用映射结构而不是数组应该按索引返回值,然后解决如果顺序更改(例如删除项目)时混合值的问题:

      module "subnets" {
        source = "./modules/subnets/"
        vpc_id = aws_vpc.main.id
        subnets = {
          "private-1a" = {
            name              = "private-1a"
            cidr_block        = "10.0.0.0/28"
            availability_zone = "us-east-1a"
          },
          "private-1b" = {
            name              = "private-1b"
            cidr_block        = "10.0.1.0/24"
            availability_zone = "us-east-1b"
          },
          "public-1a" = {
            name              = "public-1a"
            cidr_block        = "10.0.2.0/24"
            availability_zone = "us-east-1a"
          },
          "public-1b" = {
            name              = "public-1b"
            cidr_block        = "10.0.3.0/24"
            availability_zone = "us-east-1b"
          }
        }
      }
      
      
      output "private1a" {
        value = module.security_subnets.subnet_id["private-1a"]
      } 
      
      // and so on
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-09
        • 2019-12-16
        • 1970-01-01
        • 1970-01-01
        • 2020-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多