Amazon web services Terraform-AWS-创建多个实例-不同的AZ(其中实例计数大于AZ列表长度)

Amazon web services Terraform-AWS-创建多个实例-不同的AZ(其中实例计数大于AZ列表长度),amazon-web-services,amazon-ec2,terraform,terraform-provider-aws,Amazon Web Services,Amazon Ec2,Terraform,Terraform Provider Aws,我在Terraform(v0.12)中遇到一个问题,即使用count变量和子网id列表创建多个实例,其中count大于子网id列表的长度 比如, resource "aws_instance" "main" { count = 20 ami = var.ami_id instance_type = var.instance_type # ... subnet_id

我在Terraform(v0.12)中遇到一个问题,即使用count变量和子网id列表创建多个实例,其中count大于子网id列表的长度

比如,

resource "aws_instance" "main" {
  count                     = 20
  ami                       = var.ami_id
  instance_type             = var.instance_type
  # ...
  subnet_id                 = var.subnet_ids_list[count.index]
}
其中我的计数为“20”,长度(变量子网ID列表)为2。它抛出以下错误:

count.index is 2
    var.instance_subnet_id is tuple with 2 elements

The given key does not identify an element in this collection value.
我尝试将“子网ID列表”设置为逗号分隔的字符串,并使用“拆分”,但它也会给出相同的错误

后来考虑将子网元素附加到“子网ID列表”中,以使其成为“20”。有点像

Python 2.7
>>> subnet_ids_list = subnet_ids_list * 10
有人能帮助我如何实现类似的地形或任何其他方法来解决这个问题

原汁原味

subnet_ids_list = ["sub-1", "sub-2"]
转换为-满足提供给count的值

subnet_ids_list = ["sub-1", "sub-2", "sub-1", "sub-2",....., "sub-1", "sub-2",] (length=20).

我不想为此使用AWS自动缩放组。

每当需要启动新EC2时,创建新子网是没有意义的。我建议您查看有关VPC和子网基础知识的官方文档:

例如,如果使用CIDR block 10.0.0.0/24创建VPC,它支持256个IP地址。您可以将此CIDR块分成两个子网,每个子网支持128个IP地址。一个子网使用CIDR块10.0.0.0/25(用于地址10.0.0.0-10.0.0.127),另一个子网使用CIDR块10.0.0.128/25(用于地址10.0.0.128-10.0.0.255)

在您的Terraform示例中,看起来您有2个子网(私有和公共?),所以在访问子网ID列表时,计数器必须是0或1。更好的解决方案是标记子网:

不过,您可能有另一个计数器来控制实例的数量。希望有帮助

编辑:根据您的评论,映射是控制实例/子网的更好的数据结构。密钥可以是实例或子网本身,例如
{“aws_instance”=“sub-1”}

参考资料:

如果需要循环浏览链接文档中提到的内容列表,可以使用:

该指数是以零为基础的。如果与一起使用,此函数将产生错误 空名单

在大多数情况下,使用内置索引语法列表[index]。用这个 函数仅用于特殊的附加“环绕”行为 如下所述


谢谢@fabio manzano的回答。我同意你的看法。我也很抱歉,也许我应该用另一种方式解释。我的目的不是为每个实例创建不同的子网。相反,执行以下操作以满足计数要求;原始的;子网ID_列表=[“sub-1”,sub-2”]扩展以满足计数要求:子网ID_列表=[“sub-1”,sub-2”,“sub-1”,sub-2”,“sub-1”,sub-2”,“sub-1”,sub-2”]你认为,这是一个可能的选择吗?啊,我明白了。是的,但你似乎使用了错误的数据结构——为什么不使用一个映射,其中的键可以是实例或子网:
> element(["a", "b", "c"], 3)
a