使用 Terraform 和 Azure DevOps 的 Azure Web App CI/CD 部署
Source: Dev.to
介绍
本项目演示了一个端到端的 DevOps 工作流,用于将 Web 应用部署到 Microsoft Azure。基础设施使用 Terraform 进行供应,应用部署通过 Azure DevOps CI/CD 流水线实现自动化。
目标是展示基础设施即代码(IaC)、流水线自动化以及使用 Azure App Service 的云原生部署。
概念
Azure App Service: 一个完全托管的平台,用于构建、部署和扩展 Web 应用和 API。它支持多种语言和框架,提供内置的基础设施维护、安全补丁和扩展能力。
Azure Web App: 基于 HTTP 的服务,用于托管 Web 应用、REST API 和移动后端。它是托管在 App Service 平台上的一种特定类型的应用。
前置条件
- Azure 订阅
- Azure DevOps 组织
- Azure DevOps 仓库
- 具备足够权限的 Azure Service Connection
- 已安装 Terraform(v1.x)
仓库 Azure DevOps 结构
AzureAppService/
├── index.html
└── azure-pipeline.yml
步骤 1:准备 Terraform 配置文件
以下 Terraform 配置会供应托管 Web 应用所需的 Azure 基础设施。
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0"
}
}
}
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "main" {
name = "Hawkins"
location = "West Europe"
}
resource "azurerm_app_service_plan" "main" {
name = "asp-devops-lab"
location = azurerm_resource_group.main.location
resource_group_name = azurerm_resource_group.main.name
sku {
tier = "Free"
size = "F1"
}
}
resource "azurerm_app_service" "webapp" {
name = "webapp-devops-lab-2026"
location = azurerm_resource_group.main.location
resource_group_name = azurerm_resource_group.main.name
app_service_plan_id = azurerm_app_service_plan.main.id
}
步骤 2:Terraform 命令
terraform init
terraform plan
terraform apply
步骤 3:为 Azure DevOps 创建文件
流水线会打包 Web 应用并通过 Azure Service Connection 部署到 Azure App Service。
trigger:
branches:
include:
- main
pool:
vmImage: 'ubuntu-latest'
steps:
- task: ArchiveFiles@2
inputs:
rootFolderOrFile: '$(System.DefaultWorkingDirectory)'
includeRootFolder: false
archiveType: 'zip'
archiveFile: '$(Build.ArtifactStagingDirectory)/webapp.zip'
replaceExistingArchive: true
- task: AzureWebApp@1
inputs:
azureSubscription: 'Thor-Service-Connection'
appName: 'webapp-devops-lab-2026'
package: '$(Build.ArtifactStagingDirectory)/webapp.zip'
步骤 4:部署应用
在 Azure DevOps 中运行流水线。流水线将自动打包并部署 Web 应用。

步骤 5:验证部署
流水线完成后,验证 Web 应用是否可以通过其 Azure App Service URL 访问。
