Terraform中for_each元参数能否配合file函数批量创建资源?
报错原因
file()函数仅会将目标文件的全部内容读取为单个字符串类型值,不会自动解析逗号分隔的结构化内容,直接将整段字符串传入toset(),本质是尝试将单值字符串转换为集合类型,因此触发类型不匹配错误。- 额外注意:
random_string资源的length参数要求传入数值类型,即使成功拆分了字符串,直接传入字符串格式的数字也会触发参数校验错误。
实现方案
方案1:兼容现有文件格式
你当前文件存储的是带双引号、逗号分隔的数值,直接通过内置函数解析处理即可,修正后的代码如下:
resource "random_string" "any_string" { for_each = toset( [for num_str in split(",", trimspace(file("string_number_file.txt"))) : tonumber(replace(num_str, "\"", ""))] ) length = each.key }
处理逻辑说明:
- 读取文件完整内容后,通过
trimspace()去掉首尾可能存在的换行、空格 - 用
split(",", ...)按逗号将整段字符串拆分为字符串列表 - 遍历列表元素,通过
replace()移除每个值包裹的双引号,再用tonumber()将字符串转换为数值类型 - 转换为集合后传入
for_each,即可生成3个length分别为10、12、13的random_string资源。
方案2:优化文件格式(推荐)
将string_number_file.txt改为每行存储一个数值,格式如下,后续维护更简单,也不需要处理多余的引号:
10 12 13
对应Terraform代码可简化为:
resource "random_string" "any_string" { for_each = toset( [for line in split("\n", trimspace(file("string_number_file.txt"))) : tonumber(line) if trimspace(line) != ""] ) length = each.key }
该写法会自动跳过文件中的空行,避免多余的解析错误。
内容的提问来源于stack exchange,提问作者Jaimin Joshi
相关产品推荐
相关产品推荐

