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, você deseja usar um conjunto de configurações que priorize 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 configuração, mas essa abordagem 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.