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)忽略了。现提出以下三个问题:
- Bicep(ARM)的状态存储在何处?
- Bicep(ARM)如何识别并删除配置文件中不存在的资源?
- 如何将现有资源纳入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部署管理:
- 生成Bicep模板:使用Azure CLI命令导出现有资源的Bicep代码,例如:
也可以用az bicep export --resource-group <资源组名称> --name <现有资源名称> --resource-type <资源类型> --file ./existing-resource.bicepaz deployment group export导出整个资源组的模板,再转换为Bicep格式。 - 合并模板:将生成的资源代码合并到你的
main.bicep中,确保资源的名称、类型、API版本与现有资源完全一致。 - 执行增量部署:用合并后的模板执行一次增量模式部署,ARM会将现有资源与模板定义匹配,后续该资源就会被纳入部署的状态管理中。
另外,可先使用az deployment group create的--what-if参数验证部署计划,确保不会对现有资源造成意外修改。
内容的提问来源于stack exchange,提问作者Shuzheng
相关产品推荐
相关产品推荐

