Exercice : Ajouter un script de déploiement à un modèle ARM

Effectué

Important

Vous avez besoin de votre propre abonnement Azure pour exécuter cet exercice et des frais pourraient vous être facturés. Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

Dans le cadre du processus de déploiement d’applications au sein de votre équipe, vous devez créer un compte de stockage et indexer un fichier dans le stockage d’objets blob que doit lire l’application. Jusqu’à présent, vous avez copié manuellement le fichier chaque fois que vous avez configuré un nouvel environnement. Vous optez pour un script de déploiement afin d’automatiser cette étape du processus de création de l’environnement.

Dans cet exercice, vous utilisez un modèle Azure Resource Manager (ARM) existant et ajoutez un nouveau script de déploiement.

Pendant ce processus, vous allez :

  • Créez un modèle de départ.
  • Ajoutez les prérequis des scripts de déploiement, y compris une identité managée affectée par l’utilisateur et une attribution de rôle.
  • Ajoutez les prérequis des scripts de déploiement, y compris une identité managée affectée par l’utilisateur et une attribution de rôle.
  • Déployez le modèle et vérifiez le résultat.

Cet exercice utilise les Outils Azure Resource Manager pour Visual Studio Code. Assurez-vous d’installer cette extension dans Visual Studio Code.

Cet exercice utilise l’extension Bicep pour Visual Studio Code. Assurez-vous d’installer cette extension dans Visual Studio Code.

Créer le modèle de départ

Vous démarrez avec un modèle existant que votre équipe utilise. Le modèle crée le compte de stockage, configure les services de blob qui nécessitent le protocole HTTPS et crée le conteneur de blobs pour vos fichiers de configuration.

  1. Ouvrez Visual Studio Code.

  2. Créez un fichier nommé azuredeploy.json.

  3. Enregistrez le fichier vide afin que Visual Studio Code charge les outils de modèle ARM.

    Vous pouvez soit sélectionner Fichier>Enregistrer sous, soit Ctrl+S dans Windows (⌘+S sur macOS). Veillez à mémoriser l’emplacement où vous avez enregistré le fichier. Vous pouvez par exemple créer un dossier scripts pour l’y enregistrer.

  4. Copiez le modèle de départ suivant dans azuredeploy.json.

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.1",
        "apiProfile": "",
        "parameters": {},
        "variables": {
            "storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]",
            "storageBlobContainerName": "config"
        },
        "functions": [],
        "resources": [
            {
                "name": "[variables('storageAccountName')]",
                "type": "Microsoft.Storage/storageAccounts",
                "apiVersion": "2023-01-01",
                "tags": {
                    "displayName": "[variables('storageAccountName')]"
                },
                "location": "[resourceGroup().location]",
                "kind": "StorageV2",
                "sku": {
                    "name": "Standard_LRS",
                    "tier": "Standard"
                },
                "properties": {
                    "allowBlobPublicAccess": true,
                    "encryption": {
                        "services": {
                            "blob": {
                                "enabled": true
                            }
                        },
                        "keySource": "Microsoft.Storage"
                    },
                    "supportsHttpsTrafficOnly": true
                }
            },
            {
                "type": "Microsoft.Storage/storageAccounts/blobServices",
                "apiVersion": "2019-04-01",
                "name": "[concat(variables('storageAccountName'), '/default')]",
                "dependsOn": [
                    "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
                ]
            },
            {
                "type": "Microsoft.Storage/storageAccounts/blobServices/containers",
                "apiVersion": "2019-04-01",
                "name": "[concat(variables('storageAccountName'),'/default/',variables('storageBlobContainerName'))]",
                "dependsOn": [
                    "[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('storageAccountName'), 'default')]",
                    "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
                ],
                "properties": {
                    "publicAccess": "Blob"
                }
            }
        ]
    }
    
  5. Enregistrez le modèle.

  1. Ouvrez Visual Studio Code.

  2. Créez un fichier nommé main.bicep.

  3. Enregistrez le fichier vide afin que Visual Studio Code charge les outils Bicep.

    Vous pouvez soit sélectionner Fichier>Enregistrer sous, soit Ctrl+S dans Windows (⌘+S sur macOS). Veillez à mémoriser l’emplacement où vous avez enregistré le fichier. Vous pouvez par exemple créer un dossier scripts pour l’y enregistrer.

  4. Copiez le modèle de départ suivant dans main.bicep.

    var storageAccountName = 'storage${uniqueString(resourceGroup().id)}'
    var storageBlobContainerName = 'config'
    
    resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
      name: storageAccountName
      tags: {
        displayName: storageAccountName
      }
      location: resourceGroup().location
      kind: 'StorageV2'
      sku: {
        name: 'Standard_LRS'
        tier: 'Standard'
      }
      properties: {
        allowBlobPublicAccess: true
        encryption: {
          services: {
            blob: {
              enabled: true
            }
          }
          keySource: 'Microsoft.Storage'
        }
        supportsHttpsTrafficOnly: true
      }
    
      resource blobService 'blobServices' existing = {
        name: 'default'
      }
    }
    
    resource blobContainer 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-04-01' = {
      parent: storageAccount::blobService
      name: storageBlobContainerName
      properties: {
        publicAccess: 'Blob'
      }
    }
    
  5. Enregistrez le modèle.

