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

如何在Terraform中调用Kudu相关方法完成Azure Web App部署?

在Terraform中调用Kudu操作完成Azure Linux Web App部署

核心思路

Terraform本身没有直接集成Kudu的资源,但可以通过local-exec、null_resource配合Azure CLI/PowerShell脚本,或是直接调用Kudu REST API,实现Web App创建后的命令执行需求。

方法一:用local-exec调用Azure CLI

在Web App资源创建完成后,通过local-exec provisioner调用Azure CLI获取Kudu凭据并执行命令:

resource "azurerm_linux_web_app" "demo_app" {
  name                = "demo-linux-app"
  resource_group_name = azurerm_resource_group.demo_rg.name
  location            = azurerm_resource_group.demo_rg.location
  service_plan_id     = azurerm_service_plan.demo_plan.id

  site_config {
    application_stack {
      python_version = "3.11"
    }
  }
}

resource "null_resource" "kudu_deploy" {
  depends_on = [azurerm_linux_web_app.demo_app]

  provisioner "local-exec" {
    command = <<EOT
      # 获取Kudu FTP发布凭据
      KUDU_CREDS=$(az webapp deployment list-publishing-profiles --name ${azurerm_linux_web_app.demo_app.name} --resource-group ${azurerm_resource_group.demo_rg.name} --query "[?publishMethod=='FTP'].{user:userName,pass:publishPassword}" -o tsv)
      KUDU_USER=$(echo $KUDU_CREDS | cut -f1)
      KUDU_PASS=$(echo $KUDU_CREDS | cut -f2)
      
      # 调用Kudu REST API执行shell命令(示例:列出站点根目录内容)
      curl -u $KUDU_USER:$KUDU_PASS -X POST https://${azurerm_linux_web_app.demo_app.name}.scm.azurewebsites.net/api/command -H "Content-Type: application/json" -d '{"command":"ls -la /home/site/wwwroot"}'
    EOT
  }
}
  • 必须设置depends_on,确保Web App完全创建后再触发Kudu操作
  • 可根据实际需求替换curl请求的命令体,比如执行部署脚本、上传静态文件等

方法二:用PowerShell脚本调用Kudu API

若习惯使用PowerShell,可在local-exec中执行PowerShell命令:

resource "null_resource" "kudu_powershell" {
  depends_on = [azurerm_linux_web_app.demo_app]

  provisioner "local-exec" {
    interpreter = ["pwsh", "-Command"]
    command = <<EOT
      $webAppName = "${azurerm_linux_web_app.demo_app.name}"
      $resourceGroupName = "${azurerm_resource_group.demo_rg.name}"
      
      # 获取发布凭据
      $publishingProfile = az webapp deployment list-publishing-profiles --name $webAppName --resource-group $resourceGroupName --query "[?publishMethod=='FTP']" | ConvertFrom-Json
      $kuduCreds = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$($publishingProfile.userName):$($publishingProfile.publishPassword)"))
      
      # 调用Kudu API创建演示目录
      $apiUrl = "https://$webAppName.scm.azurewebsites.net/api/command"
      $body = @{ command = "mkdir /home/site/wwwroot/demo" } | ConvertTo-Json
      Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization = "Basic $kuduCreds"} -Method Post -Body $body -ContentType "application/json"
    EOT
  }
}

方法三:用Terraform的http provider直接调用Kudu API

如果不想依赖本地执行环境,可使用Terraform内置的http provider发起API请求:

# 获取Web App发布凭据
data "azurerm_web_app_publishing_profile" "demo_app" {
  name                = azurerm_linux_web_app.demo_app.name
  resource_group_name = azurerm_resource_group.demo_rg.name
}

# 调用Kudu API克隆代码仓库
resource "http" "kudu_command" {
  depends_on = [azurerm_linux_web_app.demo_app]

  url = "https://${azurerm_linux_web_app.demo_app.name}.scm.azurewebsites.net/api/command"
  method = "POST"
  headers = {
    Authorization = "Basic ${base64encode("${data.azurerm_web_app_publishing_profile.demo_app.ftp_username}:${data.azurerm_web_app_publishing_profile.demo_app.ftp_password}")}"
    Content-Type = "application/json"
  }
  body = jsonencode({
    command = "cd /home/site/wwwroot && git clone https://github.com/your-repo/demo-app.git"
  })
}
  • 该方式完全在Terraform内部处理,无需本地安装Azure CLI或PowerShell,但调试难度略高于脚本方式

销毁环境的注意事项

由于你的环境为演示后销毁,只需确保所有Kudu操作相关资源(如null_resource、http资源)与Web App通过depends_on关联,Terraform销毁时会自动清理所有关联资源。Kudu操作产生的文件会随Web App销毁一并删除,无需额外处理残留内容。

内容的提问来源于stack exchange,提问作者TheDemonLord

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 21:13:10