要求是从动态给定的列表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) ]}"