Ajouter une identité managée affectée par l’utilisateur

Vous devez ensuite créer une identité managée affectée par l’utilisateur. Compte tenu de l’approche d’infrastructure en tant que code, vous pouvez créer l’identité dans le modèle.

  1. Modifiez la section variables de azuredeploy.json pour y ajouter :

    "userAssignedIdentityName": "configDeployer",
    
  2. Modifiez la section resources de azuredeploy.json pour y ajouter :

    {
        "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
        "apiVersion": "2018-11-30",
        "name": "[variables('userAssignedIdentityName')]",
        "location": "[resourceGroup().location]"
    }
    
  3. Enregistrez le modèle.

  1. Sous les définitions de variables dans main.bicep, ajoutez :

    var userAssignedIdentityName = 'configDeployer'
    
  2. Sous les définitions de ressource, ajoutez :

    resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
      name: userAssignedIdentityName
      location: resourceGroup().location
    }
    
  3. Enregistrez le modèle.

Définir le rôle Contributeur pour l’identité managée

Maintenant que vous avez défini une identité managée, vous pouvez lui attribuer un rôle avec des droits sur le groupe de ressources. Vous lui attribuez le rôle Contributeur. Vous identifiez un rôle par son ID de définition de rôle, qui est un GUID. Le rôle Contributeur est intégré à Azure, de sorte que l’ID de définition de rôle est documenté.

L’attribution de rôle a également besoin d’un nom GUID. Vous pouvez utiliser la fonction guid pour créer un GUID unique pour le groupe de ressources et le nom de rôle.

  1. Modifiez la section variables de azuredeploy.json pour y ajouter :

    "roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]",
    "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
    
  2. Modifiez la section resources de azuredeploy.json pour y ajouter :

    {
        "type": "Microsoft.Authorization/roleAssignments",
        "apiVersion": "2020-04-01-preview",
        "name": "[variables('roleAssignmentName')]",
        "dependsOn": [ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName'))]" ],
        "properties": {
            "roleDefinitionId": "[variables('contributorRoleDefinitionId')]",
            "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName')), '2015-08-31-preview').principalId]",
            "scope": "[resourceGroup().id]",
            "principalType": "ServicePrincipal"
        }
    }
    
  3. Enregistrez le modèle.

  1. Sous les définitions de variables dans main.bicep, ajoutez :

    var roleAssignmentName = guid(resourceGroup().id, 'contributor')
    var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
    
  2. Sous les définitions de ressource, ajoutez :

    resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
      name: roleAssignmentName
      properties: {
        roleDefinitionId: contributorRoleDefinitionId
        principalId: userAssignedIdentity.properties.principalId
        principalType: 'ServicePrincipal'
      }
    }
    
  3. Enregistrez le modèle.

