Détacher et supprimer des ressources d’une pile de déploiement

Effectué

Les modifications continuent avec l’application de dépôts. L’équipe a décidé de supprimer des ressources de l’application. Certaines ressources doivent continuer à exister dans Azure, tandis que d’autres peuvent être supprimées en toute sécurité. Vous devez en savoir plus sur la manière dont Azure gère les ressources qu’une pile de déploiement ne gère plus.

Dans cette unité, vous allez apprendre à utiliser le contrôle permettant à Azure de gérer les ressources détachées d’une pile de déploiement à l’aide du paramètre action sur le non géré.

Remarque

Les commandes de cette unité sont présentées pour illustrer les concepts. N’exécutez pas encore les commandes. Vous allez bientôt mettre en pratique ce que vous apprenez ici.

Action sur le non géré revisitée

Avec les piles de déploiement, le paramètre action sur le non géré est utilisée pour contrôler la façon dont Azure gère les ressources détachées, les groupes de ressources et les groupes d’administration. Vous pouvez définir le paramètre action sur le non géré lors de la création, de la modification ou de la suppression d’une pile de déploiement. Les trois opérations ont la possibilité de définir le comportement du paramètre action sur le non géré. N’oubliez pas que la valeur définie en dernier est prioritaire.

Il existe trois valeurs possibles pour le paramètre --action-on-unmanage :

  • deleteAll : supprime les ressources, les groupes de ressources et les groupes d’administration
  • deleteResources : supprime les ressources mais détache les groupes de ressources et les groupes d’administration
  • detachAll : détache toutes les ressources, les groupes de ressources et les groupes d’administration

Il existe trois valeurs possibles pour le paramètre -ActionOnUnmanage :

  • DeleteAll : supprime les ressources, les groupes de ressources et les groupes d’administration
  • DeleteResources : supprime les ressources mais détache les groupes de ressources et les groupes d’administration
  • DetachAll : détache toutes les ressources, les groupes de ressources et les groupes d’administration

Détacher une ressource managée

Une ressource détachée, également appelée ressource non managée, est une ressource qui n’est plus suivie ou gérée par une pile de déploiement, mais la ressource existe toujours dans Azure. Le comportement par défaut des piles de déploiement consiste à détacher les ressources plutôt qu’à les supprimer. Par exemple, vous devrez peut-être conserver la ressource, afin de pouvoir l’utiliser dans une autre pile de déploiement ultérieurement, ou vous devrez peut-être vérifier manuellement que vous pouvez supprimer ses données en toute sécurité.

Il existe deux valeurs du paramètre action sur le non géré qui définissent les ressources, les groupes de ressources et les groupes d’administration à détacher lorsque la pile de déploiement ne les gère plus.

Les piles de déploiement ne peuvent pas supprimer les secrets de coffre de clés. Si vous supprimez des secrets de coffre de clés d’un modèle, veillez à exécuter également la commande de mise à jour/suppression de la pile de déploiement en mode détacher.

  • deleteResources : supprime les ressources mais détache les groupes de ressources et les groupes d’administration
  • detachAll : détache toutes les ressources, les groupes de ressources et les groupes d’administration

L’utilisation de deleteResources ou de detachAll lors de la création, de la modification ou de la suppression de vos piles de déploiement offre une protection supplémentaire contre la suppression accidentelle. Considérez notre scénario à partir de la dernière unité. Nous avons ajouté un espace de travail Log Analytics existant à notre pile de déploiement. L’espace de travail est utilisé par d’autres applications, pas seulement par l’application de dépôts. Il doit persister au-delà de la durée de vie de l’application. En utilisant detachAll comme paramètre action sur le non géré, les ressources nécessaires continuent d’exister dans Azure.

  • DeleteResources : supprime les ressources mais détache les groupes de ressources et les groupes d’administration
  • DetachAll : détache toutes les ressources, les groupes de ressources et les groupes d’administration

L’utilisation de DeleteResources ou de DetachAll lors de la création, de la modification ou de la suppression de vos piles de déploiement offre une protection supplémentaire contre la suppression accidentelle. Considérez notre scénario à partir de la dernière unité. Nous avons ajouté un espace de travail Log Analytics existant à notre pile de déploiement. L’espace de travail est utilisé par d’autres applications, pas seulement par l’application de dépôts. Il doit persister au-delà de la durée de vie de l’application. En utilisant DetachAll comme paramètre action sur le non géré, les ressources nécessaires continuent d’exister dans Azure.

Prenons le fichier Bicep de la dernière unité. Le fichier modèle définit un plan App Service, une application web, un serveur et une base de données Azure SQL, un espace de travail Log Analytics et une instance Application Insights. Supposons que nous devons supprimer l’espace de travail Log Analytics et l’instance Application Insights que nous avons créées dans la dernière unité. Nous modifions notre fichier Bicep, en supprimant le code mis en surbrillance qui fait référence à notre application 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
  }
}

