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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:30:04