Créer le script de déploiement

À présent, vous avez tous les prérequis du script de déploiement. Vous commencez par les valeurs courantes dont le script de déploiement a besoin. Il existe deux dépendances, l’attribution de rôle et le conteneur de stockage blob. Votre script a besoin des deux pour s’exécuter.

  1. Modifiez la section variables de azuredeploy.json pour y ajouter :

    "deploymentScriptName": "CopyConfigScript"
    
  2. Modifiez la section resources de azuredeploy.json pour y ajouter :

    {
        "type": "Microsoft.Resources/deploymentScripts",
        "apiVersion": "2020-10-01",
        "name": "[variables('deploymentScriptName')]",
        "location": "[resourceGroup().location]",
        "kind": "AzurePowerShell",
        "dependsOn": [
            "[resourceId('Microsoft.Authorization/roleAssignments', variables('roleAssignmentName'))]",
            "[resourceId('Microsoft.Storage/storageAccounts/blobServices/containers', variables('storageAccountName'), 'default', variables('storageBlobContainerName'))]"
        ],
        "identity": {
            "type": "UserAssigned",
            "userAssignedIdentities": {
                "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('userAssignedIdentityName'))]": {}
            }
        }
    }
    
  3. Ajoutez une section properties à la ressource pour définir le script et les autres valeurs nécessaires.

    "properties": {
        "azPowerShellVersion": "3.0",
        "scriptContent": "
            Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json'
            $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' }
            $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $StorageAccount.Context
            $DeploymentScriptOutputs = @{}
            $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri
            $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri
        ",
        "retentionInterval": "P1D"
    }
    
  4. Enregistrez le modèle.

  1. Sous les définitions de variables dans main.bicep, ajoutez :

    var deploymentScriptName = 'CopyConfigScript'
    
  2. Sous les définitions de ressource, ajoutez :

    resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
      name: deploymentScriptName
      location: resourceGroup().location
      kind: 'AzurePowerShell'
      identity: {
        type: 'UserAssigned'
        userAssignedIdentities: {
          '${userAssignedIdentity.id}': {}
        }
      }
      dependsOn: [
        roleAssignment
        blobContainer
      ]
    }
    
  3. Ajoutez une section properties à la ressource pour définir le script et les autres valeurs nécessaires.

    properties: {
      azPowerShellVersion: '3.0'
      scriptContent: '''
        Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json'
        $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' }
        $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $storageAccount.Context
        $DeploymentScriptOutputs = @{}
        $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri
        $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri
      '''
      retentionInterval: 'P1D'
    }
    
  4. Enregistrez le modèle.

Ajouter une sortie de modèle

Maintenant que vous avez un script de déploiement qui charge un fichier dans un stockage blob Azure, vous devez peut-être référencer cet emplacement de fichier dans l’automatisation ultérieure. (Vous pouvez exécuter un test pour vérifier que le fichier est là où vous le pensez.)

Après la section resources du modèle ARM, ajoutez une sortie qui référence l’URI du fichier tel qu’il est indiqué par le script de déploiement.

"outputs": {
    "fileUri": {
        "type": "string",
        "value": "[reference(variables('deploymentScriptName')).outputs.Uri]"
    }
}

En bas du fichier, après les définitions de ressource, ajoutez une sortie qui référence l’URI du fichier tel qu’il est indiqué par le script de déploiement.

output fileUri string = deploymentScript.properties.outputs.Uri

Vérification du modèle

