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

Bicep(ARM)状态跟踪机制及部署相关问题咨询

Bicep(ARM)状态管理相关问题

我熟悉Terraform的状态跟踪机制,它会根据配置自动增删资源,但对Bicep(ARM)的状态管理不太清楚。目前我通过GitHub Actions将Bicep文件部署到Azure资源组,部署脚本如下:

- name: Deploy
  uses: azure/arm-deploy@v2
  with:
    deploymentName: ${{ github.run_number }}
    scope: resourcegroup
    resourceGroupName: ${{ env.AZURE_RESOURCE_GROUP_NAME }}
    template: ./infrastructure/main.bicep
    parameters: >
      environmentType=${{ env.ENVIRONMENT }}
    failOnStdErr: false

部署后会生成一系列部署记录,但当我从Bicep文件中移除资源时,这些资源并没有被删除,只是被Bicep(ARM)忽略了。现提出以下三个问题:

  1. Bicep(ARM)的状态存储在何处?
  2. Bicep(ARM)如何识别并删除配置文件中不存在的资源?
  3. 如何将现有资源纳入Bicep(ARM)的状态管理?

附main.bicep代码:

@description('The Azure region into which the resources should be deployed.')
param location string = resourceGroup().location

@description('The type of environment. This must be dev or prod.')
@allowed([
  'dev'
  'prod'
])
param environmentType string

@description('A unique suffix to add to resource names that need to be globally unique.')
@maxLength(13)
param resourceNameSuffix string = uniqueString(resourceGroup().id)

var appServiceAppName = 'todo-website-${resourceNameSuffix}'
var appServicePlanName = 'todo-website-plan'
var appStorageAccountName = 'todoweb${resourceNameSuffix}'

// Define the SKUs for each component based on the environment type.
var environmentConfigurationMap = {
  dev: {
    appServicePlan: {
      sku: {
        name: 'F1'
        capacity: 1
      }
    }
    appStorageAccount: {
      sku: {
        name: 'Standard_LRS'
      }
    }
  }
  prod: {
    appServicePlan: {
      sku: {
        name: 'S1'
        capacity: 2
      }
    }
    appStorageAccount: {
      sku: {
        name: 'Standard_ZRS'
      }
    }
  }
}

var appStorageAccountConnectionString = 'DefaultEndpointsProtocol=https;AccountName=${appStorageAccount.name};EndpointSuffix=${environment().suffixes.storage};AccountKey=${appStorageAccount.listKeys().keys[0].value}'

resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
  name: appServicePlanName
  location: location
  sku: environmentConfigurationMap[environmentType].appServicePlan.sku
}

resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
  name: appServiceAppName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
    siteConfig: {
      appSettings: [
        {
          name: 'appStorageAccountConnectionString'
          value: appStorageAccountConnectionString
        }
      ]
    }
  }
}

resource appStorageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: appStorageAccountName
  location: location
  kind: 'StorageV2'
  sku: environmentConfigurationMap[environmentType].appStorageAccount.sku
}

问题解答

1. Bicep(ARM)的状态存储在何处?

Bicep本身不维护独立的状态文件,ARM部署的状态直接存储在Azure平台中:

  • 资源组级别的部署记录,保存在对应资源组的部署历史里;
  • 订阅或管理组级别的部署,对应存储在订阅/管理组的部署历史中。
    每次部署时,ARM会基于当前模板和历史部署记录中的资源清单对比,但这个状态由Azure托管,不像Terraform那样有本地或远程的独立状态文件。

2. Bicep(ARM)如何识别并删除配置文件中不存在的资源?

默认ARM部署是增量模式,只会处理模板中定义的资源,不会删除模板外的资源。要实现删除模板中移除的资源,需切换到完整模式部署:

  • 在GitHub Actions的azure/arm-deploy动作中添加mode: Complete参数;
  • 完整模式下,ARM会将当前模板的资源清单与部署历史中的资源对比,删除所有不在当前模板内、且由该部署创建的资源。
    注意:使用完整模式要格外谨慎,必须确保模板包含所有需要保留的资源,避免误删未纳入模板的资源。

3. 如何将现有资源纳入Bicep(ARM)的状态管理?

可通过以下步骤将现有资源导入Bicep部署管理:

  1. 生成Bicep模板:使用Azure CLI命令导出现有资源的Bicep代码,例如:
    az bicep export --resource-group <资源组名称> --name <现有资源名称> --resource-type <资源类型> --file ./existing-resource.bicep
    
    也可以用az deployment group export导出整个资源组的模板,再转换为Bicep格式。
  2. 合并模板:将生成的资源代码合并到你的main.bicep中,确保资源的名称、类型、API版本与现有资源完全一致。
  3. 执行增量部署:用合并后的模板执行一次增量模式部署,ARM会将现有资源与模板定义匹配,后续该资源就会被纳入部署的状态管理中。
    另外,可先使用az deployment group create的--what-if参数验证部署计划,确保不会对现有资源造成意外修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:10:57