如何配置Azure Terraform流水线检测非预期变更并终止执行
核心实现逻辑
你需要的能力完全可以通过terraform plan的-detailed-exitcode参数实现,该参数会返回三类状态码:
- 0:基础设施与Terraform配置、状态文件完全一致,无任何变更
- 1:Plan执行过程中出现错误(如权限不足、状态文件锁冲突)
- 2:检测到基础设施存在变更(包括配置与实际资源不一致、手动修改导致的漂移、新增未被管理的资源等)
你只需要在流水线中校验该返回码,非0时直接终止流程即可。
GitHub流水线实现示例
以下是适配你场景的GitHub Actions工作流配置,推送代码时自动触发校验:
name: 基础设施校验+应用部署 on: [push] jobs: infra-check: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 认证Azure uses: azure/login@v1 with: creds: ${{ secrets.AZURE_SERVICE_PRINCIPAL }} - name: 安装Terraform uses: hashicorp/setup-terraform@v3 - name: 初始化Terraform run: terraform init -backend-config="storage_account_name=<你的Azure存储账户名>" -backend-config="container_name=tfstate" -backend-config="key=prod.tfstate" -backend-config="access_key=${{ secrets.TF_STATE_STORAGE_KEY }}" - name: 执行漂移检测 id: tf_plan run: terraform plan -detailed-exitcode continue-on-error: true - name: 校验变更 if: steps.tf_plan.outputs.exitcode != 0 run: | echo "检测到基础设施存在非预期变更或执行错误,流水线终止" exit 1 - name: 应用代码部署 run: echo "基础设施无漂移,开始执行后续代码部署流程"
额外资源检测配置(匹配你的场景示例)
默认Terraform仅会校验自身管理的资源的漂移,如果你需要检测同资源组下手动新增的未被Terraform管理的资源(比如你提到的手动创建的第三个Web App),可以在Terraform配置中添加以下校验逻辑:
# 拉取当前资源组下所有Web App资源 data "azurerm_resources" "all_webapps" { resource_group_name = "<你的生产资源组名>" type = "Microsoft.Web/sites" } # 你当前用Terraform管理的Web App列表(这里替换为你实际定义的azurerm_app_service资源集合) locals { managed_webapp_names = [for app in azurerm_app_service.prod_webapps : app.name] existing_webapp_names = [for app in data.azurerm_resources.all_webapps.resources : app.name] unmanaged_webapps = setsubtract(local.existing_webapp_names, local.managed_webapp_names) } # 存在未被管理的Web App时主动触发变更 resource "null_resource" "unmanaged_webapp_check" { count = length(local.unmanaged_webapps) > 0 ? 1 : 0 provisioner "local-exec" { command = "echo 检测到未被Terraform管理的Web App资源: ${join(",", local.unmanaged_webapps)} && exit 1" } }
添加上述配置后,只要资源组下出现未在Terraform中定义的Web App,terraform plan就会返回2,流水线自动终止。
生产环境最佳实践
- 权限收敛:将团队成员的Azure生产环境权限设为只读,仅Terraform使用的服务主体拥有资源修改权限,从根源避免手动变更
- 状态文件保护:Terraform状态文件存储在Azure Blob存储中,开启版本控制、软删除和访问限制,禁止本地直接操作状态文件
- 定时漂移检测:除代码推送时的校验,配置每日定时任务执行
terraform plan -detailed-exitcode,主动检测漂移并告警,无需等待代码推送才发现问题 - 变更流程规范:所有基础设施变更必须走Terraform代码提交+PR审核流程,紧急手动变更后必须第一时间同步Terraform配置并执行
terraform refresh更新状态文件
内容的提问来源于stack exchange,提问作者Nayden Van
相关产品推荐
相关产品推荐