Votre modèle doit ressembler à ceci :

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.1",
    "apiProfile": "",
    "parameters": {},
    "variables": {
        "storageAccountName": "[concat('storage', uniqueString(resourceGroup().id))]",
        "storageBlobContainerName": "config",
        "userAssignedIdentityName": "configDeployer",
        "roleAssignmentName": "[guid(concat(resourceGroup().id, 'contributor'))]",
        "contributorRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
        "deploymentScriptName": "CopyConfigScript"
    },
    "functions": [],
    "resources": [
        {
            "name": "[variables('storageAccountName')]",
            "type": "Microsoft.Storage/storageAccounts",
            "apiVersion": "2023-01-01",
            "tags": {
                "displayName": "[variables('storageAccountName')]"
            },
            "location": "[resourceGroup().location]",
            "kind": "StorageV2",
            "sku": {
                "name": "Standard_LRS",
                "tier": "Standard"
            },
            "properties": {
                "allowBlobPublicAccess": true,
                "encryption": {
                    "services": {
                        "blob": {
                            "enabled": true
                        }
                    },
                    "keySource": "Microsoft.Storage"
                },
                "supportsHttpsTrafficOnly": true
            }
        },
        {
            "type": "Microsoft.Storage/storageAccounts/blobServices",
            "apiVersion": "2019-04-01",
            "name": "[concat(variables('storageAccountName'), '/default')]",
            "dependsOn": [
                "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
            ]
        },
        {
            "type": "Microsoft.Storage/storageAccounts/blobServices/containers",
            "apiVersion": "2019-04-01",
            "name": "[concat(variables('storageAccountName'),'/default/',variables('storageBlobContainerName'))]",
            "dependsOn": [
                "[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('storageAccountName'), 'default')]",
                "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
            ],
            "properties": {
                "publicAccess": "Blob"
            }
        },
        {
            "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
            "apiVersion": "2018-11-30",
            "name": "[variables('userAssignedIdentityName')]",
            "location": "[resourceGroup().location]"
        },
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2020-04-01-preview",
            "name": "[variables('roleAssignmentName')]",
            "dependsOn": [ "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName'))]" ],
            "properties": {
                "roleDefinitionId": "[variables('contributorRoleDefinitionId')]",
                "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('userAssignedIdentityName')), '2015-08-31-preview').principalId]",
                "scope": "[resourceGroup().id]",
                "principalType": "ServicePrincipal"
            }
        },
        {
            "type": "Microsoft.Resources/deploymentScripts",
            "apiVersion": "2020-10-01",
            "name": "[variables('deploymentScriptName')]",
            "location": "[resourceGroup().location]",
            "kind": "AzurePowerShell",
            "dependsOn": [
                "[resourceId('Microsoft.Authorization/roleAssignments', variables('roleAssignmentName'))]",
                "[resourceId('Microsoft.Storage/storageAccounts/blobServices/containers', variables('storageAccountName'), 'default', variables('storageBlobContainerName'))]"
            ],
            "identity": {
                "type": "UserAssigned",
                "userAssignedIdentities": {
                    "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('userAssignedIdentityName'))]": {}
                }
            },
            "properties": {
                "azPowerShellVersion": "3.0",
                "scriptContent": "
                    Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json'
                    $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' }
                    $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $StorageAccount.Context
                    $DeploymentScriptOutputs = @{}
                    $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri
                    $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri
                ",
                "retentionInterval": "P1D"
            }
        }
    ],
    "outputs": {
        "fileUri": {
            "type": "string",
            "value": "[reference(variables('deploymentScriptName')).outputs.Uri]"
        }
    }
}
var storageAccountName = 'storage${uniqueString(resourceGroup().id)}'
var storageBlobContainerName = 'config'
var userAssignedIdentityName = 'configDeployer'
var roleAssignmentName = guid(resourceGroup().id, 'contributor')
var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
var deploymentScriptName = 'CopyConfigScript'

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: storageAccountName
  tags: {
    displayName: storageAccountName
  }
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
    tier: 'Standard'
  }
  properties: {
    allowBlobPublicAccess: true
    encryption: {
      services: {
        blob: {
          enabled: true
        }
      }
      keySource: 'Microsoft.Storage'
    }
    supportsHttpsTrafficOnly: true
  }

  resource blobService 'blobServices' existing = {
    name: 'default'
  }
}

