将资源添加到部署堆栈

已完成

存款应用程序在整个开发过程中不断发展。 团队每天都在添加资源和测试功能。 使用现有的 Log Analytics 工作区和新的 Application Insights 实例将可观测性添加到应用程序。 你希望继续将资源作为单个原子单元进行管理。 需要了解有关将现有资源和新资源添加到部署堆栈的详细信息。

在本单元中,你会了解如何将现有资源和新资源作为受管理资源添加到部署堆栈。

注意

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

添加现有资源

应用程序使用的资源会随时间而更改。 如何更新部署堆栈以在 Azure 中包含已存在的资源?

Bicep 允许定义 Azure 中已存在的资源。 定义现有资源类似于定义具有轻微差异的新资源。 例如,可以使用existing关键字在资源声明中定义现有资源:

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

将现有资源作为受管理资源添加到部署堆栈时,不需要使用此existing关键字。 只需在 Bicep 文件、ARM JSON 模板或模板规格中定义现有资源。最后,部署堆栈管理现有资源。

让我们考虑一下上一个单元中的 Bicep 文件。 我们的文件定义应用服务计划、Web 应用以及 Azure SQL 服务器和数据库。 我们希望将现有的 Log Analytics 工作区添加到部署堆栈。 工作区位于受管理资源存在的同一资源组中。

要添加现有的 Log Analytics 工作区,需要将其定义添加到 Bicep 文件。 请注意,不需要包含将工作区描述为现有资源的任何代码。

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

修改 Bicep 文件后,我们需要更新部署堆栈,以便实施对 Bicep 文件中资源所做的更改。

要使用 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

修改 Bicep 文件后,我们需要更新部署堆栈,以便实施对 Bicep 文件中资源所做的更改。

要使用 Azure PowerShell 更新部署堆栈,请使用Set-AzResourceGroupDeploymentStack命令。

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

添加新的受管理资源

将新资源添加到部署堆栈的过程与将现有资源添加到堆栈的过程相同。 只需在 Bicep 文件、ARM JSON 模板或模板规格中定义现有资源。最后,部署堆栈管理新资源。

让我们考虑一下上一部分中的 Bicep 文件。 现在,我们的文件定义了应用服务计划、应用服务、Azure SQL 服务器和数据库以及 Log Analytics 工作区。 我们希望将新的 Application Insights 实例添加到部署堆栈,并将应用服务配置为使用该实例。 要添加新的 Application Insights 实例,需要将其定义添加到 Bicep 文件,并更新应用服务以使用新实例。

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

修改 Bicep 文件后,我们需要更新部署堆栈,以便实施对 Bicep 文件中资源所做的更改。

要使用 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

注意

Azure CLI 没有用于更新部署堆栈的专用命令。 使用 create 命令更新堆栈。

在堆栈上执行更新时,你会收到一条消息,指出堆栈已存在于当前订阅中。 如果action on unmanage参数的值发生更改,则会出现警告,提醒你注意新值。

修改 Bicep 文件后,我们需要更新部署堆栈,以便实施对 Bicep 文件中资源所做的更改。

要使用 Azure PowerShell 更新部署堆栈,请使用Set-AzResourceGroupDeploymentStack命令。

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

可以看到,添加现有资源或新资源的过程相同。