Terraform for_each遍历字符串列表创建random_pet资源报错求助
问题原因
报错由两个核心问题导致:
- 属性引用错误:代码里写的
tfe_variable.names.key取的是tfe_variable资源本身的key参数值,也就是你定义的固定字符串"name_prefixes"。toset()函数要求传入可迭代的集合类型参数,传入单个字符串自然触发「无法将字符串转换为集合」的错误。 - 资源逻辑理解偏差:
tfe_variable的作用是向指定ID的Terraform Cloud(TFC)工作区写入变量配置,这些变量是供目标工作区后续触发的Terraform运行使用的,不会自动注入到你当前执行apply的上下文里。就算把引用改成tfe_variable.names.value,拿到的也只是序列化后的字符串,不会自动解析成你需要的列表类型。
修正方案
根据你的实际使用场景选对应方案即可:
场景1:仅需在当前配置中读取yaml文件生成random_pet
不需要额外定义tfe_variable,直接通过本地值读取解析yaml文件即可,代码最简洁:
locals { # 用path.module拼接路径,避免执行目录变化导致file寻址失败 name_prefixes = yamldecode(file("${path.module}/names_list.yaml")) } resource "random_pet" "pet" { for_each = toset(local.name_prefixes) prefix = each.key }
场景2:需要同时管理TFC工作区变量 + 在当前配置生成资源
不要通过引用tfe_variable资源属性拿值,直接复用解析后的本地值即可,避免绕路:
locals { name_prefixes = yamldecode(file("${path.module}/names_list.yaml")) } # 负责把变量写入TFC工作区 resource "tfe_variable" "names" { key = "name_prefixes" value = jsonencode(local.name_prefixes) workspace_id = "ws-id" hcl = true category = "terraform" } # 直接用本地值创建资源 resource "random_pet" "pet" { for_each = toset(local.name_prefixes) prefix = each.key }
场景3:random_pet资源是跑在目标TFC工作区的业务代码
把变量管理和业务代码拆分,业务代码里先声明对应类型的输入变量,再引用变量创建资源:
# 业务配置开头先声明变量,和TFC里存储的变量对应 variable "name_prefixes" { type = list(string) default = [] } resource "random_pet" "pet" { for_each = toset(var.name_prefixes) prefix = each.key }
这种场景下,单独跑变量管理的配置把列表值写入TFC工作区后,后续在该工作区执行业务代码时,TFC会自动把name_prefixes变量注入运行上下文,不需要额外读文件。
内容的提问来源于stack exchange,提问作者Jaimin Joshi
相关产品推荐
相关产品推荐