Pour appliquer les modifications, nous devons mettre à jour la pile de déploiement. Pour mettre à jour une pile de déploiement à l’aide d’Azure CLI, utilisez la commande 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

Une fois l’opération de mise à jour terminée, la pile de déploiement ne gère plus l’espace de travail Log Analytics et l’instance Application Insights. Dans notre commande, nous avons utilisé --action-on-unmanage detachAll pour spécifier comment Azure gère les ressources qu’une pile de déploiement ne gère plus. Dans ce cas, les ressources sont détachées de la pile de déploiement, mais elles existent toujours dans le groupe de ressources.

Pour appliquer les modifications, nous devons mettre à jour la pile de déploiement. Pour mettre à jour une pile de déploiement à l’aide d’Azure PowerShell, utilisez la commande Set-AzResourceGroupDeploymentStack.

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

Une fois l’opération de mise à jour terminée, la pile de déploiement ne gère plus l’espace de travail Log Analytics et l’instance Application Insights. Dans notre commande, nous avons utilisé -ActionOnUnmanage DetachAll pour spécifier comment Azure gère les ressources qu’une pile de déploiement ne gère plus. Dans ce cas, les ressources sont détachées de la pile de déploiement, mais elles existent toujours dans le groupe de ressources.

Supprimer une ressource managée

Les piles de déploiement effectuent un nettoyage fiable des ressources. Lorsque vous mettez à jour ou supprimez une pile de déploiement, vous pouvez également supprimer les ressources managées, les groupes de ressources et les groupes d’administration. Il existe deux valeurs du paramètre action sur le non géré qui définissent les ressources, les groupes de ressources et les groupes d’administration à supprimer lorsque la pile de déploiement ne les gère plus.

  • deleteAll : supprime les ressources, les groupes de ressources et les groupes d’administration
  • deleteResources : supprime les ressources mais détache les groupes de ressources et les groupes d’administration

Considérez notre application de dépôts. Supposons que l’équipe de développement décide d’utiliser Azure Database pour PostgreSQL au lieu d’Azure SQL Database. Nous devons d’abord mettre à jour notre pile de déploiement pour enlever et supprimer entièrement le serveur et la base de données Azure SQL d’Azure. Pour accomplir ce comportement, utilisez le paramètre action sur le non géré deleteAll ou deleteResources lors de la mise à jour ou de la suppression de la pile de déploiement.

  • DeleteAll : supprime les ressources, les groupes de ressources et les groupes d’administration
  • DeleteResources : supprime les ressources mais détache les groupes de ressources et les groupes d’administration

Considérez notre application de dépôts. Supposons que l’équipe de développement décide d’utiliser Azure Database pour PostgreSQL au lieu d’Azure SQL Database. Nous devons d’abord mettre à jour notre pile de déploiement pour enlever et supprimer entièrement le serveur et la base de données Azure SQL d’Azure. Pour accomplir ce comportement, utilisez le paramètre action sur le non géré DeleteAll ou DeleteResources lors de la mise à jour ou de la suppression de la pile de déploiement.

Prenons le fichier Bicep de la section précédente. Le modèle définit un plan App Service, une application web, et un serveur et une base de données Azure SQL. Supposons que nous devons supprimer le serveur et la base de données Azure SQL. Nous modifions notre fichier Bicep, en supprimant le code mis en surbrillance qui fait référence à notre application 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'
  }
}

Il reste le code suivant dans notre fichier :

// 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  
  }
}

Pour appliquer les modifications, nous devons mettre à jour la pile de déploiement. Pour mettre à jour une pile de déploiement à l’aide d’Azure CLI, utilisez la commande az stack group create. Cette fois, nous utilisons --action-on-unmanage deleteAll au lieu de --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

Une fois l’opération de mise à jour terminée, les seules ressources restantes sont le plan App Service et l’application web. Dans notre commande, nous avons utilisé --action-on-unmanage deleteAll pour spécifier comment Azure gère les ressources que la pile de déploiement ne gère plus. Dans ce cas, les ressources sont supprimées de la pile de déploiement et d’Azure.

Pour appliquer les modifications, nous devons mettre à jour la pile de déploiement. Pour mettre à jour une pile de déploiement à l’aide d’Azure PowerShell, utilisez la commande Set-AzResourceGroupDeploymentStack.

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

Une fois l’opération de mise à jour terminée, les seules ressources restantes sont le plan App Service et l’application web. Dans notre commande, nous avons utilisé -ActionOnUnmanage DeleteAll pour spécifier comment Azure gère les ressources que la pile de déploiement ne gère plus. Dans ce cas, les ressources sont supprimées de la pile de déploiement et d’Azure.