Добавление ресурсов в стек развертывания

Завершено

Приложение депозитов продолжает развиваться на протяжении всей разработки. Команда ежедневно добавляет ресурсы и тестирует функции. Наблюдаемость добавляется в приложение с существующей рабочей областью 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-файл из последнего урока. Наш файл определяет план службы приложений, веб-приложение и сервер SQL Azure и базу данных. Мы хотим добавить существующую рабочую область 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 из предыдущего раздела. Теперь наш файл определяет план службы приложений, службу приложений, сервер SQL Azure и базу данных и рабочую область 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 для обновления стека.

При выполнении обновления в стеке вы получите сообщение о том, что стек уже существует в текущей подписке. Если значение действия для неуправляемого параметра изменяется, предупреждение оповещает вас о новых значениях.

После изменения файла Bicep мы хотим обновить стек развертывания, чтобы изменения, внесенные в ресурсы в файле Bicep, были реализованы.

Чтобы обновить стек развертывания с помощью Azure PowerShell, используйте Set-AzResourceGroupDeploymentStack команду.

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

Как видно, процесс добавления существующего ресурса или нового ресурса совпадает.