Terraform传递对象列表至Azure容器应用模块报错解决
解决Terraform Azure Container App Secrets传递错误
问题根源
报错提示secret.value is list of object,说明模块内的dynamic "secret"块遍历的是列表的列表,而非单个{name, value}对象的列表——每个迭代项拿到的是整个secrets列表,而非单个密钥对象,自然无法直接访问.name/.value属性。
修复步骤
1. 修正模块内的dynamic块遍历逻辑
打开模块的main.tf,找到azurerm_container_app资源下的dynamic "secret"块,确保for_each直接指向定义的secrets变量(而非嵌套的列表或其他结构):
dynamic "secret" { # 确保这里遍历的是单个对象组成的列表,比如var.secrets for_each = var.secrets content { name = secret.value.name value = secret.value.value } }
如果模块原本的for_each写成了[var.secrets](把整个列表包装成了单元素列表),会导致每个迭代项是整个secrets列表,必须改成直接遍历var.secrets。
2. 确保传入的变量格式匹配模块要求
检查模块variables.tf中secrets的定义,确认是单个对象的列表:
variable "secrets" { type = list(object({ name = string value = string })) description = "Container App的密钥列表" }
在调用模块时,传入符合结构的列表,直接引用变量或其他模块输出:
module "container_app" { source = "./modules/container_app" # 传入正确格式的密钥列表 secrets = [ { name = "DB_PASSWORD" value = var.db_password }, { name = "API_KEY" value = module.keyvault.api_key_value } ] }
注意不要将secrets嵌套在其他对象中(比如config = { secrets = [...] }),除非模块变量明确要求这种嵌套结构。
3. 验证配置
执行terraform plan检查是否还有错误,确认每个密钥对象都能被正确解析。
内容的提问来源于stack exchange,提问作者JordanBean
相关产品推荐
相关产品推荐

