如何在Terraform的for_each循环中为每个迭代分配不同子网列表?
解决方案
要实现每个ASG的子网列表循环移位,你可以通过计算当前实例在有序键列表中的索引,结合slice和concat函数实现循环偏移,对应的Terraform表达式如下:
module my-module { for_each = local.instances subnets = concat( slice(local.subnet_list, index(sort(keys(local.instances)), each.key), length(local.subnet_list)), slice(local.subnet_list, 0, index(sort(keys(local.instances)), each.key)) ) }
核心逻辑说明
sort(keys(local.instances)):将实例map的键按字母排序,得到稳定的有序实例列表(你的场景中会生成["iA", "iB", "iC", "iD"]),确保迭代顺序和你预期的一致。index(..., each.key):获取当前实例键在有序列表中的位置索引(iA对应0,iB对应1,iC对应2,iD对应3)。slice+concat:根据索引拆分子网列表后重新拼接,实现循环移位:- 索引0:拆分后拼接结果为原子网列表
["1a", "1b", "1c"] - 索引1:拼接结果为
["1b", "1c", "1a"] - 索引2:拼接结果为
["1c", "1a", "1b"] - 索引3:因子网列表长度为3,3取模后等价于0,结果回到原列表
- 索引0:拆分后拼接结果为原子网列表
自定义实例顺序(可选)
如果你的实例键不满足字母排序逻辑,需要严格按定义顺序分配子网,可以先在locals中指定实例的有序列表:
locals { subnet_list = ["1a", "1b", "1c"] instance_order = ["iA", "iB", "iC", "iD"] # 自定义迭代顺序 instances = { iA = { disk = "50GB" }, iB = { type = "t2.medium" }, iC = {}, iD = { disk = "10GB" } } } module my-module { for_each = local.instances subnets = concat( slice(local.subnet_list, index(local.instance_order, each.key), length(local.subnet_list)), slice(local.subnet_list, 0, index(local.instance_order, each.key)) ) }
这样无论实例键的字母顺序如何,都会按照instance_order的定义完成子网偏移。
内容的提问来源于stack exchange,提问作者Not J Tapper
相关产品推荐
相关产品推荐

