Padrão do conjunto de configurações

Em vez de definir muitos parâmetros individuais, crie conjuntos predefinidos de valores. Durante a implantação, selecione o conjunto de valores a ser usado.

Contexto e problema

Um único arquivo Bicep geralmente define muitos recursos. Cada recurso pode precisar usar uma configuração diferente, dependendo do ambiente em que você está implantando. Por exemplo, você pode criar um arquivo Bicep que implante um plano e aplicativo do Serviço de Aplicativo e uma conta de armazenamento. Cada um desses recursos tem várias opções que afetam seu custo, disponibilidade e resiliência. Para ambientes de produção, você deseja usar um conjunto de configurações que priorize alta disponibilidade e resiliência. Para ambientes que não sejam de produção, você deseja usar um conjunto diferente de configurações que priorize a redução de custos.

Você pode criar parâmetros para cada definição de configuração, mas essa abordagem tem algumas desvantagens:

  • Essa abordagem cria uma sobrecarga para os usuários do modelo, uma vez que eles precisam entender os valores a serem usados para cada recurso e o impacto da definição de cada parâmetro.
  • O número de parâmetros em seu modelo aumenta a cada novo recurso definido.
  • Os usuários podem selecionar combinações de valores de parâmetros que não foram testados ou que não funcionarão corretamente.

Solução

Crie um único parâmetro para especificar o tipo de ambiente. Use uma variável para selecionar automaticamente a configuração de cada recurso com base no valor do parâmetro.

Nota

Essa abordagem às vezes é chamada de dimensionamento de camisetas. Quando você compra uma camiseta, você não tem muitas opções para seu comprimento, largura, mangas e assim por diante. Você simplesmente escolhe entre tamanhos pequenos, médios e grandes, e o designer de camisetas predefiniu essas medidas com base nesse tamanho.

Exemplo

Suponha que você tenha um modelo que possa ser implantado em dois tipos de ambiente: não produção e produção. Dependendo do tipo de ambiente, a configuração necessária é diferente:

Property Ambientes de não produção Ambientes de produção
Plano do Serviço de Aplicações
Nome da SKU S2 P2V3
Capacidade (número de instâncias) 1 3
Aplicativo do Serviço de Aplicativo
Sempre Ativo Disabled Ativados
Conta de armazenamento
Nome da SKU Standard_LRS Standard_ZRS

Você pode usar o padrão de conjunto de configurações para esse modelo.

Aceite um único parâmetro que indique o tipo de ambiente, como produção ou não produção. Use o decorador @allowed de parâmetros para garantir que os usuários do seu modelo forneçam apenas os valores esperados:

@allowed([
  'Production'
  'NonProduction'
])
param environmentType string = 'NonProduction'

Em seguida, crie uma variável de mapa, que é um objeto que define a configuração específica dependendo do tipo de ambiente. Observe que a variável tem dois objetos nomeados Production e NonProduction. Esses nomes correspondem aos valores permitidos para o parâmetro no exemplo anterior:

var environmentConfigurationMap = {
  Production: {
    appServicePlan: {
      sku: {
        name: 'P2V3'
        capacity: 3
      }
    }
    appServiceApp: {
      alwaysOn: false
    }
    storageAccount: {
      sku: {
        name: 'Standard_ZRS'
      }
    }
  }
  NonProduction: {
    appServicePlan: {
      sku: {
        name: 'S2'
        capacity: 1
      }
    }
    appServiceApp: {
      alwaysOn: false
    }
    storageAccount: {
      sku: {
        name: 'Standard_LRS'
      }
    }
  }
}

Ao definir os recursos, use o mapa de configuração para definir as propriedades do recurso:

resource appServicePlan 'Microsoft.Web/serverfarms@2022-09-01' = {
  name: appServicePlanName
  location: location
  sku: environmentConfigurationMap[environmentType].appServicePlan.sku
}

resource appServiceApp 'Microsoft.Web/sites@2022-09-01' = {
  name: appServiceAppName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
    siteConfig: {
      alwaysOn: environmentConfigurationMap[environmentType].appServiceApp.alwaysOn
    }
  }
}

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: location
  kind: 'StorageV2'
  sku: environmentConfigurationMap[environmentType].storageAccount.sku
}

Considerações

  • Na variável de mapa, considere agrupar as propriedades por recurso para simplificar sua definição.
  • Em sua variável de mapa, você pode definir valores de propriedade individuais (como a alwaysOn propriedade no exemplo) ou variáveis de objeto que definem uma propriedade de objeto (como as propriedades SKU no exemplo).
  • Considere o uso de um conjunto de configurações com condições de recursos. Isso permite que seu código Bicep implante determinados recursos para ambientes específicos, e não em outros.

Próximos passos

Saiba mais sobre o padrão de arquivo variável compartilhado.