Adicionar recursos a uma pilha de implantação

Concluído

O aplicativo de depósitos continua a evoluir durante o desenvolvimento. A equipe está adicionando recursos e testando recursos diariamente. A observabilidade está sendo adicionada ao aplicativo com um workspace do Log Analytics existente e uma nova instância do Application Insights. Você deseja continuar a gerenciar os recursos como uma única unidade atômica. Você precisa saber mais sobre como adicionar recursos novos e existentes a uma pilha de implantação.

Nesta unidade, você aprenderá a adicionar recursos novos e existentes a uma pilha de implantação como recursos gerenciados.

Observação

Os comandos nesta unidade são mostrados para ilustrar conceitos. Não execute os comandos ainda. Você praticará o que aprendeu aqui em breve.

Adicionar um recurso existente

Os recursos que um aplicativo usa alteram com o tempo. Como podemos atualizar uma pilha de implantação para incluir um recurso já existente no Azure?

O Bicep permite que você defina um recurso que já existe no Azure. Definir um recurso existente é semelhante à definir um novo recurso, com pequenas diferenças. Por exemplo, você pode definir um recurso existente em uma declaração de recurso usando a palavra-chave existing:

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

Quando estamos adicionando um recurso existente como um recurso gerenciado a uma pilha de implantação, não precisamos usar essa palavra-chave existing. Precisamos simplesmente definir o recurso existente em nosso arquivo Bicep, modelo ARM JSON ou especificação de modelo. No final, a pilha de implantação gerencia o recurso existente.

Vamos considerar nosso arquivo Bicep da última unidade. Nosso arquivo define um plano do serviço de aplicativo, um aplicativo Web e um servidor e banco de dados SQL do Azure. Queremos adicionar um workspace do Log Analytics existente à nossa pilha de implantação. O workspace está no mesmo grupo de recursos em que existem nossos recursos gerenciados.

Para adicionar o workspace do Log Analytics existente, precisamos adicionar sua definição ao nosso arquivo Bicep. Observe que não precisamos incluir nenhum código que descreva o workspace como um recurso existente.

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

Com o arquivo Bicep modificado, queremos atualizar a pilha de implantação para que as alterações feitas nos recursos do arquivo Bicep sejam implementadas.

Para atualizar uma pilha de implantação usando a CLI do Azure, use o comando.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

Com o arquivo Bicep modificado, queremos atualizar a pilha de implantação para que as alterações feitas nos recursos do arquivo Bicep sejam implementadas.

Para atualizar uma pilha de implantação usando o Azure PowerShell, use o comando.Set-AzResourceGroupDeploymentStack.

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

Adicionar um novo recurso gerenciado

O processo de adicionar um novo recurso a uma pilha de implantação é idêntico ao de adicionar um recurso existente à pilha. Precisamos simplesmente definir o recurso existente em nosso arquivo Bicep, modelo ARM JSON ou especificação de modelo. No final, a pilha de implantação gerencia o novo recurso.

Vamos considerar o nosso arquivo Bicep da seção anterior. Nosso arquivo agora define um plano do serviço de aplicativo, um serviço de aplicativo, um servidor e banco de dados SQL do Azure e um workspace do Log Analytics. Queremos adicionar uma nova instância do Application Insights à nossa pilha de implantação e configurar o serviço de aplicativo para usar a instância. Para adicionar a nova instância do Application Insights, precisamos adicionar sua definição ao nosso arquivo Bicep e atualizar o serviço de aplicativo para usar a nova instância.

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

Com o arquivo Bicep modificado, queremos atualizar a pilha de implantação para que as alterações feitas nos recursos do arquivo Bicep sejam implementadas.

Para atualizar uma pilha de implantação usando a CLI do Azure, use o comando.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

Observação

A CLI do Azure não tem um comando dedicado para atualizar uma pilha de implantação. Use o comando create para atualizar a pilha.

Ao executar uma atualização na pilha, você recebe uma mensagem informando que a pilha já existe na assinatura atual. Se o valor do parâmetro de ação não gerenciada for alterado, o aviso alertará você sobre os novos valores.

Com o arquivo Bicep modificado, queremos atualizar a pilha de implantação para que as alterações feitas nos recursos do arquivo Bicep sejam implementadas.

Para atualizar uma pilha de implantação usando o Azure PowerShell, use o comando.Set-AzResourceGroupDeploymentStack.

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

Como você pode ver, o processo de adicionar um recurso existente ou um novo recurso é o mesmo.