Exercício – Refatorar seu modelo para usar módulos

Concluído

Neste exercício, você atualizará o modelo Bicep criado anteriormente para que ele use um módulo para os recursos do Serviço de Aplicativo do Azure. Os módulos ajudam a manter a intenção do modelo principal mais clara. Você poderá reutilizar o módulo do Serviço de Aplicativo em outros modelos, se desejar.

Durante o processo, você vai:

  • Adicionar um novo módulo e mover os recursos do Serviço de Aplicativo para ele.
  • Fazer referência ao módulo no modelo principal do Bicep.
  • Adicionar uma saída para o nome do host do aplicativo de Serviço de Aplicativo e emiti-la nas implantações de módulo e modelo.
  • Testar a implantação para garantir que o modelo seja válido.

Adicionar um novo arquivo de módulo

  1. No Visual Studio Code, crie uma pasta chamada módulos na mesma pasta em que você criou o arquivo main.bicep. Na pasta módulos, crie um arquivo chamado appService.bicep. Salve o arquivo.

  2. Adicione o seguinte conteúdo ao arquivo appService.bicep:

    param location string
    param appServiceAppName string
    
    @allowed([
      'nonprod'
      'prod'
    ])
    param environmentType string
    
    var appServicePlanName = 'toy-product-launch-plan'
    var appServicePlanSkuName = (environmentType == 'prod') ? 'P2v3' : 'F1'
    
    resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
      name: appServicePlanName
      location: location
      sku: {
        name: appServicePlanSkuName
      }
    }
    
    resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = {
      name: appServiceAppName
      location: location
      properties: {
        serverFarmId: appServicePlan.id
        httpsOnly: true
      }
    }
    

    Observe que você copiou os parâmetros e as variáveis de seu modelo main.bicep, porque o modelo appService.bicep precisa ser autossuficiente.

  3. Salve as alterações no arquivo. Observe que o Visual Studio Code não mostra nenhum rabisco vermelho para indicar avisos sobre variáveis ausentes, parâmetros ausentes ou recursos inválidos.

Adicionar uma referência ao módulo pelo modelo pai

Agora que você tem um módulo completo para implantar os recursos do Serviço de Aplicativo, pode consultar o módulo dentro do modelo pai. Como o módulo implanta os recursos do Serviço de Aplicativo, você pode excluir os recursos e variáveis associados do modelo pai.

  1. No arquivo main.bicep, exclua os recursos do Serviço de Aplicativo e as definições de variáveis appServicePlanName e appServicePlanSkuName. Não exclua os parâmetros do Serviço de Aplicativo, pois você ainda precisa deles. Além disso, não exclua os parâmetros, a variável ou os recursos da conta de armazenamento.

  2. Na parte inferior do arquivo main.bicep, adicione o seguinte código Bicep:

    module appService 'modules/appService.bicep' = {
      name: 'appService'
      params: {
        location: location
        appServiceAppName: appServiceAppName
        environmentType: environmentType
      }
    }
    

    Observe que você está especificando os parâmetros para o módulo referenciando os parâmetros no modelo pai.

  3. Salve as alterações no arquivo.

Adicionar o nome do host como uma saída

  1. Adicione o seguinte código Bicep à parte inferior do arquivo appService.bicep:

    output appServiceAppHostName string = appServiceApp.properties.defaultHostName
    

    Esse código declara que uma saída para esse módulo, que será chamada de appServiceAppHostName, será do tipo string. A saída obterá seu valor da propriedade defaultHostName do aplicativo do Serviço de Aplicativo.

  2. Salve as alterações no arquivo.

    Essa saída é declarada dentro de um arquivo Bicep que usaremos como um módulo, portanto, estará disponível apenas para o modelo pai. Você também precisa retornar a saída para a pessoa que implantou o modelo.

  3. Abra o arquivo main.bicep e adicione o seguinte código à parte inferior do arquivo:

    output appServiceAppHostName string = appService.outputs.appServiceAppHostName
    

    Observe que essa saída é declarada de forma semelhante à saída no módulo. Mas, desta vez, você está referenciando a saída do módulo em vez de uma propriedade de recurso.

  4. Salve as alterações no arquivo.

Verificar seus arquivos do Bicep

Depois de concluir todas as alterações anteriores, o arquivo main.bicep deverá ser semelhante a este exemplo:

param location string = 'eastus'
param storageAccountName string = 'toylaunch${uniqueString(resourceGroup().id)}'
param appServiceAppName string = 'toylaunch${uniqueString(resourceGroup().id)}'

@allowed([
  'nonprod'
  'prod'
])
param environmentType string

var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: storageAccountSkuName
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

module appService 'modules/appService.bicep' = {
  name: 'appService'
  params: {
    location: location
    appServiceAppName: appServiceAppName
    environmentType: environmentType
  }
}

output appServiceAppHostName string = appService.outputs.appServiceAppHostName

Seu arquivo appService.bicep deve ser parecido com este exemplo:

param location string
param appServiceAppName string

@allowed([
  'nonprod'
  'prod'
])
param environmentType string

var appServicePlanName = 'toy-product-launch-plan'
var appServicePlanSkuName = (environmentType == 'prod') ? 'P2v3' : 'F1'

resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
  name: appServicePlanName
  location: location
  sku: {
    name: appServicePlanSkuName
  }
}

resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = {
  name: appServiceAppName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
  }
}

output appServiceAppHostName string = appServiceApp.properties.defaultHostName

Se um dos arquivos não corresponder, copie o exemplo ou ajuste o modelo para corresponder ao exemplo.

Implantar o modelo Bicep atualizado

Execute o comando da CLI do Azure a seguir no terminal.

az deployment group create \
  --template-file main.bicep \
  --parameters environmentType=nonprod

Execute o comando do Azure PowerShell a seguir no terminal.

New-AzResourceGroupDeployment `
  -TemplateFile main.bicep `
  -environmentType nonprod

Verifique sua implantação

  1. No navegador, retorne ao portal do Azure. Vá para o grupo de recursos e veja que agora há duas implantações bem-sucedidas.

  2. Selecione o link 2 com êxito. Observe que você tem uma implantação chamada principal na lista e uma nova implantação chamada appService.

    Screenshot of the Azure portal interface for the deployments, with the two deployments listed and succeeded statuses.

  3. Selecione a implantação chamada principal e escolha Detalhes da implantação para expandir a lista de recursos implantados.

    Observe que a implantação do nosso módulo aparece na lista.

    Screenshot of the Azure portal interface for the specific deployment, with one resource listed.

  4. Selecione a guia Saídas. Observe que há uma saída chamada appServiceAppHostName com o nome do host do seu aplicativo de Serviço de Aplicativo. Copie o nome do host para a área de transferência.

    Screenshot of the Azure portal interface for the specific deployment's outputs.

  5. Abra uma nova guia do navegador e cole o nome do host que você copiou. Você deve ver a página de boas-vindas do Serviço de Aplicativo padrão.

    Screenshot of the default App Service welcome page.

Parabéns! Você implantou com êxito as bases de um ótimo aplicativo.