resource blobContainer 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-04-01' = {
  parent: storageAccount::blobService
  name: storageBlobContainerName
  properties: {
    publicAccess: 'Blob'
  }
}

resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
  name: userAssignedIdentityName
  location: resourceGroup().location
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' = {
  name: roleAssignmentName
  properties: {
    roleDefinitionId: contributorRoleDefinitionId
    principalId: userAssignedIdentity.properties.principalId
    principalType: 'ServicePrincipal'
  }
}

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
  name: deploymentScriptName
  location: resourceGroup().location
  kind: 'AzurePowerShell'
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${userAssignedIdentity.id}': {}
    }
  }
  properties: {
    azPowerShellVersion: '3.0'
    scriptContent: '''
      Invoke-RestMethod -Uri 'https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-deploymentscripts-sample/appsettings.json' -OutFile 'appsettings.json'
      $storageAccount = Get-AzStorageAccount -ResourceGroupName 'learndeploymentscript_exercise_1' | Where-Object { $_.StorageAccountName -like 'storage*' }
      $blob = Set-AzStorageBlobContent -File 'appsettings.json' -Container 'config' -Blob 'appsettings.json' -Context $storageAccount.Context
      $DeploymentScriptOutputs = @{}
      $DeploymentScriptOutputs['Uri'] = $blob.ICloudBlob.Uri
      $DeploymentScriptOutputs['StorageUri'] = $blob.ICloudBlob.StorageUri
    '''
    retentionInterval: 'P1D'
  }
  dependsOn: [
    roleAssignment
    blobContainer
  ]
}

output fileUri string = deploymentScript.properties.outputs.Uri

Si ce n’est pas le cas, copiez l’exemple ou ajustez votre modèle pour qu’il y corresponde.

Déployer le modèle

Pour déployer ce modèle sur Azure, vous devez vous connecter à votre compte Azure à partir du terminal Visual Studio Code. Veillez à installer les outils Azure CLI.

  1. Dans le menu Terminal, sélectionnez Nouveau terminal. La fenêtre de terminal s’ouvre généralement dans la moitié inférieure de votre écran.

  2. Si l’interpréteur de commandes affiché sur le côté droit de la fenêtre de terminal est bash, il s’agit du bon interpréteur de commandes qui est ouvert et vous pouvez passer à la section suivante.

    Capture d’écran de la fenêtre de terminal Visual Studio Code avec l’option bash affichée.

  3. Si un interpréteur de commandes autre que bash apparaît, sélectionnez la flèche déroulante des interpréteurs de commandes, puis Azure Cloud Shell (Bash).

    Capture d’écran de la fenêtre de terminal Visual Studio Code avec la liste déroulante de l’interpréteur de commande affichée et l’option Git Bash par défaut sélectionnée.

  4. Dans la liste des interpréteurs de commandes de terminal, sélectionnez bash.

    Capture d’écran de la fenêtre de terminal Visual Studio Code avec le terminal bash sélectionné.

  5. Dans le terminal, accédez au répertoire où vous avez enregistré votre modèle. Par exemple, si vous avez enregistré votre modèle dans le dossier templates, vous pouvez utiliser la commande suivante :

    cd templates
    

Connexion à Azure avec Azure CLI

  1. Dans le terminal Visual Studio Code, connectez-vous à Azure en exécutant la commande suivante :

    az login
    
  2. Dans le navigateur qui s’ouvre, connectez-vous à votre compte Azure.

    Le terminal Visual Studio Code affiche la liste des abonnements associés à ce compte.

  3. Dans la liste, trouvez l’abonnement que vous voulez utiliser pour cet exercice.

    Si vous avez manqué la liste lors de la connexion, vous pouvez utiliser l’extrait suivant pour obtenir à nouveau la liste de vos abonnements.

    az account list --output table
    
  4. Définissez l’abonnement par défaut pour toutes les commandes Azure CLI exécutées dans cette session.

    az account set --subscription "Your Subscription Name or ID"
    

