求助:无法通过Terraform或AZ CLI在现有WebApp中创建新WebJob
解决Azure WebJob创建问题的方案
针对你在现有WebApp中创建连续/触发式WebJob的需求,以下是基于Azure CLI和Terraform的可行方案:
一、使用Azure CLI实现(通过调用Azure Management API)
Azure CLI虽无直接创建WebJob的命令,但可通过az rest调用官方管理API完成操作,分触发式和连续式两种场景:
1. 触发式WebJob
# 定义变量 SUBSCRIPTION_ID="你的订阅ID" RESOURCE_GROUP="资源组名称" WEBAPP_NAME="WebApp名称" WEBJOB_NAME="触发式WebJob名称" ZIP_PATH="你的ZIP包本地路径" SCRIPT_NAME="你的脚本文件名.ps1" CRON_SCHEDULE="0 */1 * * *" # 按需调整CRON表达式,无需定时可删除该参数 # 读取ZIP文件为base64编码 ZIP_BASE64=$(base64 -w 0 "$ZIP_PATH") # 调用API创建触发式WebJob az rest --method put \ --uri "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Web/sites/$WEBAPP_NAME/triggeredwebjobs/$WEBJOB_NAME?api-version=2022-09-01" \ --body '{ "properties": { "runCommand": "powershell.exe -File '"$SCRIPT_NAME"'", "schedule": "'"$CRON_SCHEDULE"'", "settings": {} }, "kind": "triggered", "properties": { "package": "'"$ZIP_BASE64"'" } }'
2. 连续式WebJob
# 定义变量 SUBSCRIPTION_ID="你的订阅ID" RESOURCE_GROUP="资源组名称" WEBAPP_NAME="WebApp名称" WEBJOB_NAME="连续式WebJob名称" ZIP_PATH="你的ZIP包本地路径" SCRIPT_NAME="你的脚本文件名.ps1" # 读取ZIP文件为base64编码 ZIP_BASE64=$(base64 -w 0 "$ZIP_PATH") # 调用API创建连续式WebJob az rest --method put \ --uri "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Web/sites/$WEBAPP_NAME/continuouswebjobs/$WEBJOB_NAME?api-version=2022-09-01" \ --body '{ "properties": { "runCommand": "powershell.exe -File '"$SCRIPT_NAME"'", "settings": { "is_singleton": true # 是否单实例运行,按需设置 } }, "kind": "continuous", "properties": { "package": "'"$ZIP_BASE64"'" } }'
二、使用Terraform实现
Terraform的AzureRM provider暂无直接管理WebJob的资源类型,可通过两种方式实现:
1. 使用azurerm_rest_resource(AzureRM Provider ≥3.0)
resource "azurerm_rest_resource" "triggered_webjob" { type = "Microsoft.Web/sites/triggeredwebjobs@2022-09-01" name = "${azurerm_app_service.your_webapp.name}/your-webjob-name" parent_id = azurerm_app_service.your_webapp.id body = jsonencode({ properties = { runCommand = "powershell.exe -File 你的脚本文件名.ps1" schedule = "0 */1 * * *" # 按需调整或删除 package = filebase64("path/to/your/webjob.zip") } kind = "triggered" }) }
2. 使用local-exec调用Azure CLI命令
resource "null_resource" "deploy_webjob" { provisioner "local-exec" { command = <<EOT az rest --method put \ --uri "/subscriptions/${var.subscription_id}/resourceGroups/${azurerm_resource_group.your_rg.name}/providers/Microsoft.Web/sites/${azurerm_app_service.your_webapp.name}/triggeredwebjobs/your-webjob-name?api-version=2022-09-01" \ --body '{ "properties": { "runCommand": "powershell.exe -File 你的脚本文件名.ps1", "schedule": "0 */1 * * *", "package": "'"${filebase64("path/to/your/webjob.zip")}"'" }, "kind": "triggered" }' EOT } depends_on = [azurerm_app_service.your_webapp] }
注意事项
- 替换所有占位符(订阅ID、资源组、WebApp名称等)为实际值
- 若ZIP包过大,建议先上传至Azure存储账户,再将请求体中的
package替换为packageUri并指向存储URL(需确保WebApp有权限访问存储) - 连续式WebJob需确保WebApp的始终开启功能已启用
内容的提问来源于stack exchange,提问作者Rajnish Kumar Singh
相关产品推荐
相关产品推荐

