如何在Terraform中使用chunklist生成由分块数组构成的map?
错误原因
你遇到的报错是因为chunklist返回的是嵌套列表结构,你尝试将子列表直接作为Map的键,而Terraform要求Map的键必须是字符串类型,因此触发类型校验错误。
解决方案
你可以先对set类型的var.test做稳定排序,保证每次生成的列表顺序固定,避免set随机遍历导致的资源意外重建,再对排序后的列表分块,最后生成带locationN格式字符串键的Map,完全符合你的需求:
locals { # 对set做字典序稳定排序,元素不变的情况下排序结果永远固定 sorted_zones = sort(var.test) # 按每4个元素分块,生成目标结构Map locations = { for idx, zone_group in chunklist(local.sorted_zones, 4) : format("location%d", idx + 1) => zone_group } }
上述代码输出的local.locations结构和你要求的完全一致:
locations = { location1 = ["asia-east1-a", "asia-east1-b", "asia-east1-c", "asia-east2-a"] location2 = ["europe-west2-a", "europe-west2-b", "europe-west2-c", "europe-west3-a"] }
适配无意外重建要求
你担心的list顺序变化问题在这里不会出现:
sort函数会按照字符串字典序对set元素进行稳定排序,只要var.test集合内的元素不变,排序后的列表顺序永远固定,不会出现set随机遍历的问题- 分块后的键使用
location+序号的固定格式,即使后续删除集合内的某个元素,也只会修改对应分块的内容,不会导致所有分块的键整体偏移,避免无关资源被销毁重建
配合Bigtable动态块使用示例
resource "google_bigtable_instance" "default" { name = "test-bigtable" project = "你的项目ID" instance_type = "PRODUCTION" dynamic "cluster" { # 扁平化所有分块内的可用区作为遍历对象 for_each = toset(flatten(values(local.locations))) content { cluster_id = "cluster-${replace(cluster.value, "-", "")}" zone = cluster.value num_nodes = 3 } } }
内容的提问来源于stack exchange,提问作者red888
相关产品推荐
相关产品推荐

