通过 Terraform 在可用子网中动态分发 EC2



要求是从动态给定的列表instance_names创建EC2,并将它们均匀地分布在VPC的可用子网中。 我尝试过循环和条件语句,但运气不佳。

用例 01 -(在具有两个子网的 VPC 中(如果我们要创建 2 服务器,一个 EC2 应位于子网"a"中,另一个应位于子网"b"中

用例 02 -(在具有两个子网的 VPC 中(如果我们要创建 3 服务器,两个 EC2 需要位于子网"a"中,另一个 EC2 位于子网中 "b">

控制代码

module "servers" {
source = "modules/aws-ec2"
instance_type     = "t2.micro"
instance_names    = ["server01", "server02", "server03"]
subnet_ids        = module.prod.private_subnets
}

模块

resource "aws_instance" "instance" {
count      = length(var.instance_names)
subnet_id  = var.subnet_ids[count.index]
tags = {
Name     = var.instance_names[count.index]
}
}

您可以使用element遍历subnet_ids列表并获取每个aws_instance的正确 id。

在文档中,您可以看到element将为您提供所需的效果,因为:

如果给定索引大于列表的长度,则通过将索引模数作为列表的长度来"环绕">

索引
Use Case 1 
-> server01 - subnet 'a' <-> element(subnet_ids,0)
-> server02 - subnet 'b' <-> element(subnet_ids,1)
Use Case 2
-> server01 | subnet 'a' <-> element(subnet_ids,0)
-> server02 | subnet 'b' <-> element(subnet_ids,1)
# loop around the subnet id list the first id again
-> server03 | subnet 'a' <-> element(subnet_ids,2)
-> server04 | subnet 'b' <-> element(subnet_ids,3)
-> etc.

因此,对代码的以下更新应该有效:

resource "aws_instance" "instance" {
count      = length(var.instance_names)
subnet_id  = element(var.subnet_ids, count.index)
tags = {
Name     = var.instance_names[count.index]
}
}

我从Tom Lime那里找到了一个有趣的答案,用于类似的问题。我从中得出了这个场景的答案。对于模块,我们为subnet_id提供了以下逻辑

subnet_id = "${var.subnet_ids[ count.index % length(var.subnet_ids) ]}"

相关内容

  • 没有找到相关文章

最新更新