Pour déployer ce modèle sur Azure, vous devez vous connecter à votre compte Azure à partir du terminal Visual Studio Code. Veillez à installer les outils Azure CLI.

  1. Dans le menu Terminal, sélectionnez Nouveau terminal. La fenêtre de terminal s’ouvre généralement dans la moitié inférieure de votre écran.

  2. Si l’interpréteur de commandes affiché sur le côté droit de la fenêtre de terminal est bash, il s’agit du bon interpréteur de commandes qui est ouvert et vous pouvez passer à la section suivante.

    Capture d’écran de la fenêtre de terminal Visual Studio Code avec l’option bash affichée.

  3. Si un interpréteur de commandes autre que bash apparaît, sélectionnez la flèche déroulante des interpréteurs de commandes, puis Azure Cloud Shell (Bash).

    Capture d’écran de la fenêtre de terminal Visual Studio Code avec la liste déroulante de l’interpréteur de commande affichée et l’option Git Bash par défaut sélectionnée.

  4. Dans la liste des interpréteurs de commandes de terminal, sélectionnez bash.

    Capture d’écran de la fenêtre de terminal Visual Studio Code avec le terminal bash sélectionné.

  5. Dans le terminal, accédez au répertoire où vous avez enregistré votre modèle. Par exemple, si vous avez enregistré votre modèle dans le dossier templates, vous pouvez utiliser la commande suivante :

    cd templates
    

Installer Bicep

Exécutez la commande suivante pour vous assurer de disposer de la dernière version de Bicep :

az bicep install && az bicep upgrade

Connexion à Azure avec Azure CLI

  1. Dans le terminal Visual Studio Code, connectez-vous à Azure en exécutant la commande suivante :

    az login
    
  2. Dans le navigateur qui s’ouvre, connectez-vous à votre compte Azure.

    Le terminal Visual Studio Code affiche la liste des abonnements associés à ce compte.

  3. Dans la liste, trouvez l’abonnement que vous voulez utiliser pour cet exercice.

    Si vous avez manqué la liste lors de la connexion, vous pouvez utiliser l’extrait suivant pour obtenir à nouveau la liste de vos abonnements.

    az account list --output table
    
  4. Définissez l’abonnement par défaut pour toutes les commandes Azure CLI exécutées dans cette session.

    az account set --subscription "Your Subscription Name or ID"
    

Pour déployer ce modèle sur Azure, connectez-vous à votre compte Azure à partir du terminal Visual Studio Code. Vérifiez que vous avez installé Azure PowerShell et connectez-vous au même compte que celui qui a activé le bac à sable.

  1. Dans le menu Terminal, sélectionnez Nouveau terminal. La fenêtre de terminal s’ouvre généralement dans la moitié inférieure de votre écran.

  2. Si l’interpréteur de commandes affiché sur le côté droit de la fenêtre de terminal est powershell ou pwsh, il s’agit du bon interpréteur de commandes qui est ouvert et vous pouvez passer à la section suivante.

    Capture d’écran de la fenêtre de terminal Visual Studio Code, avec l’option pwsh indiquée dans la liste déroulante de l’interpréteur de commande.

  3. Si un shell autre que powershell ou pwsh apparaît, sélectionnez la flèche déroulante des interpréteurs de commandes, puis PowerShell.

    Capture d’écran de la fenêtre de terminal Visual Studio Code avec la liste déroulante de l’interpréteur de commande affichée avec PowerShell sélectionné.

  4. Dans la liste d’interpréteurs de commandes de terminal, sélectionnez powershell ou pwsh.

    Capture d’écran de la fenêtre de terminal Visual Studio Code avec le terminal PowerShell sélectionné.

  5. Dans le terminal, accédez au répertoire où vous avez enregistré votre modèle. Par exemple, si vous avez enregistré votre modèle dans le dossier templates, vous pouvez utiliser la commande suivante :

    Set-Location -Path templates
    

