Spec de modèle Azure Resource Manager

Une spec de modèle est un type de ressource permettant de stocker un modèle Resource Manager dans Azure en vue d’un déploiement ultérieur. Ce type de ressource vous permet de partager des modèles Ressource Manager avec d’autres utilisateurs de votre organisation. Comme toute autre ressource Azure, vous pouvez utiliser le contrôle d’accès en fonction du rôle Azure (Azure RBAC) pour partager la spec de modèle.

Microsoft.Resources/templateSpecs est le type de ressource pour les specs de modèle. Il se compose d’un modèle principal et d’un nombre quelconque de modèles liés. Azure stocke en toute sécurité les specs de modèle dans des groupes de ressources. Specs de modèle prend en charge le contrôle de version.

Pour déployer la spec de modèle, vous utilisez des outils Azure standard tels que PowerShell, Azure CLI, Portail Azure, REST et d’autres Kits de développement logiciel (SDK) et clients pris en charge. Vous utilisez les mêmes commandes que pour le modèle.

Notes

Pour utiliser la spec de modèle avec Azure PowerShell, vous devez installer la version 5.0.0 ou ultérieure. Pour l’utiliser avec l’interface de ligne de commande Azure CLI, utilisez la version 2.14.2 ou ultérieure.

Lors de la conception de votre déploiement, tenez toujours compte du cycle de vie des ressources et regroupez dans un seul spec de modèle celles qui partagent un cycle de vie similaire. Par exemple, vos déploiements comprennent plusieurs instances d’Azure Cosmos DB et chaque instance contient ses propres bases de données et conteneurs. Étant donné que les bases de données et les conteneurs changent peu, vous voulez créer un spec de modèle pour une instance Cosmos DB et ses bases de données et conteneurs sous-jacents. Vous pouvez ensuite utiliser des instructions conditionnelles dans vos modèles ainsi que des boucles de copie pour créer plusieurs instances de ces ressources.

Ressources de formation

Pour en savoir plus sur les specs de modèle et pour obtenir des conseils d’aide pratiques, consultez Publier des bibliothèques de code d’infrastructure réutilisable à l’aide de specs de modèle.

Conseil

Nous recommandons Bicep parce qu’il offre les mêmes fonctionnalités que les modèles ARM et que la syntaxe est plus facile d’utilisation. Pour en savoir plus, consultez Specs de modèle Azure Resource Manager dans Bicep.

Pourquoi utiliser des spécifications de modèle ?

Les specs de modèle permettent de bénéficier des avantages suivants :

  • Vous utilisez des modèles ARM standard pour votre spec de modèle.
  • Vous gérez l’accès par le biais d’Azure RBAC, plutôt que des jetons SAP.
  • Les utilisateurs peuvent déployer la spec de modèle sans avoir d’accès en écriture au modèle.
  • Vous pouvez intégrer la spec de modèle dans un processus de déploiement existant, tel qu’un script PowerShell ou un pipeline DevOps.

Les specs de modèle vous permettent de créer des modèles canoniques et de les partager avec des équipes de votre organisation. Les specs de modèle sont sécurisées, car elles sont disponibles pour Azure Resource Manager pour le déploiement, mais ne sont pas accessibles aux utilisateurs qui n’ont pas l’autorisation appropriée. Les utilisateurs ont uniquement besoin d’un accès en lecture à la spec de modèle pour en déployer le modèle, de sorte que vous pouvez partager le modèle sans permettre à d’autres utilisateurs de le modifier.

Si vous avez actuellement vos modèles dans un GitHub référentiel ou un compte de stockage, vous rencontrez plusieurs défis quand vous essayez de partager et d’utiliser les modèles. Pour déployer le modèle, vous devez rendre le modèle accessible publiquement ou gérer l’accès avec des jetons SAP. Pour contourner cette limite, les utilisateurs peuvent créer des copies locales, qui finissent par diverger de votre modèle original. Les specs de modèle simplifient le partage des modèles.

Les modèles que vous incluez dans une spec de modèle doivent être vérifiés par les administrateurs de votre organisation afin de respecter les exigences et les directives de l’organisation.

