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.