从部署堆栈中拆离和删除资源

已完成

存款应用程序的更改仍在继续进行。 团队决定从应用程序中移除资源。 某些资源需要继续在 Azure 中,另一些资源则需要安全地删除。 你需要详细了解 Azure 如何处理部署堆栈不再管理的资源。

本单元介绍如何使用 action on unmanage 参数控制 Azure 如何处理从部署堆栈拆离的资源

注意

本单元中显示的命令用于说明概念。 请暂时不要运行这些命令。 稍后你将练习在此处学到的知识。

再次使用 action on unmanage

在部署堆栈中,可以使用 action on unmanage 参数控制 Azure 如何处理拆离的资源、资源组和管理组。 在创建、修改或删除部署堆栈时,可以设置 action on unmanage 参数。 这三个操作都可以设置 action on unmanage 参数的行为。 请记住,最后设置的值优先。

--action-on-unmanage 参数有三个可能的值:

  • deleteAll - 删除资源、资源组和管理组
  • deleteResources - 删除资源,但拆离资源组和管理组
  • detachAll - 拆离所有资源、资源组和管理组

-ActionOnUnmanage 参数有三个可能的值:

  • DeleteAll - 删除资源、资源组和管理组
  • DeleteResources - 删除资源,但拆离资源组和管理组
  • DetachAll - 拆离所有资源、资源组和管理组

分离托管资源

拆离的资源(也称为不受管理的资源)是不再由部署堆栈跟踪或管理但仍在 Azure 中的资源。 部署堆栈的默认行为是拆离而不是删除资源。 例如,你可能需要保留资源,以便将来可以在另一个部署堆栈中使用它,或者可能需要手动验证是否可以安全地删除其数据。

action on unmanage 参数有两个值可以将资源、资源组和管理组设置为在部署堆栈不再管理它们时将其拆离

部署堆栈无法删除密钥保管库机密。 如果要从模板中删除密钥保管库机密,请确保也使用分离模式执行部署堆栈更新/删除命令。

  • deleteResources - 删除资源,但拆离资源组和管理组
  • detachAll - 拆离所有资源、资源组和管理组

在创建、修改或删除部署堆栈时使用 deleteResourcesdetachAll 可提供一些额外的保护,防止意外删除。 请考虑一下上一个单元中的场景。 我们向部署堆栈添加了现有的 Log Analytics 工作区。 该工作区不仅仅由存款应用程序使用,其他应用程序也在使用。 它需要在应用程序的生命周期结束后持续存在。 通过使用 detachAll 作为 action on unmanage 参数,所需资源可继续存在于 Azure 中

  • DeleteResources - 删除资源,但拆离资源组和管理组
  • DetachAll - 拆离所有资源、资源组和管理组

在创建、修改或删除部署堆栈时使用 DeleteResourcesDetachAll 可提供一些额外的保护,防止意外删除。 请考虑一下上一个单元中的场景。 我们向部署堆栈添加了现有的 Log Analytics 工作区。 该工作区不仅仅由存款应用程序使用,其他应用程序也在使用。 它需要在应用程序的生命周期结束后持续存在。 通过使用 DetachAll 作为 action on unmanage 参数,所需资源可继续存在于 Azure 中

让我们考虑一下上一个单元中的 Bicep 文件。 该模板文件定义应用服务计划、Web 应用、Azure SQL 服务器和数据库、Log Analytics 工作区和 Application Insights 实例。 假设我们需要删除在上一个单元中创建的 Log Analytics 工作区和 Application Insights 实例。 我们编辑 Bicep 文件,移除引用 Web 应用的突出显示的代码。

// Parameters
@description('The location for all resources.')
param location string = 'eastus'

@description('The name of the SQL database.')
param sqlDatabaseName string = 'sqldb-${uniqueString(resourceGroup().id)}'

@description('The password of the admin user.')
param sqlServerAdminUserName string

@description('The name of the admin user.')
@secure()
param sqlServerAdminPassword string

@description('The name of the SQL server.')
param sqlServerName string = 'sql-${uniqueString(resourceGroup().id)}'

@description('The name of the web application.')
param webApplicationName string = 'webapp-${uniqueString(resourceGroup().id)}'

// Variables
@description('The name of the Application Insights instance.')
var applicationInsightsName = 'appinsights-deposits'

