如何通过ARM模板创建‘删除旧Blob’自动化任务?
如何通过ARM模板创建Azure“删除旧Blob”自动化任务
从Azure门户的存储账户创建「删除旧Blob」自动化任务后,会生成一个AutomationTask类型的Logic App,以及自动命名的Azure Blob存储API连接。直接导出ARM模板重新部署时,大概率会碰到两个棘手错误:
Error:The managedBy resource id is missing in workflow 'CleanBlob-Daily'. ManagedBy must be provided if resource kind is 'AutomationTask'- 使用
reference函数引用Managed API时,出现resourceId函数参数不足的验证错误
下面是针对性的解决步骤:
1. 给Logic App补上managedBy属性
这类从存储账户生成的自动化任务Logic App,因为类型是AutomationTask,必须指定managedBy字段,值为对应的存储账户资源ID。
在ARM模板的Logic App资源定义里,添加这两个关键属性:
"kind": "AutomationTask", "managedBy": "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
2. 正确配置API连接的参数
引用Azure Blob的Managed API时,resourceId函数需要两个参数:区域和API名称,之前的错误就是因为少传了区域参数。
正确的$connections参数配置示例:
"parameters": { "$connections": { "value": { "azureblob": { "id": "[resourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azureblob')]", "connectionName": "[parameters('apiConnectionName')]", "connectionId": "[resourceId('Microsoft.Web/connections', parameters('apiConnectionName'))]" } } } }
如果不想用动态生成,也可以直接写静态资源ID(替换你的订阅ID和区域):
"id": "/subscriptions/你的订阅ID/providers/Microsoft.Web/locations/francecentral/managedApis/azureblob"
另外,如果你要新建API连接,得在模板里包含连接资源的定义,示例如下:
{ "type": "Microsoft.Web/connections", "apiVersion": "2016-06-01", "name": "[parameters('apiConnectionName')]", "location": "[parameters('location')]", "properties": { "api": { "id": "[resourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azureblob')]" }, "displayName": "[parameters('apiConnectionName')]", "parameterValues": { "accountName": "[parameters('storageAccountName')]", "accessKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-04-01').keys[0].value]" } } }
3. 完整模板关键片段参考
把以上配置整合后的核心部分:
"parameters": { "storageAccountName": { "type": "string" }, "location": { "type": "string" }, "apiConnectionName": { "type": "string", "defaultValue": "[concat('azureblob-', parameters('storageAccountName'))]" }, "$connections": { "value": { "azureblob": { "id": "[resourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azureblob')]", "connectionName": "[parameters('apiConnectionName')]", "connectionId": "[resourceId('Microsoft.Web/connections', parameters('apiConnectionName'))]" } } } }, "resources": [ // API连接资源 { "type": "Microsoft.Web/connections", "apiVersion": "2016-06-01", "name": "[parameters('apiConnectionName')]", "location": "[parameters('location')]", "properties": { "api": { "id": "[resourceId('Microsoft.Web/locations/managedApis', parameters('location'), 'azureblob')]" }, "displayName": "[parameters('apiConnectionName')]", "parameterValues": { "accountName": "[parameters('storageAccountName')]", "accessKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2021-04-01').keys[0].value]" } } }, // Logic App资源 { "type": "Microsoft.Logic/workflows", "apiVersion": "2017-07-01", "name": "CleanBlob-Daily", "location": "[parameters('location')]", "kind": "AutomationTask", "managedBy": "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]", "properties": { "state": "Enabled", "definition": { // 这里粘贴你导出模板里的工作流定义内容 }, "parameters": { "$connections": "[parameters('$connections')]" } }, "dependsOn": [ "[resourceId('Microsoft.Web/connections', parameters('apiConnectionName'))]" ] } ]
注意事项
managedBy的值必须严格指向创建自动化任务的存储账户,这是AutomationTask类型Logic App的强制要求- 部署模板的用户需要具备存储账户的密钥读取权限(比如
Storage Account Key Operator Service Role),否则无法获取访问密钥创建连接 - API连接必须在Logic App之前部署,所以要加上
dependsOn依赖关系
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