Connectez-vous à Azure en utilisant Azure PowerShell

  1. Dans le terminal Visual Studio Code, connectez-vous à Azure en exécutant la commande suivante :

    Connect-AzAccount
    
  2. Dans le navigateur qui s’ouvre, connectez-vous à votre compte Azure.

  3. Récupérez l’ID de l’abonnement que vous voulez utiliser pour cet exercice en exécutant la commande suivante :

    Get-AzSubscription
    

    L’ID d’abonnement est la deuxième colonne. Copiez la deuxième colonne. Il se présente ainsi : cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0.

  4. Définissez l’abonnement par défaut pour toutes les commandes Azure PowerShell exécutées dans cette session.

    Set-AzContext -SubscriptionId {Your subscription ID}
    

Pour déployer ce modèle sur Azure, connectez-vous à votre compte Azure dans le terminal Visual Studio Code. Vérifiez que vous avez installé Azure PowerShell.

  1. Dans le menu Terminal, sélectionnez Nouveau terminal. La fenêtre de terminal s’ouvre généralement dans la moitié inférieure de votre écran.

  2. Si l’interpréteur de commandes affiché sur le côté droit de la fenêtre de terminal est powershell ou pwsh, il s’agit du bon interpréteur de commandes qui est ouvert et vous pouvez passer à la section suivante.

    Capture d’écran de la fenêtre de terminal Visual Studio Code, avec l’option pwsh indiquée dans la liste déroulante de l’interpréteur de commande.

  3. Si un shell autre que powershell ou pwsh apparaît, sélectionnez la flèche déroulante des interpréteurs de commandes, puis PowerShell.

    Capture d’écran de la fenêtre de terminal Visual Studio Code avec la liste déroulante de l’interpréteur de commande affichée avec PowerShell sélectionné.

  4. Dans la liste d’interpréteurs de commandes de terminal, sélectionnez powershell ou pwsh.

    Capture d’écran de la fenêtre de terminal Visual Studio Code avec le terminal PowerShell sélectionné.

  5. Dans le terminal, accédez au répertoire où vous avez enregistré votre modèle. Par exemple, si vous avez enregistré votre modèle dans le dossier templates, vous pouvez utiliser la commande suivante :

    Set-Location -Path templates
    

Installer l’interface CLI Bicep

Pour utiliser Bicep à partir d’Azure PowerShell, installez l’interface CLI de Bicep.

Connectez-vous à Azure en utilisant Azure PowerShell

  1. Dans le terminal Visual Studio Code, connectez-vous à Azure en exécutant la commande suivante :

    Connect-AzAccount
    
  2. Dans le navigateur qui s’ouvre, connectez-vous à votre compte Azure.

  3. Récupérez l’ID de l’abonnement que vous voulez utiliser pour cet exercice en exécutant la commande suivante :

    Get-AzSubscription
    

    L’ID d’abonnement est la deuxième colonne. Copiez la deuxième colonne. Il se présente ainsi : cf49fbbc-217c-4eb6-9eb5-a6a6c68295a0.

  4. Définissez l’abonnement par défaut pour toutes les commandes Azure PowerShell exécutées dans cette session.

    Set-AzContext -SubscriptionId {Your subscription ID}
    

Vous devez ensuite créer un groupe de ressources pour contenir les ressources que vous créez dans le cadre de cet exercice. En utilisant un nouveau groupe de ressources, vous facilitez le nettoyage après l’exercice.

À partir du terminal dans Visual Studio Code, exécutez cette commande afin de créer le groupe de ressources pour cet exercice :

Créer un groupe de ressources pour l’exercice

resourceGroupName="learndeploymentscript_exercise_1"
az group create --location eastus --name $resourceGroupName
$resourceGroupName = 'learndeploymentscript_exercise_1'
New-AzResourceGroup -Location eastus -Name $resourceGroupName

Notes

