如何将flatten()结果转为string集合适配Terraform的for_each
解决Terraform中flatten结果转set(string)的问题
你的核心问题是flatten()返回的tuple类型不满足aws_s3_object的for_each参数要求,只需要把结果转换为set(string)即可,以下是两种具体实现方式:
方法1:用toset转换flatten结果
假设你当前的locals代码为:
locals { database_names = flatten([ for endpoint in var.source_endpoints : endpoint.databases ]) }
在外层套一层toset(),直接将tuple转成set(string):
locals { database_names = toset(flatten([ for endpoint in var.source_endpoints : endpoint.databases ])) }
方法2:直接用双层for生成set
跳过flatten(),通过嵌套for循环直接生成列表后转成set,写法更简洁:
locals { database_names = toset([ for endpoint in var.source_endpoints : for db in endpoint.databases : db ]) }
额外说明
如果数据库名存在重复场景,toset()会自动去重。若需要保留所有条目(或提前发现重复问题),可以转成map类型,将每个数据库名同时作为key和value:
locals { database_names = { for db in flatten([ for endpoint in var.source_endpoints : endpoint.databases ]) : db => db } }
这种map类型同样符合for_each的参数要求,且出现重复时Terraform会直接报错提醒,避免潜在问题。
内容的提问来源于stack exchange,提问作者Ross Bush
相关产品推荐
相关产品推荐

