Padrão do conjunto de configurações

Em vez de definir vários 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 no qual você está implantando. Por exemplo, você pode criar um arquivo Bicep que implanta 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, convém usar um conjunto de configurações que priorize a alta disponibilidade e resiliência. Para ambientes de não produção, convém usar um conjunto diferente de configuração que priorize a redução de custos.

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

  • Essa abordagem cria uma carga em seus usuários de modelo, pois 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 com cada novo recurso que você define.
  • 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.

Observação

Essa abordagem, às vezes, é chamada de dimensionamento de camiseta. Ao comprar uma camiseta, você não obtém muitas opções de comprimento, largura, mangas e assim por diante. Você simplesmente escolhe entre tamanhos pequenos, médios e grandes, e o designer de camiseta predefine essas medidas com base nesses tamanhos.

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 de que você precisa será diferente:

Propriedade Ambientes de pré-produção Ambientes de produção
Plano do Serviço de Aplicativo
Nome do SKU S2 P2V3
Capacidade (número de instâncias) 1 3
Aplicativo de Serviço de Aplicativo
Always On Desabilitado habilitado
Conta de armazenamento
Nome do 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 de parâmetro @allowed para garantir que os usuários do modelo forneçam apenas valores esperados por você:

@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 chamados 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

  • Em sua 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 propriedade alwaysOn no exemplo) ou variáveis de objeto que definem uma propriedade de objeto (como as propriedades de SKU no exemplo).
  • Considere usar um conjunto de configurações com condições de recursos. Isso permite que seu código Bicep implante certos recursos para ambientes específicos, e não em outros.

Próximas etapas

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