You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:无法通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 15:37:57