@description('The name of the app service plan.')
var appServicePlanName = 'plan-deposits'

@description('The name of the Log Analytics Workspace.')
var logAnalyticsWorkspaceName = 'log-deposits'

// Resource - App Service Plan
resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
  name: appServicePlanName
  location: location
  sku: {
    name: 'S1'
    capacity: 1
  }
}

// Resource - Web App
resource webApplication 'Microsoft.Web/sites@2023-12-01' = {
  name: webApplicationName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    siteConfig: {
      appSettings: [
        {
          name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
          value: applicationInsights.properties.InstrumentationKey
        }     
      ]
    }    
  }
}

// Resource - SQL Server
resource sqlServer 'Microsoft.Sql/servers@2021-11-01' ={
  name: sqlServerName
  location: location
  properties: {
    administratorLogin: sqlServerAdminUserName
    administratorLoginPassword: sqlServerAdminPassword
  }
}

// Resource - SQL Database
resource sqlServerDatabase 'Microsoft.Sql/servers/databases@2021-11-01' = {
  parent: sqlServer
  name: sqlDatabaseName
  location: location
  sku: {
    name: 'Standard'
    tier: 'Standard'
  }
}

// Resource - Log Analytics Workspace
resource logAnalyticsWorkspace 'Microsoft.OperationalInsights/workspaces@2023-09-01' = {
  name: logAnalyticsWorkspaceName
  location: location
  properties: {
    retentionInDays: 30
    sku: {
      name: 'PerGB2018'
    }
  }
}

// Resource - Application Insights
resource applicationInsights 'Microsoft.Insights/components@2020-02-02' = {
  name: applicationInsightsName
  location: location
  kind: 'web'
  properties: {
    Application_Type: 'web'
    WorkspaceResourceId: logAnalyticsWorkspace.id
  }
}

若要应用更改,我们需要更新部署堆栈。 要使用 Azure CLI 更新部署堆栈,请使用az stack group create命令。

az stack group create \
    --name stack-deposits \
    --resource-group rg-depositsApplication \
    --template-file ./main.bicep \
    --action-on-unmanage detachAll \
    --deny-settings-mode none

更新操作完成后,部署堆栈将不再管理 Log Analytics 工作区和 Application Insights 实例。 在命令中,我们使用了 --action-on-unmanage detachAll 来指定 Azure 如何处理部署堆栈不再管理的资源。 在这种情况下,虽然资源从部署堆栈拆离,但它们仍在资源组中。

若要应用更改,我们需要更新部署堆栈。 要使用 Azure PowerShell 更新部署堆栈,请使用Set-AzResourceGroupDeploymentStack命令。

