使用Terraform创建Azure Logic App时workflow_parameters输入报错
报错内容
错误:属性值类型不正确
在模块文件
../../modules/logic_app_workflow/main.tf第8行的azurerm_logic_app_workflow资源定义中:
8: workflow_parameters = { for k,v in each.value["workflow_parameters"] : k =>jsonencode(v) }
|----------------
| each.value["workflow_parameters"] 是包含1个属性"connection"的对象属性"workflow_parameters"的取值不恰当:元素"connection"需要字符串类型。
相关代码
模块定义
resource "azurerm_logic_app_workflow" "logic_app_workflow" { for_each = var.logic_app_workflows name = each.value["name"] location = each.value["location"] resource_group_name = each.value["resource_group_name"] enabled = each.value["enabled"] workflow_parameters = { for k,v in each.value["workflow_parameters"] : k =>jsonencode(v) } tags = each.value["logic_app_workflow_tags"] }
变量定义
variable "logic_app_workflows" { type = map(object({ name = string location = string resource_group_name = string enabled = bool workflow_parameters = any logic_app_workflow_tags = map(string) })) }
tfvars配置
logic_app_workflows = { logic_app_workflow1 = { name = "test-logic" location = "canadacentral" resource_group_name = "test-rg" enabled = true workflow_parameters = { connection = { defaultValue = {} type = { type = "Object" } } } logic_app_workflow_tags = { applicationName = "Logic App workflow" } } }
问题分析
报错核心是Terraform推断workflow_parameters的元素类型不符合要求:azurerm_logic_app_workflow资源的workflow_parameters字段要求是**map(string)**类型(每个值为JSON格式的字符串),但当前变量定义中workflow_parameters设为any,导致Terraform无法正确识别内部嵌套结构的类型,进而无法正确执行jsonencode转换为字符串。
解决方案
方案1:修正变量类型定义
将变量中workflow_parameters的类型从any改为map(any),明确这是一个键值对结构,确保Terraform能正确识别每个值为可被JSON编码的对象:
variable "logic_app_workflows" { type = map(object({ name = string location = string resource_group_name = string enabled = bool workflow_parameters = map(any) # 修改此处 logic_app_workflow_tags = map(string) })) }
保持模块中的workflow_parameters处理代码不变,重新执行terraform plan/apply即可。
方案2:强制转换为map(string)
如果方案1仍未解决问题,可以在模块中强制将转换后的结果转为map(string)类型:
workflow_parameters = tomap({ for k,v in each.value["workflow_parameters"] : k => jsonencode(v) })
额外建议
确保使用的azurerm provider为最新稳定版本,避免版本兼容问题。可以在versions.tf中指定:
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = ">= 3.0.0" # 使用最新稳定版 } } }
内容的提问来源于stack exchange,提问作者lviswa

