Exercício - Adicione parâmetros e variáveis ao seu modelo Bicep

Concluído

Neste exercício, você atualizará o modelo Bicep criado anteriormente para que:\

  • Aceita parâmetros para os locais e nomes dos recursos.
  • Usa suas regras de negócios para selecionar as SKUs certas para os recursos que estão sendo implantados.

Durante o processo, você:

  • Atualize o modelo para incluir um location parâmetro.
  • Atualize o modelo para incluir parâmetros e variáveis para os nomes dos recursos.
  • Use expressões para definir valores padrão para os parâmetros.
  • Atualize o modelo para incluir variáveis para a SKU de cada recurso.
  • Teste a implantação para garantir que o modelo seja válido.

Adicionar os parâmetros de localização e nome do recurso

  1. No arquivo main.bicep no Visual Studio Code, adicione o seguinte código à parte superior do arquivo:

    param location string = 'eastus'
    param storageAccountName string = 'toylaunch${uniqueString(resourceGroup().id)}'
    param appServiceAppName string = 'toylaunch${uniqueString(resourceGroup().id)}'
    
    var appServicePlanName = 'toy-product-launch-plan'
    

    O linter Bicep adiciona linhas onduladas amarelas abaixo de cada parâmetro e nome de variável para indicar que eles não são usados no modelo. Você corrigirá esse problema em breve.

    Observe que você está usando expressões que incluem interpolação de cadeia de caracteres e a uniqueString() função para definir valores de parâmetro padrão. Alguém que implanta esse modelo pode substituir os valores de parâmetro padrão especificando os valores no momento da implantação, mas não pode substituir os valores das variáveis.

    Observe também que você está usando uma variável para o nome do plano do Serviço de Aplicativo do Azure, mas está usando parâmetros para os outros nomes. As contas de armazenamento e os aplicativos do Serviço de Aplicativo precisam de nomes globalmente exclusivos, mas os nomes dos planos do Serviço de Aplicativo precisam ser exclusivos apenas dentro do grupo de recursos. Essa diferença significa que não é uma preocupação usar o mesmo nome de plano do Serviço de Aplicativo em implantações diferentes, desde que as implantações estejam todas indo para grupos de recursos diferentes.

    Gorjeta

    Você está especificando que o location parâmetro deve ser definido como westus3. Normalmente, você criaria recursos no mesmo local que o grupo de recursos usando a resourceGroup().location propriedade. Mas quando você trabalha com a área restrita do Microsoft Learn, precisa usar determinadas regiões do Azure que não correspondem ao local do grupo de recursos.

  2. Encontre os locais dentro das definições de recursos onde as propriedades e name estão location definidas e atualize-os para usar os valores de parâmetro. Depois de terminar, as definições de recursos no arquivo Bicep devem ter esta aparência:

    resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = {
      name: storageAccountName
      location: location
      sku: {
        name: 'Standard_LRS'
      }
      kind: 'StorageV2'
      properties: {
        accessTier: 'Hot'
      }
    }
    
    resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
      name: appServicePlanName
      location: location
      sku: {
        name: 'F1'
      }
    }
    
    resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = {
      name: appServiceAppName
      location: location
      properties: {
        serverFarmId: appServicePlan.id
        httpsOnly: true
      }
    }
    
  3. Guarde as alterações ao ficheiro.

Definir automaticamente as SKUs para cada tipo de ambiente

  1. No arquivo main.bicep no Visual Studio Code, adicione o seguinte parâmetro Bicep abaixo dos parâmetros que você criou na tarefa anterior:

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

    Observe que você está definindo um parâmetro com um conjunto de valores permitidos, mas não está especificando um valor padrão para esse parâmetro.

  2. Abaixo da linha que declara a appServicePlanName variável, adicione as seguintes definições de variável:

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

    Observe que você está definindo esses valores de variáveis usando o operador ternário para expressar alguma if/then/else lógica.

  3. Encontre os locais dentro das definições de recursos onde as sku propriedades estão definidas e atualize-os para usar os valores de parâmetro. Depois de terminar, as definições de recursos no arquivo Bicep devem ter esta aparência:

    resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = {
      name: storageAccountName
      location: location
      sku: {
        name: storageAccountSkuName
      }
      kind: 'StorageV2'
      properties: {
        accessTier: 'Hot'
      }
    }
    
    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ê não parametrizou tudo. Você definiu algumas propriedades diretamente nas definições de recursos, onde sabe que esses valores não serão alterados entre implantações.

  4. Guarde as alterações ao ficheiro.

Verifique seu arquivo Bicep

Depois de concluir todas as alterações anteriores, o arquivo main.bicep deve 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 appServicePlanName = 'toy-product-launch-plan'
var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'
var appServicePlanSkuName = (environmentType == 'prod') ? 'P2v3' : 'F1'

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

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

Se o ficheiro não corresponder, copie o exemplo ou ajuste o ficheiro para corresponder ao exemplo.

Implantar o modelo Bicep atualizado

Execute o seguinte comando da CLI do Azure no terminal.

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

Execute o seguinte comando do Azure PowerShell no terminal.

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

Observe que você está especificando explicitamente o valor para o environmentType parâmetro quando executa a implantação. Não é necessário especificar os outros valores de parâmetro, porque eles têm valores padrão válidos.

Verificar a implementação

  1. No navegador, volte para o portal do Azure e vá para seu grupo de recursos. Você ainda verá uma implantação bem-sucedida, porque a implantação usou o mesmo nome da primeira implantação.

  2. Selecione o link 1 Êxito .

  3. Selecione a implantação chamada principal e, em seguida, selecione Detalhes da implantação para expandir a lista de recursos implantados.

    Captura de ecrã da interface do portal do Azure para a implementação específica, com a conta de armazenamento e os recursos do Serviço de Aplicação listados com os nomes gerados.

  4. Observe que um novo aplicativo do Serviço de Aplicativo e uma nova conta de armazenamento foram implantados com nomes gerados aleatoriamente.