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 este enfoque 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.