Autorisations requises

Il existe deux rôles intégrés Azure définis pour la spec de modèle :

En outre, vous avez également besoin des autorisations pour le déploiement d’un fichier Bicep. Consultez Déployer - CLI ou Déployer - PowerShell.

Créer une spec de modèle

L’exemple suivant montre un modèle simple pour la création d’un compte de stockage dans Azure.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountType": {
      "type": "string",
      "defaultValue": "Standard_LRS",
      "allowedValues": [
        "Standard_LRS",
        "Standard_GRS",
        "Standard_ZRS",
        "Premium_LRS"
      ]
    }
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2019-06-01",
      "name": "[concat('store', uniquestring(resourceGroup().id))]",
      "location": "[resourceGroup().location]",
      "kind": "StorageV2",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      }
    }
  ]
}

Lorsque vous créez la spec de modèle, les commandes PowerShell ou CLI sont transmises au fichier de modèle principal. Si le modèle principal fait référence à des modèles liés, les commandes les recherchent et les empaquettent pour créer la spec de modèle. Pour plus d’informations, consultez Créer une spec de modèle avec des modèles liés.

Créez une spec de modèle en utilisant :

New-AzTemplateSpec -Name storageSpec -Version 1.0a -ResourceGroupName templateSpecsRg -Location westus2 -TemplateFile ./mainTemplate.json

Vous pouvez également créer des specs de modèle à l’aide de modèles ARM. Le modèle suivant crée une spec de modèle pour déployer un compte de stockage :

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "templateSpecName": {
      "type": "string",
      "defaultValue": "CreateStorageAccount"
    },
    "templateSpecVersionName": {
      "type": "string",
      "defaultValue": "0.1"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/templateSpecs",
      "apiVersion": "2021-05-01",
      "name": "[parameters('templateSpecName')]",
      "location": "[parameters('location')]",
      "properties": {
        "description": "A basic templateSpec - creates a storage account.",
        "displayName": "Storage account (Standard_LRS)"
      }
    },
    {
      "type": "Microsoft.Resources/templateSpecs/versions",
      "apiVersion": "2021-05-01",
      "name": "[format('{0}/{1}', parameters('templateSpecName'), parameters('templateSpecVersionName'))]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Resources/templateSpecs', parameters('templateSpecName'))]"
      ],
      "properties": {
        "mainTemplate": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {
            "storageAccountType": {
              "type": "string",
              "defaultValue": "Standard_LRS",
              "allowedValues": [
                "Standard_LRS",
                "Standard_GRS",
                "Standard_ZRS",
                "Premium_LRS"
              ]
            }
          },
          "resources": [
            {
              "type": "Microsoft.Storage/storageAccounts",
              "apiVersion": "2019-06-01",
              "name": "[concat('store', uniquestring(resourceGroup().id))]",
              "location": "[resourceGroup().location]",
              "kind": "StorageV2",
              "sku": {
                "name": "[parameters('storageAccountType')]"
              }
            }
          ]
        }
      }
    }
  ]
}

La taille des spécifications d’un modèle est limitée à environ 2 Mo. Si la taille des specs d’un modèle dépasse la limite, vous recevez le code d’erreur TemplateSpecTooLarge. Le message d’erreur indique :

The size of the template spec content exceeds the maximum limit. For large template specs with many artifacts, the recommended course of action is to split it into multiple template specs and reference them modularly via TemplateLinks.

Vous pouvez afficher toutes les specs de modèle dans votre abonnement en utilisant :

Get-AzTemplateSpec

Vous pouvez afficher les détails d’une spec de modèle, notamment ses versions, avec :

Get-AzTemplateSpec -ResourceGroupName templateSpecsRG -Name storageSpec

Déployer une spec de modèle

Une fois que vous avez créé la spec de modèle, les utilisateurs ayant le rôle Lecteur de spec de modèle peuvent déployer le modèle. En outre, vous avez également besoin des autorisations pour le déploiement d’un modèle ARM. Consultez Déployer - CLI ou Déployer - PowerShell.

