Terraform 如何将创建的子网转换为地图数据以供以后代码使用?

Terraform 如何将创建的子网转换为地图数据以供以后代码使用?,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,首先,我创建了3个子网,我想把它们转换成地图形式,以便查找隐藏的代码。 例如: 下面是使用查找的代码 resource "aws_instance" "server" { count = 3 subnet_id = "${lookup(var.subnets, count.index % 3)}" } 我该怎么办?谢谢大家另一种方法是什么,它基于列表更具扩展性: variable "subnet_cidrs

首先,我创建了3个子网,我想把它们转换成地图形式,以便查找隐藏的代码。 例如:

下面是使用查找的代码

resource "aws_instance" "server" {
    count = 3
    subnet_id = "${lookup(var.subnets, count.index % 3)}"

}

我该怎么办?谢谢大家

另一种方法是什么,它基于列表更具扩展性:

variable "subnet_cidrs" {
    default = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
}

resource "aws_vpc" "module_vpc" {
  cidr_block       = "10.0.0.0/16"
  instance_tenancy = "default"
}

resource "aws_subnet" "subnet" {
  count      = length(var.subnet_cidrs)
  vpc_id     = aws_vpc.module_vpc.id
  cidr_block = element(var.subnet_cidrs, count.index)
}

resource "aws_instance" "server" {
    count = 3    
    subnet_id = element(aws_subnet.subnet.*.id, count.index) # modulo is automatically applied
}

我假设terraform 0.12,因为您没有指定任何其他版本。

为什么要将它们转换为地图,而不是使用列表,然后通过索引访问它们?谢谢您的提示,我将尝试您所说的方法!
元素
功能与普通列表索引不同的“特殊功能”是,如果给定索引高于列表长度,它会自动将模运算应用于该索引,因此最后一个表达式可能只是
元素(aws_subnet.subnet.*.id,count.index)
,否则,如果不依赖
元素
函数的自动包装功能,我可能只会将其写成
aws\u subnet.subnet[count.index%3].id
。@MartinAtkins谢谢。我不知道。我会更新答案。非常感谢你的回答。你的回答使我受益匪浅。我很高兴得到你的帮助,谢谢你。@NaviCN没问题。如果是这样的话,他会很感激你的回答。
resource "aws_instance" "server" {
    count = 3
    subnet_id = "${lookup(var.subnets, count.index % 3)}"

}
variable "subnet_cidrs" {
    default = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
}

resource "aws_vpc" "module_vpc" {
  cidr_block       = "10.0.0.0/16"
  instance_tenancy = "default"
}

resource "aws_subnet" "subnet" {
  count      = length(var.subnet_cidrs)
  vpc_id     = aws_vpc.module_vpc.id
  cidr_block = element(var.subnet_cidrs, count.index)
}

resource "aws_instance" "server" {
    count = 3    
    subnet_id = element(aws_subnet.subnet.*.id, count.index) # modulo is automatically applied
}