Resources toevoegen aan een implementatiestack

Voltooid

De depositotoepassing blijft zich ontwikkelen tijdens de ontwikkeling. Het team voegt dagelijks resources en testfuncties toe. Waarneembaarheid wordt toegevoegd aan de toepassing met een bestaande Log Analytics-werkruimte en een nieuw Application Insights-exemplaar. U wilt de resources blijven beheren als één atomische eenheid. Meer informatie over het toevoegen van zowel bestaande als nieuwe resources aan een implementatiestack.

In deze les leert u hoe u zowel bestaande als nieuwe resources toevoegt aan een implementatiestack als beheerde resources.

Notitie

De opdrachten in deze les worden weergegeven om concepten te illustreren. Voer de opdrachten nog niet uit. U oefent wat u hier binnenkort leert.

Een bestaande resource toevoegen

De resources die een toepassing in de loop van de tijd gebruikt, worden gewijzigd. Hoe werken we een implementatiestack bij zodat deze een al bestaande resource in Azure bevat?

Met Bicep kunt u een resource definiëren die al bestaat in Azure. Het definiëren van een bestaande resource is vergelijkbaar met het definiëren van een nieuwe resource met kleine verschillen. U kunt bijvoorbeeld een bestaande resource definiëren in een resourcedeclaratie met behulp van het existing trefwoord:

resource logAnalyticsWorkspace 'Microsoft.OperationsManagement/solutions@2015-11-01-preview' existing  = {
    name: 'log-deposits'
}

Wanneer we een bestaande resource als een beheerde resource aan een implementatiestack toevoegen, hoeven we dit existing trefwoord niet te gebruiken. We moeten gewoon de bestaande resource definiëren in ons Bicep-bestand, ARM JSON-sjabloon of sjabloonspecificatie. Uiteindelijk beheert de implementatiestack de bestaande resource.

Laten we eens kijken naar ons Bicep-bestand uit de laatste les. Ons bestand definieert een App Service-plan, een web-app en een Azure SQL-server en -database. We willen een bestaande Log Analytics-werkruimte toevoegen aan onze implementatiestack. De werkruimte bevindt zich in dezelfde resourcegroep als waar onze beheerde resources bestaan.

Om de bestaande Log Analytics-werkruimte toe te voegen, moeten we de definitie toevoegen aan ons Bicep-bestand. U ziet dat we geen code hoeven op te nemen die de werkruimte beschrijft als een bestaande resource.

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

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

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

Nu het Bicep-bestand is gewijzigd, willen we de implementatiestack bijwerken, zodat de wijzigingen in de resources in het Bicep-bestand worden geïmplementeerd.

Gebruik de az stack group create opdracht om een implementatiestack bij te werken met behulp van Azure CLI.

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

Nu het Bicep-bestand is gewijzigd, willen we de implementatiestack bijwerken, zodat de wijzigingen in de resources in het Bicep-bestand worden geïmplementeerd.

Als u een implementatiestack wilt bijwerken met behulp van Azure PowerShell, gebruikt u de Set-AzResourceGroupDeploymentStack opdracht.

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

Een nieuwe beheerde resource toevoegen

Het proces voor het toevoegen van een nieuwe resource aan een implementatiestack is identiek aan het toevoegen van een bestaande resource aan de stack. We moeten gewoon de bestaande resource definiëren in ons Bicep-bestand, ARM JSON-sjabloon of sjabloonspecificatie. Uiteindelijk beheert de implementatiestack de nieuwe resource.

Laten we eens kijken naar ons Bicep-bestand uit de vorige sectie. Ons bestand definieert nu een App Service-plan, app-service, een Azure SQL-server en -database en een Log Analytics-werkruimte. We willen een nieuw Application Insights-exemplaar toevoegen aan onze implementatiestack en de app-service configureren om het exemplaar te gebruiken. Om het nieuwe Application Insights-exemplaar toe te voegen, moeten we de definitie toevoegen aan ons Bicep-bestand en de app-service bijwerken om het nieuwe exemplaar te gebruiken.

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

Nu het Bicep-bestand is gewijzigd, willen we de implementatiestack bijwerken, zodat de wijzigingen in de resources in het Bicep-bestand worden geïmplementeerd.

Gebruik de az stack group create opdracht om een implementatiestack bij te werken met behulp van Azure CLI.

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

Notitie

Azure CLI heeft geen toegewezen opdracht om een implementatiestack bij te werken. Gebruik de opdracht maken om de stack bij te werken.

Wanneer u een update uitvoert op de stack, ontvangt u een bericht waarin staat dat de stack al bestaat in het huidige abonnement. Als de waarde van de actie voor onbeheerde parameter verandert, wordt u gewaarschuwd voor de nieuwe waarden.

Nu het Bicep-bestand is gewijzigd, willen we de implementatiestack bijwerken, zodat de wijzigingen in de resources in het Bicep-bestand worden geïmplementeerd.

Als u een implementatiestack wilt bijwerken met behulp van Azure PowerShell, gebruikt u de Set-AzResourceGroupDeploymentStack opdracht.

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

Zoals u kunt zien, is het proces voor het toevoegen van een bestaande resource of een nieuwe resource hetzelfde.