將資源新增至部署堆疊

已完成

存款應用程式會持續在整個開發過程中發展。 小組會每天新增資源和測試功能。 可檢視性已新增至具有現有 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 Server 與資料庫。 我們想要將現有的 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 Server 和資料庫,以及 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

如您所見,新增現有資源或新資源的程序相同。