Patrón de conjunto de configuración

En lugar de definir una gran cantidad de parámetros individuales, cree conjuntos predefinidos de valores. Durante la implementación, seleccione el conjunto de valores que se usará.

Contexto y problema

Un único archivo Bicep suele definir muchos recursos. Es posible que cada recurso tenga que usar una configuración diferente en función del entorno en el que se va a implementar. Por ejemplo, puede compilar un archivo Bicep que implemente un plan y una aplicación de App Service, así como una cuenta de almacenamiento. Cada uno de estos recursos tiene varias opciones que afectan a su costo, disponibilidad y resistencia. En entornos de producción, quiere usar un conjunto de configuración que dé prioridad a la alta disponibilidad y resistencia. En entornos que no son de producción, quiere usar un conjunto de configuración diferente que dé prioridad a la reducción de costos.

Puede crear parámetros para cada opción de configuración, pero esto tiene algunas desventajas:

  • Este enfoque crea una carga para los usuarios de la plantilla, ya que necesitan comprender los valores que se van a usar para cada recurso y el impacto de establecer cada parámetro.
  • El número de parámetros de la plantilla aumenta con cada nuevo recurso que define.
  • Los usuarios pueden seleccionar combinaciones de valores de parámetro que no se han probado o que no funcionarán correctamente.

Solución

Cree un único parámetro para especificar el tipo de entorno. Use una variable para seleccionar automáticamente la configuración de cada recurso en función del valor del parámetro.

Nota:

Este método se denomina en ocasiones tallaje de camiseta. Al comprar una camiseta, no se obtienen muchas opciones para su longitud, ancho, mangas, etc. Basta con elegir entre tamaños pequeños, medianos y grandes, y el diseñador de camisetas ha predefinido esas medidas en función de ese tamaño.

Ejemplo

Supongamos que tiene una plantilla que se puede implementar en dos tipos de entorno: no producción y producción. Según el tipo de entorno, la configuración que necesita es diferente:

Propiedad Entornos que no son de producción Entornos de producción
plan de App Service
Nombre de SKU S2 P2V3
Capacidad (número de instancias) 1 3
Aplicación de App Service
Always On Disabled habilitado
Cuenta de almacenamiento
Nombre de SKU Standard_LRS Standard_ZRS

Puede usar el patrón de conjunto de configuración para esta plantilla.

Acepte un único parámetro que indique el tipo de entorno, como producción o no producción. Use el decorador de parámetros @allowed para asegurarse de que los usuarios de la plantilla solo proporcionen los valores que espera:

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

A continuación, cree una variable de mapa, que es un objeto que define la configuración específica en función del tipo de entorno. Observe que la variable tiene dos objetos denominados Production y NonProduction. Estos nombres coinciden con los valores permitidos para el parámetro en el ejemplo 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'
      }
    }
  }
}

Al definir los recursos, use el mapa de configuración para definir las propiedades del 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
}

Consideraciones

  • En la variable de mapa, considere la posibilidad de agrupar las propiedades por recurso para simplificar su definición.
  • En la variable de mapa, puede definir ambos valores de propiedad individuales (como la propiedad alwaysOn en el ejemplo) o variables de objeto que establecen una propiedad de objeto (como las propiedades de SKU del ejemplo).
  • Considere la posibilidad de usar un conjunto de configuración con condiciones de recursos. Esto permite que el código de Bicep implemente determinados recursos para entornos específicos y no en otros.

Pasos siguientes

Más información sobre el patrón de archivo de variables compartido.