Les specs de modèle peuvent être déployées via le portail, PowerShell, Azure CLI, ou en tant que modèle lié dans un déploiement de modèle plus volumineux. Les utilisateurs d’une organisation peuvent déployer une spec de modèle sur n’importe quelle étendue d’Azure (groupe de ressources, abonnement, groupe d’administration ou locataire).

Au lieu de passer par un chemin d’accès ou un URI pour un modèle, vous déployez une spec de modèle en fournissant son ID de ressource. L’ID de ressource possède le format suivant :

/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Resources/templateSpecs/{template-spec-name}/versions/{template-spec-version}

Notez que l’ID de la ressource contient un nom de version pour la spec de modèle.

Par exemple, vous déployez une spec de modèle à l’aide de la commande suivante.

$id = "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/templateSpecsRG/providers/Microsoft.Resources/templateSpecs/storageSpec/versions/1.0a"

New-AzResourceGroupDeployment `
  -TemplateSpecId $id `
  -ResourceGroupName demoRG

En pratique, vous exécutez généralement Get-AzTemplateSpec ou az ts show pour obtenir l’ID de la spec de modèle à déployer.

$id = (Get-AzTemplateSpec -Name storageSpec -ResourceGroupName templateSpecsRg -Version 1.0a).Versions.Id

New-AzResourceGroupDeployment `
  -ResourceGroupName demoRG `
  -TemplateSpecId $id

Vous pouvez également ouvrir une URL au format suivant pour déployer une spec de modèle :

https://portal.azure.com/#create/Microsoft.Template/templateSpecVersionId/%2fsubscriptions%2f{subscription-id}%2fresourceGroups%2f{resource-group-name}%2fproviders%2fMicrosoft.Resources%2ftemplateSpecs%2f{template-spec-name}%2fversions%2f{template-spec-version}

Paramètres

Passer des paramètres au modèle de spécification revient exactement à passer des paramètres à un modèle ARM. Ajoutez les valeurs de paramètres en ligne ou dans un fichier de paramètres.

Pour passer un paramètre en ligne, utilisez :

New-AzResourceGroupDeployment `
  -TemplateSpecId $id `
  -ResourceGroupName demoRG `
  -StorageAccountType Standard_GRS

Pour créer un fichier de paramètres locaux, utilisez :

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "StorageAccountType": {
      "value": "Standard_GRS"
    }
  }
}

Puis transmettez ce fichier de paramètres avec :

New-AzResourceGroupDeployment `
  -TemplateSpecId $id `
  -ResourceGroupName demoRG `
  -TemplateParameterFile ./mainTemplate.parameters.json

Gestion de version

Quand vous créez une spec de modèle, vous indiquez son nom de version. Lorsque vous itérez sur le code du modèle, vous pouvez mettre à jour une version existante (pour les correctifs logiciels) ou publier une nouvelle version. La version est une chaîne de texte. Vous êtes libre de choisir le système de contrôle de version, notamment le contrôle de version sémantique. Les utilisateurs de la spec de modèle peuvent fournir le nom de version à utiliser au moment de son déploiement. Vous pouvez avoir un nombre illimité de versions.

Utiliser des balises

Les étiquettes vous aident à organiser logiquement vos ressources. Vous pouvez ajouter des balises aux spécifications de modèle à l’aide d’Azure PowerShell et d’Azure CLI :

New-AzTemplateSpec `
  -Name storageSpec `
  -Version 1.0a `
  -ResourceGroupName templateSpecsRg `
  -Location westus2 `
  -TemplateFile ./mainTemplate.json `
  -Tag @{Dept="Finance";Environment="Production"}
Set-AzTemplateSpec `
  -Name storageSpec `
  -Version 1.0a `
  -ResourceGroupName templateSpecsRg `
  -Location westus2 `
  -TemplateFile ./mainTemplate.json `
  -Tag @{Dept="Finance";Environment="Production"}

