Partilhar via


Padrão do conjunto de configuração

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

Contexto e problema

Um único ficheiro Bicep define frequentemente muitos recursos. Cada recurso poderá ter de utilizar uma configuração diferente consoante o ambiente no qual o está a implementar. Por exemplo, pode criar um ficheiro Bicep que implementa um plano e uma aplicação Serviço de Aplicações e uma conta de armazenamento. Cada um destes recursos tem várias opções que afetam o seu custo, disponibilidade e resiliência. Para ambientes de produção, quer utilizar um conjunto de configuração que dê prioridade à elevada disponibilidade e resiliência. Para ambientes de não produção, quer utilizar um conjunto diferente de configuração que priorize a redução de custos.

Pode criar parâmetros para cada definição de configuração, mas isto tem algumas desvantagens:

  • Esta abordagem cria um encargo para os utilizadores do modelo, uma vez que precisam de compreender os valores a utilizar para cada recurso e o impacto da definição de cada parâmetro.
  • O número de parâmetros no seu modelo aumenta com cada novo recurso que definir.
  • Os utilizadores podem selecionar combinações de valores de parâmetros que não tenham sido testados ou que não funcionem corretamente.

Solução

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

Nota

Por vezes, esta abordagem chama-se dimensionamento de t-shirt. Quando compra uma t-shirt, não tem muitas opções para o seu comprimento, largura, mangas, etc. Basta escolher entre tamanhos pequenos, médios e grandes e o estruturador de t-shirt predefiniu essas medidas com base nesse tamanho.

Exemplo

Suponha que tem um modelo que pode ser implementado em dois tipos de ambiente: não produção e produção. Consoante o tipo de ambiente, a configuração de que precisa é diferente:

Propriedade Ambientes de não produção Ambientes de produção
Serviço de Aplicações plano
Nome do SKU S2 P2V3
Capacidade (número de instâncias) 1 3
Serviço de Aplicações aplicação
AlwaysOn Desativado Ativado
Conta de armazenamento
Nome do SKU Standard_LRS Standard_ZRS

Pode utilizar o padrão do conjunto de configuração para este modelo.

Aceite um único parâmetro que indique o tipo de ambiente, como produção ou não produção. Utilize o @allowed decorador de parâmetros para garantir que os utilizadores do modelo apenas fornecem 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 consoante o tipo de ambiente. Repare que a variável tem dois objetos com o nome Production e NonProduction. Estes 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'
      }
    }
  }
}

Quando definir os recursos, utilize 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 a respetiva definição.
  • Na variável de mapa, pode definir ambos os valores de propriedade individuais (como a alwaysOn propriedade no exemplo) ou variáveis de objeto que definem uma propriedade de objeto (como as propriedades do SKU no exemplo).
  • Considere utilizar um conjunto de configuração com condições de recursos. Isto permite que o código do Bicep implemente determinados recursos em ambientes específicos e não noutros.

Passos seguintes

Saiba mais sobre o padrão de ficheiro de variável partilhada.