Modèle de jeu de configuration

Au lieu de définir un grand nombre de paramètres individuels, créez des jeux de valeurs prédéfinis. Pendant le déploiement, sélectionnez le jeu de valeurs à utiliser.

Contexte et problème

Un seul fichier Bicep définit souvent de nombreuses ressources. Chaque ressource devra peut-être utiliser une configuration différente en fonction de l’environnement dans lequel vous la déployez. Par exemple, vous pouvez créer un fichier Bicep qui déploie un plan et une application App Service ainsi qu’un compte de stockage. Chacune de ces ressources a plusieurs options qui affectent son coût, sa disponibilité et sa résilience. Pour les environnements de production, il est préférable d’utiliser un jeu de configuration qui privilégie la haute disponibilité et la résilience. Pour les environnements hors production, il est préférable d’utiliser un autre jeu de configuration qui privilégie la réduction des coûts.

Vous pouvez créer des paramètres pour définir chaque configuration, mais cela présente certains inconvénients :

  • Il s’agit d’une approche assez lourde pour les utilisateurs du modèle, qui doivent comprendre les valeurs à utiliser pour chaque ressource et l’impact de la définition de chaque paramètre.
  • Le nombre de paramètres de votre modèle augmente avec chaque nouvelle ressource que vous définissez.
  • Les utilisateurs peuvent choisir des combinaisons de valeurs de paramètres qui n’ont pas été testées ou qui ne fonctionneront pas correctement.

Solution

Créez un paramètre unique pour spécifier le type d’environnement. Utilisez une variable afin de sélectionner automatiquement la configuration pour chaque ressource en fonction de la valeur du paramètre.

Notes

Cette approche est parfois appelée le t-shirt sizing. Quand vous achetez un T-shirt, vous disposez d’un choix limité en termes de longueur, de largeur, de forme de manches, etc. Vous avez simplement le choix entre les tailles petite, moyenne et grande, et le designer du T-shirt a utilisé des mesures prédéfinies en fonction de ces tailles.

Exemple

Supposons que vous disposez d’un modèle qui peut être déployé sur deux types d’environnement : production et hors production. La configuration dont vous avez besoin diffère selon le type d’environnement :

Propriété Environnements hors production Les environnements de production
Plan App Service
Nom de la référence (SKU) S2 P2V3
Capacité (nombre d’instances) 1 3
application App Service
Always On Désactivé activé
Compte de stockage
Nom de la référence (SKU) Standard_LRS Standard_ZRS

Vous pouvez utiliser le modèle de jeu de configuration pour ce modèle.

Acceptez un seul paramètre qui indique le type d’environnement : production ou hors production. Utilisez l’élément décoratif de paramètre @allowed pour être certain que les utilisateurs de votre modèle fournissent uniquement les valeurs que vous attendez :

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

Créez ensuite une variable de mappage, c’est-à-dire un objet qui définit la configuration spécifique en fonction du type d’environnement. Notez que la variable a deux objets nommés Production et NonProduction. Ces noms correspondent aux valeurs autorisées pour le paramètre dans l’exemple précédent :

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'
      }
    }
  }
}

Quand vous définissez les ressources, utilisez la table de configuration pour définir les propriétés de la ressource :

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
}

Considérations

  • Dans votre variable de mappage, envisagez de regrouper les propriétés par ressource pour simplifier leur définition.
  • Dans votre variable de mappage, vous pouvez définir des valeurs de propriété individuelles (comme la propriété alwaysOn dans l’exemple) ou des variables objet qui définissent une propriété d’objet (comme les propriétés de SKU dans l’exemple).
  • Envisagez d’utiliser un jeu de configuration avec des conditions de ressource. Votre code Bicep pourra ainsi déployer certaines ressources dans des environnements spécifiques uniquement.

Étapes suivantes

Découvrez le modèle de fichier de variables partagées.