如何在Terraform中为Logic App的JSON模板注入变量
问题1:调整后模板的部署方法
你当前的Terraform代码存在两处明显问题:一是仅定义了空的Logic App工作流资源,未关联修改后的模板内容;二是templatefile函数调用语法错误,括号写反且未接收渲染结果。可选择以下两种方案完成部署:
方案1:直接通过azurerm_logic_app_workflow资源部署
先渲染模板并提取工作流配置,传入资源的对应属性即可,代码示例如下:
terraform { required_providers { azurerm = { configuration_aliases = [azurerm.env, azurerm.mgmt] } } } # 渲染Logic App模板并提取配置 locals { logic_app_template = templatefile("${path.module}/LogicAppStorageReplicationTemplate.json", { subscription = var.subscription_id, resource_group = var.resource_group, resource_location = var.resource_location, container = var.container }) workflow_definition = jsondecode(local.logic_app_template).resources[0].properties.definition workflow_parameters = jsondecode(local.logic_app_template).resources[0].properties.parameters } resource "azurerm_logic_app_workflow" "storage_replication" { name = "logic-app-storage-replication-${var.environment_name}-${var.resource_location}" location = var.resource_location resource_group_name = var.resource_group workflow_definition = local.workflow_definition workflow_parameters = local.workflow_parameters identity { type = "SystemAssigned" } }
方案2:通过ARM模板部署资源直接部署
如果不想拆分模板内容,可直接调用Azure的ARM部署资源完成部署,代码示例如下:
resource "azurerm_resource_group_template_deployment" "logic_app_deploy" { name = "logic-app-deployment" resource_group_name = var.resource_group deployment_mode = "Incremental" template_content = templatefile("${path.module}/LogicAppStorageReplicationTemplate.json", { subscription = var.subscription_id, resource_group = var.resource_group, resource_location = var.resource_location, container = var.container }) }
注意:你当前的ARM模板中identity节点写死了principalId和tenantId,需要删除这两个字段,仅保留
"type": "SystemAssigned"即可,否则部署会报错,系统分配标识的ID会在部署时自动生成。
问题2:存储账户连接缺失的处理方案
Azure门户导出模板时默认不会导出API连接的完整资源定义,仅会保留连接ID的引用,可按以下场景处理:
- 如果两个Blob连接(azureblob-4、azureblob-5)已经在目标环境的对应资源组中存在,直接确认模板中引用的连接ID和实际资源ID一致即可,部署后Logic App会自动复用现有连接。
- 如果目标环境不存在这两个连接,可在ARM模板的resources数组中新增连接资源定义,示例配置如下,添加后部署时会自动创建对应连接:
{ "type": "Microsoft.Web/connections", "apiVersion": "2016-06-01", "name": "azureblob-4", "location": "${resource_location}", "properties": { "api": { "id": "/subscriptions/${subscription}/providers/Microsoft.Web/locations/${resource_location}/managedApis/azureblob" }, "parameterValues": { "accountName": "<源存储账户名>", "accessKey": "<源存储账户访问密钥>" } } }, { "type": "Microsoft.Web/connections", "apiVersion": "2016-06-01", "name": "azureblob-5", "location": "${resource_location}", "properties": { "api": { "id": "/subscriptions/${subscription}/providers/Microsoft.Web/locations/${resource_location}/managedApis/azureblob" }, "parameterValues": { "accountName": "<目标存储账户名>", "accessKey": "<目标存储账户访问密钥>" } } }
后续对接Key Vault时,直接将访问密钥的取值替换为Key Vault的secret引用即可,无需明文写入模板。
内容的提问来源于stack exchange,提问作者Richard Wolford
相关产品推荐
相关产品推荐

