Terraform 在 for_each 上获取列表索引

Mos*_*she 8 terraform

Terraform新手在这里。我想使用 迭代列表for_each,但键和值似乎相同:

provider "aws" {
  profile = "default"
  region  = "us-east-1"
}

variable "vpc_cidrs" {
  default = ["10.0.0.0/16", "10.1.0.0/16"]
}

resource "aws_vpc" "vpc" {
  for_each             = toset(var.vpc_cidrs)
  cidr_block           = each.value
  enable_dns_hostnames = true
  tags                 = { Name = "Company0${each.key}" }
}
Run Code Online (Sandbox Code Playgroud)

我想的标签名称是"Name" = "Company01""Name" = "Company02",但根据terraform apply我得到: "Name" = "Company010.0.0.0/16""Name" = "Company010.1.0.0/16" 我缺少什么?

Mos*_*she 20

使用index函数找到了一个简单的解决方案:

tags = { Name = "Company0${index(var.vpc_cidrs, each.value) + 1}" }
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案也适用于 for 语句。[ for x in data.aws_availability_zones.available.names : cidrsubnet(var.vpc_cidr_block, 8, index(data.aws_availability_zones.available.names, x)) ] (2认同)

mar*_*iux 14

还有另一种方法可以在不使用的情况下实现想要的结果index()

更改以下三行:

for_each   = { for idx, cidr_block in var.vpc_cidrs: cidr_block => idx}
cidr_block = each.key
tags       = { Name = format("Company%02d", each.value + 1) }
Run Code Online (Sandbox Code Playgroud)
  • for_each将使用地图上cidr_blockindex映射由作为返回 for
  • cidr_block则可以只使用each.key
  • 并且在tags也使用format()oneach.value有一个带前导零的两位数index

完整示例将是:

provider "aws" {
  profile = "default"
  region  = "us-east-1"
}

variable "vpc_cidrs" {
  default = ["10.0.0.0/16", "10.1.0.0/16"]
}

resource "aws_vpc" "vpc" {
  for_each             = { for idx, cidr_block in var.vpc_cidrs: cidr_block => idx}
  cidr_block           = each.key
  enable_dns_hostnames = true
  tags                 = { Name = format("Company%02d", each.value + 1) }
}
Run Code Online (Sandbox Code Playgroud)


msm*_*ens 6

for_each与 set 一起使用时each.key以及each.value是相同的。

要生成“Company01”、“Company02”等字符串,您需要列表中每个 CIDR 块的索引。一种方法是使用如下for表达式创建本地地图:

locals {
  vpc_cidrs = {for s in var.vpc_cidrs: index(var.vpc_cidrs, s) => s}
}

resource "aws_vpc" "vpc" {
  for_each             = local.vpc_cidrs
  cidr_block           = each.value
  enable_dns_hostnames = true
  tags                 = { Name = "Company0${each.key}" }
}
Run Code Online (Sandbox Code Playgroud)

作为奖励,您可以使用format函数来构建零填充的名称字符串:

resource "aws_vpc" "vpc" {
  ...
  tags                 = { Name = format("Company%02d", each.key) }
}
Run Code Online (Sandbox Code Playgroud)