Si vous utilisez un nom différent pour votre groupe de ressources, vous devez mettre à jour le script. Vous allez découvrir ultérieurement dans ce module comment éviter le codage effectué de manière irréversible des noms de groupe de ressources dans vos scripts.

Déployer le modèle sur Azure

Le code suivant déploie le modèle ARM sur Azure. Vous verrez un déploiement réussi.

Déployez le modèle en utilisant des commandes Azure CLI dans le terminal Visual Studio Code.

templateFile="azuredeploy.json"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today

az deployment group create \
    --resource-group $resourceGroupName \
    --name $deploymentName \
    --template-file $templateFile

Le code suivant déploie le modèle ARM sur Azure. Vous verrez un déploiement réussi.

Déployez le modèle en utilisant des commandes Azure CLI dans le terminal Visual Studio Code.

templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="deploymentscript-"$today

az deployment group create \
    --resource-group $resourceGroupName \
    --name $deploymentName \
    --template-file $templateFile

Le code suivant déploie le modèle sur Azure. Vous verrez un déploiement réussi.

Déployez le modèle en utilisant des commandes Azure PowerShell dans le terminal.

$templateFile = 'azuredeploy.json'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
  -ResourceGroupName $resourceGroupName `
  -Name $deploymentName `
  -TemplateFile $templateFile

Le code suivant déploie le modèle sur Azure. Vous verrez un déploiement réussi.

Déployez le modèle en utilisant des commandes Azure PowerShell dans le terminal.

$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "deploymentscript-$today"
New-AzResourceGroupDeployment `
  -ResourceGroupName $resourceGroupName `
  -Name $deploymentName `
  -TemplateFile $templateFile

Examiner le résultat de votre modèle

Une fois le déploiement terminé, vous recevez une URL qui pointe vers le fichier que votre script de déploiement a copié dans le stockage blob.

  1. Récupérez ce fichier en utilisant la sortie d’URL du déploiement de modèle pour confirmer que le script de déploiement fonctionne correctement.

    uri=$(az deployment group show --resource-group $resourceGroupName --name $deploymentName --query 'properties.outputs.fileUri.value' --output tsv)
    curl $uri
    

    La commande retourne le code suivant.

    {
      "environment": "production",
      "hostname": "tailwindtraders.com",
      "Logging": {
        "LogLevel": {
          "Default": "Debug"
        }
      },
      "ApplicationInsights": {
        "InstrumentationKey": ""
      },
      "AllowedHosts": "*",
      "CosmosDb": {
        "Host": "",
        "Key": "",
        "Database": "Products"
      }
    }
    
  2. Vous pouvez également consulter les journaux (et d’autres informations sur le déploiement) dans le portail Azure ou en exécutant la commande suivante.

    az deployment-scripts show-log --resource-group $resourceGroupName --name CopyConfigScript
    
  1. Récupérez ce fichier en utilisant la sortie d’URL du déploiement de modèle pour confirmer que le script de déploiement fonctionne correctement.

    $fileUri = (Get-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -Name $deploymentName).Outputs.fileUri.Value
    Invoke-RestMethod $fileUri
    

    La commande retourne le code suivant.

    environment         : production
    hostname            : tailwindtraders.com
    Logging             : @{LogLevel=}
    ApplicationInsights : @{InstrumentationKey=}
    AllowedHosts        : *
    CosmosDb            : @{Host=; Key=; Database=Products}
    
  2. Vous pouvez également consulter les journaux (et d’autres informations sur le déploiement) dans le portail Azure ou en utilisant la ligne de commande suivante.

    Get-AzDeploymentScriptLog -ResourceGroupName $resourceGroupName -Name CopyConfigScript
    

Nettoyer le groupe de ressources

Maintenant que vous avez déployé le modèle ARM avec un script de déploiement, vous pouvez supprimer le groupe de ressources qui contient toutes les ressources et attributions de rôles que vous avez créées.

az group delete --name $resourceGroupName
Remove-AzResourceGroup -Name $resourceGroupName