繁体   English   中英

Terraform For_Each:如何引用创建的资源 ID

[英]Terraform For_Each: How to reference created resource ID

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

主文件

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
}

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

不过,在您的情况下,物品返回的顺序是明确定义的。 由于您使用的是,因此顺序为:

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

使用 map 结构而不是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM