You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
}

处理逻辑说明:

  1. 读取文件完整内容后,通过trimspace()去掉首尾可能存在的换行、空格
  2. 用split(",", ...)按逗号将整段字符串拆分为字符串列表
  3. 遍历列表元素,通过replace()移除每个值包裹的双引号,再用tonumber()将字符串转换为数值类型
  4. 转换为集合后传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 21:24:20