Set-AzResourceGroupDeploymentStack `
    -Name stack-deposits `
    -ResourceGroupName rg-depositsApplication `
    -TemplateFile ./main.bicep `
    -ActionOnUnmanage DetachAll `
    -DenySettingsMode None

更新操作完成后,部署堆栈将不再管理 Log Analytics 工作区和 Application Insights 实例。 在命令中,我们使用了 -ActionOnUnmanage DetachAll 来指定 Azure 如何处理部署堆栈不再管理的资源。 在这种情况下,虽然资源从部署堆栈拆离,但它们仍在资源组中。

删除托管资源

部署堆栈提供可靠的资源清理。 更新或删除部署堆栈时,还可以删除受管理资源、资源组和管理组。 action on unmanage 参数有两个值可以将资源、资源组和管理组设置为在部署堆栈不再管理它们时将其删除

  • deleteAll - 删除资源、资源组和管理组
  • deleteResources - 删除资源,但拆离资源组和管理组

让我们考虑一下我们的存款应用程序。 假设开发团队决定使用 Azure Database for PostgreSQL 而不是 Azure SQL 数据库。 我们需要首先更新部署堆栈,以便从 Azure 中移除并完全删除 Azure SQL Server 和数据库。 若要完成此行为,请在更新或删除部署堆栈时使用 deleteAlldeleteResources action on unmanage 参数

  • DeleteAll - 删除资源、资源组和管理组
  • DeleteResources - 删除资源,但拆离资源组和管理组

让我们考虑一下我们的存款应用程序。 假设开发团队决定使用 Azure Database for PostgreSQL 而不是 Azure SQL 数据库。 我们需要首先更新部署堆栈,以便从 Azure 中移除并完全删除 Azure SQL Server 和数据库。 若要完成此行为,请在更新或删除部署堆栈时使用 DeleteAllDeleteResources action on unmanage 参数

让我们考虑一下上一部分中的 Bicep 文件。 该模板文件定义应用服务计划、Web 应用以及 Azure SQL 服务器和数据库。 假设我们需要移除 Azure SQL 服务器和数据库。 我们编辑 Bicep 文件,移除引用 Web 应用的突出显示的代码。

// Parameters
@description('The location for all resources.')
param location string = 'eastus'

@description('The name of the SQL database.')
param sqlDatabaseName string = 'sqldb-${uniqueString(resourceGroup().id)}'

@description('The password of the admin user.')
param sqlServerAdminUserName string

@description('The name of the admin user.')
@secure()
param sqlServerAdminPassword string

@description('The name of the SQL server.')
param sqlServerName string = 'sql-${uniqueString(resourceGroup().id)}'

@description('The name of the web application.')
param webApplicationName string = 'webapp-${uniqueString(resourceGroup().id)}'

// Variables
@description('The name of the app service plan.')
var appServicePlanName = 'plan-deposits'

// Resource - App Service Plan
resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
  name: appServicePlanName
  location: location
  sku: {
    name: 'F1'
    capacity: 1
  }
}

// Resource - Web App
resource webApplication 'Microsoft.Web/sites@2023-12-01' = {
  name: webApplicationName
  location: location
  properties: {
    serverFarmId: appServicePlan.id  
  }
}

// Resource - SQL Server
resource sqlServer 'Microsoft.Sql/servers@2021-11-01' ={
  name: sqlServerName
  location: location
  properties: {
    administratorLogin: sqlServerAdminUserName
    administratorLoginPassword: sqlServerAdminPassword
  }
}

// Resource - SQL Database
resource sqlServerDatabase 'Microsoft.Sql/servers/databases@2021-11-01' = {
  parent: sqlServer
  name: sqlDatabaseName
  location: location
  sku: {
    name: 'Standard'
    tier: 'Standard'
  }
}

我们在文件中留下了以下代码:

// Parameters
@description('The location for all resources.')
param location string = 'eastus'

@description('The name of the web application.')
param webApplicationName string = 'webapp-${uniqueString(resourceGroup().id)}'

// Variables
@description('The name of the app service plan.')
var appServicePlanName = 'plan-deposits'

// Resource - App Service Plan
resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
  name: appServicePlanName
  location: location
  sku: {
    name: 'F1'
    capacity: 1
  }
}

// Resource - Web App
resource webApplication 'Microsoft.Web/sites@2023-12-01' = {
  name: webApplicationName
  location: location
  properties: {
    serverFarmId: appServicePlan.id  
  }
}

若要应用更改,我们需要更新部署堆栈。 要使用 Azure CLI 更新部署堆栈,请使用az stack group create命令。 这一次,我们将使用 --action-on-unmanage deleteAll 而不是 --action-on-unmanage detachAll

az stack group create \
    --name stack-deposits \
    --resource-group rg-depositsApplication \
    --template-file ./main.bicep \
    --action-on-unmanage deleteAll \
    --deny-settings-mode none

更新操作完成后,唯一保留的资源是应用服务计划和 Web 应用。 在命令中,我们使用了 --action-on-unmanage deleteAll 来指定 Azure 如何处理部署堆栈不再管理的资源。 在这种情况下,将从部署堆栈和 Azure 中删除这些资源。

若要应用更改,我们需要更新部署堆栈。 要使用 Azure PowerShell 更新部署堆栈,请使用Set-AzResourceGroupDeploymentStack命令。

Set-AzResourceGroupDeploymentStack `
    -Name stack-deposits `
    -ResourceGroupName rg-depositsApplication `
    -TemplateFile ./main.bicep `
    -ActionOnUnmanage DeleteAll `
    -DenySettingsMode None

更新操作完成后,唯一保留的资源是应用服务计划和 Web 应用。 在命令中,我们使用了 -ActionOnUnmanage DeleteAll 来指定 Azure 如何处理部署堆栈不再管理的资源。 在这种情况下,将从部署堆栈和 Azure 中删除这些资源。