Adicionar recursos a uma pilha de implantação

Concluído

A aplicação de depósitos continua a evoluir ao longo do desenvolvimento. A equipe está adicionando recursos e testando recursos diariamente. A observabilidade está sendo adicionada ao aplicativo com um espaço de trabalho existente do Log Analytics 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.

Nota

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

Adicionar um recurso existente

Os recursos que um aplicativo usa mudam ao longo do tempo. Como atualizamos uma pilha de implantação para incluir um recurso já existente no Azure?

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

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

Quando adicionamos um recurso existente como um recurso gerenciado a uma pilha de implantação, não precisamos usar essa existing palavra-chave. Nós simplesmente precisamos definir o recurso existente em nosso arquivo Bicep, modelo JSON ARM 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 de serviço de aplicativo, um aplicativo Web e um servidor SQL e banco de dados do Azure. Queremos adicionar um espaço de trabalho existente do Log Analytics à nossa pilha de implantação. O espaço de trabalho está no mesmo grupo de recursos onde existem nossos recursos gerenciados.

Para adicionar o espaço de trabalho existente do Log Analytics, precisamos adicionar sua definição ao nosso arquivo Bicep. Observe que não precisamos incluir nenhum código que descreva o espaço de trabalho 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 no arquivo Bicep sejam implementadas.

Para atualizar uma pilha de implantação usando a CLI do Azure, use o az stack group create comando.

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 no arquivo Bicep sejam implementadas.

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

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 à adição de um recurso existente à pilha. Nós simplesmente precisamos definir o recurso existente em nosso arquivo Bicep, modelo JSON ARM ou especificação de modelo. No final, a pilha de implantação gerencia o novo recurso.

Vamos considerar nosso arquivo Bicep da seção anterior. Nosso arquivo agora define um plano de serviço de aplicativo, serviço de aplicativo, um servidor SQL do Azure e um banco de dados e um espaço de trabalho 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 no arquivo Bicep sejam implementadas.

Para atualizar uma pilha de implantação usando a CLI do Azure, use o az stack group create comando.

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

Nota

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 da ação em unmanage parameter 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 no arquivo Bicep sejam implementadas.

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

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.