Lors de la création ou de la modification d’une spécification de modèle avec le paramètre de version spécifié, mais sans le paramètre de balise/balises :

  • Si la spécification de modèle existe et contient des balises, mais que la version n’existe pas, la nouvelle version hérite des mêmes balises que la spécification de modèle existante.

Lors de la création ou de la modification d’une spécification de modèle avec les paramètres de balise/balises et la version spécifiée :

  • Si la spécification de modèle et la version n’existent pas, les balises sont ajoutées à la fois à la nouvelle spécification de modèle et à la nouvelle version.
  • Si la spécification de modèle existe, mais que la version n’existe pas, les balises sont ajoutées uniquement à la nouvelle version.
  • Si la spécification de modèle et la version existent, les balises s’appliquent uniquement à la version.

Lors de la modification d’un modèle avec le paramètre balise/balises spécifié, mais sans le paramètre version spécifié, les balises sont uniquement ajoutées à la spécification du modèle.

Créer une spec de modèle avec des modèles liés

Si le modèle principal de votre spec de modèle fait référence à des modèles liés, les commandes PowerShell et CLI peuvent automatiquement trouver et empaqueter les modèles liés à partir de votre disque local. Vous n’avez pas besoin de configurer manuellement les référentiels ou les comptes de stockage pour héberger les specs de modèle : tout est autonome dans la ressource de spec de modèle.

L’exemple suivant est constitué d’un modèle principal et de deux modèles liés. L’exemple n’est qu’un extrait du modèle. Notez qu’il utilise une propriété nommée relativePath pour créer un lien vers les autres modèles. Vous devez utiliser apiVersion de 2020-06-01 ou une version ultérieure pour la ressource de déploiement.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  ...
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-06-01",
      ...
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "relativePath": "artifacts/webapp.json"
        }
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-06-01",
      ...
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "relativePath": "artifacts/database.json"
        }
      }
    }
  ],
  "outputs": {}
}

Lorsque la commande PowerShell ou CLI permettant de créer la spec de modèle est exécutée pour l’exemple précédent, la commande recherche trois fichiers (le modèle principal, le modèle d’application web [webapp.json] et le modèle de base de données [database.json]), et les empaquette dans la spec de modèle.

Pour plus d’informations, consultez Didacticiel : Créer une spec de modèle avec des modèles liés.

Déployer la spec de modèle en tant que modèle lié

Une fois que vous avez créé une spec de modèle, il est facile de la réutiliser à partir d’un modèle Resource Manager ou d’une autre spec de modèle. Vous pouvez créer un lien vers une spec de modèle en ajoutant son ID de ressource à votre modèle. La spec de modèle lié est déployée automatiquement lorsque vous déployez le modèle principal. Ce comportement vous permet de développer des specs de modèle modulaires et de les réutiliser en fonction des besoins.

Par exemple, vous pouvez créer une spec de modèle qui déploie des ressources réseau et une autre spec de modèle qui déploie des ressources de stockage. Dans les modèles Resource Manager, vous pouvez établir un lien vers ces deux specs de modèle chaque fois que vous avez besoin de configurer des ressources réseau ou de stockage.

L’exemple suivant est similaire à l’exemple précédent, mais vous utilisez la propriété id pour créer un lien vers une spec de modèle plutôt que la propriété relativePath pour créer un lien vers un modèle local. Utilisez 2020-06-01 pour la version d’API de la ressource de déploiement. Dans l’exemple, les specs de modèle se trouvent dans un groupe de ressources nommé templateSpecsRG.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  ...
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-06-01",
      "name": "networkingDeployment",
      ...
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "id": "[resourceId('templateSpecsRG', 'Microsoft.Resources/templateSpecs/versions', 'networkingSpec', '1.0a')]"
        }
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-06-01",
      "name": "storageDeployment",
      ...
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "id": "[resourceId('templateSpecsRG', 'Microsoft.Resources/templateSpecs/versions', 'storageSpec', '1.0a')]"
        }
      }
    }
  ],
  "outputs": {}
}

Pour plus d’informations sur la liaison de specs de modèle, consultez Didacticiel : Déployer une spec de modèle en tant que modèle lié.

Étapes suivantes