Partager via


Tutoriel : Utiliser des scripts de déploiement pour créer un certificat auto-signé

Découvrez comment utiliser des scripts de déploiement dans des modèles Azure Resource Manager (modèles ARM). Les scripts de déploiement peuvent être utilisés pour effectuer des étapes personnalisées qui ne peuvent pas être effectuées par les modèles ARM. Par exemple, la création d’un certificat auto-signé. Dans ce tutoriel, vous allez créer un modèle pour déployer un coffre de clés Azure, puis utiliser une Microsoft.Resources/deploymentScripts ressource dans le même modèle pour créer un certificat, puis ajouter le certificat au coffre de clés. Pour en savoir plus sur le script de déploiement, consultez Utiliser des scripts de déploiement dans des modèles ARM.

Important

Deux ressources de script de déploiement, un compte de stockage et une instance de conteneur, sont créées dans le même groupe de ressources pour l’exécution et la résolution des problèmes de script. Ces ressources sont généralement supprimées par le service de script lorsque l’exécution du script est dans un état terminal. Vous êtes facturé pour les ressources jusqu’à ce que les ressources soient supprimées. Pour plus d’informations, consultez Nettoyage des ressources de script de déploiement.

Ce tutoriel décrit les tâches suivantes :

  • Ouvrir un modèle de démarrage rapide
  • Modifier le modèle
  • Déployer le modèle
  • Déboguer le script ayant échoué
  • Nettoyer les ressources

Pour obtenir un module Learn qui couvre les scripts de déploiement, consultez Étendre les modèles ARM à l’aide de scripts de déploiement.

Prerequisites

Pour effectuer ce qui est décrit dans cet article, vous avez besoin des éléments suivants :

  • Visual Studio Code.

  • Identité managée affectée par l’utilisateur. Cette identité est utilisée pour effectuer des actions spécifiques à Azure dans le script. Pour en créer une, consultez l’identité managée affectée par l’utilisateur. Vous avez besoin de l’ID d’identité lorsque vous déployez le modèle. Le format de l’identité est le suivant :

    /subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<IdentityID>
    

    Utilisez le script CLI suivant pour obtenir l’ID en fournissant le nom du groupe de ressources et le nom de l’identité.

    echo "Enter the Resource Group name:" &&
    read resourceGroupName &&
    az identity list -g $resourceGroupName
    

Ouvrir un modèle de démarrage rapide

Au lieu de créer un modèle à partir de zéro, vous ouvrez un modèle à partir de modèles de démarrage rapide Azure. Les modèles de démarrage rapide Azure sont un référentiel pour les modèles ARM.

Le modèle utilisé dans ce guide de démarrage rapide est appelé Créer un coffre de clés Azure et un secret. Le modèle crée un coffre de clés, puis ajoute un secret au coffre de clés.

  1. Dans Visual Studio Code, sélectionnez Fichier>ouvert.

  2. Dans le nom de fichier, collez l’URL suivante :

    https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.keyvault/key-vault-create/azuredeploy.json
    
  3. Sélectionnez Ouvrir pour ouvrir le fichier.

  4. Sélectionnez Fichier>Enregistrer sous pour enregistrer le fichier en tant que azuredeploy.json sur votre ordinateur local.

Modifier le modèle

Apportez les modifications suivantes au modèle :

Nettoyer le modèle (facultatif)

Le modèle d’origine ajoute un secret au coffre de clés. Pour simplifier le didacticiel, supprimez la ressource suivante :

  • Microsoft.KeyVault/vaults/secrets

Supprimez les deux définitions de paramètres suivantes :

  • secretName
  • secretValue

Si vous choisissez de ne pas supprimer ces définitions, vous devez spécifier les valeurs de paramètre pendant le déploiement.

Configurer les stratégies d’accès au coffre de clés

Le script de déploiement ajoute un certificat au coffre de clés. Configurez les stratégies d’accès au coffre-fort de clés pour accorder les autorisations à l’identité gérée :

  1. Ajoutez un paramètre pour obtenir l’ID d’identité managée :

    "identityId": {
      "type": "string",
      "metadata": {
        "description": "Specifies the ID of the user-assigned managed identity."
      }
    },
    
  2. Ajoutez un paramètre pour configurer les stratégies d’accès au coffre de clés afin que l’identité managée puisse ajouter des certificats au coffre de clés :

    "certificatesPermissions": {
      "type": "array",
      "defaultValue": [
        "get",
        "list",
        "update",
        "create"
      ],
      "metadata": {
      "description": "Specifies the permissions to certificates in the vault. Valid values are: all, get, list, update, create, import, delete, recover, backup, restore, manage contacts, manage certificate authorities, get certificate authorities, list certificate authorities, set certificate authorities, delete certificate authorities."
      }
    }
    
  3. Mettez à jour les stratégies d’accès existantes du coffre de clés de la ressource Microsoft.KeyVault/vaults pour :

    "accessPolicies": [
      {
        "objectId": "[parameters('objectId')]",
        "tenantId": "[parameters('tenantId')]",
        "permissions": {
          "keys": "[parameters('keysPermissions')]",
          "secrets": "[parameters('secretsPermissions')]",
          "certificates": "[parameters('certificatesPermissions')]"
        }
      },
      {
        "objectId": "[reference(parameters('identityId'), '2018-11-30').principalId]",
        "tenantId": "[parameters('tenantId')]",
        "permissions": {
          "keys": "[parameters('keysPermissions')]",
          "secrets": "[parameters('secretsPermissions')]",
          "certificates": "[parameters('certificatesPermissions')]"
        }
      }
    ],
    

    Il existe deux stratégies définies, une pour l’utilisateur connecté et l’autre pour l’identité managée. L’utilisateur connecté a uniquement besoin de l’autorisation de liste pour vérifier le déploiement. Pour simplifier le didacticiel, le même certificat est affecté à l’identité managée et aux utilisateurs connectés.

Ajouter le script de déploiement

  1. Ajoutez trois paramètres utilisés par le script de déploiement :

    "certificateName": {
      "type": "string",
      "defaultValue": "DeploymentScripts2019"
    },
    "subjectName": {
      "type": "string",
      "defaultValue": "CN=contoso.com"
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    }
    
  2. Ajoutez une deploymentScripts ressource :

    Note

    Étant donné que les scripts de déploiement inline sont placés entre guillemets doubles, les chaînes à l’intérieur des scripts de déploiement doivent être placées entre guillemets simples à la place. Le caractère d’échappement PowerShell est l’accent grave (`).

    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2023-08-01",
      "name": "createAddCertificate",
      "location": "[resourceGroup().location]",
      "dependsOn": [
        "[resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))]"
      ],
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "[parameters('identityId')]": {
          }
        }
      },
      "kind": "AzurePowerShell",
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azPowerShellVersion": "3.0",
        "timeout": "PT30M",
        "arguments": "[format(' -vaultName {0} -certificateName {1} -subjectName {2}', parameters('keyVaultName'), parameters('certificateName'), parameters('subjectName'))]", // can pass an argument string, double quotes must be escaped
        "scriptContent": "
          param(
            [string] [Parameter(Mandatory=$true)] $vaultName,
            [string] [Parameter(Mandatory=$true)] $certificateName,
            [string] [Parameter(Mandatory=$true)] $subjectName
          )
    
          $ErrorActionPreference = 'Stop'
          $DeploymentScriptOutputs = @{}
    
          $existingCert = Get-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName
    
          if ($existingCert -and $existingCert.Certificate.Subject -eq $subjectName) {
    
            Write-Host 'Certificate $certificateName in vault $vaultName is already present.'
    
            $DeploymentScriptOutputs['certThumbprint'] = $existingCert.Thumbprint
            $existingCert | Out-String
          }
          else {
            $policy = New-AzKeyVaultCertificatePolicy -SubjectName $subjectName -IssuerName Self -ValidityInMonths 12 -Verbose
    
            # private key is added as a secret that can be retrieved in the Resource Manager template
            Add-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName -CertificatePolicy $policy -Verbose
    
            # it takes a few seconds for KeyVault to finish
            $tries = 0
            do {
              Write-Host 'Waiting for certificate creation completion...'
              Start-Sleep -Seconds 10
              $operation = Get-AzKeyVaultCertificateOperation -VaultName $vaultName -Name $certificateName
              $tries++
    
              if ($operation.Status -eq 'failed')
              {
                throw 'Creating certificate $certificateName in vault $vaultName failed with error $($operation.ErrorMessage)'
              }
    
              if ($tries -gt 120)
              {
                throw 'Timed out waiting for creation of certificate $certificateName in vault $vaultName'
              }
            } while ($operation.Status -ne 'completed')
    
            $newCert = Get-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName
            $DeploymentScriptOutputs['certThumbprint'] = $newCert.Thumbprint
            $newCert | Out-String
          }
        ",
        "cleanupPreference": "OnSuccess",
        "retentionInterval": "P1D"
      }
    }
    

    La deploymentScripts ressource dépend de la ressource key vault et de la ressource d’attribution de rôle. Il possède ces propriétés :

    • identity: le script de déploiement utilise une identité managée affectée par l’utilisateur pour effectuer les opérations dans le script.
    • kind: spécifiez le type de script. Actuellement, seuls les scripts PowerShell sont pris en charge.
    • forceUpdateTag: déterminez si le script de déploiement doit être exécuté même si la source du script n’a pas changé. Il peut s’agir de l’horodatage actuel ou d’un GUID. Pour plus d’informations, consultez Exécuter le script plusieurs fois.
    • azPowerShellVersion: spécifie la version du module Azure PowerShell à utiliser. Actuellement, le script de déploiement prend en charge la version 2.7.0, 2.8.0 et 3.0.0.
    • timeout: spécifiez la durée maximale d’exécution de script autorisée spécifiée au format ISO 8601. La valeur par défaut est P1D.
    • arguments: spécifiez les valeurs de paramètre. Les valeurs sont séparées par des espaces.
    • scriptContent: spécifiez le contenu du script. Pour exécuter un script externe, utilisez primaryScriptURI plutôt. Pour plus d’informations, consultez Utiliser un script externe. La déclaration $DeploymentScriptOutputs n’est requise que lors du test du script sur un ordinateur local. La déclaration de la variable permet l’exécution du script sur un ordinateur local et dans une deploymentScript ressource sans avoir à apporter de modifications. La valeur affectée à $DeploymentScriptOutputs est disponible en tant que sorties dans les déploiements. Pour plus d’informations, consultez Utiliser des sorties à partir de scripts de déploiement PowerShell ou Utiliser des sorties à partir de scripts de déploiement CLI.
    • cleanupPreference: spécifiez la préférence sur le moment où supprimer les ressources de script de déploiement. La valeur par défaut est Always, ce qui signifie que les ressources de script de déploiement sont supprimées malgré l’état du terminal (Réussite, Échec, Annulation). Dans ce tutoriel, OnSuccess est utilisé pour vous permettre d’afficher les résultats de l’exécution du script.
    • retentionInterval: spécifiez l’intervalle pour lequel le service conserve les ressources de script une fois qu’il atteint un état terminal. Les ressources sont supprimées à l’expiration de cette durée. La durée est basée sur le modèle ISO 8601. Ce tutoriel utilise P1D, ce qui signifie un jour. Cette propriété est utilisée lorsque cleanupPreference est réglée sur OnExpiration. Cette propriété n’est pas activée actuellement.

    Le script de déploiement prend trois paramètres : keyVaultName, certificateNameet subjectName. Il crée un certificat, puis ajoute le certificat au coffre de clés.

    $DeploymentScriptOutputs est utilisé pour stocker la valeur de sortie. Pour plus d’informations, consultez Utiliser des sorties à partir de scripts de déploiement PowerShell ou Utiliser des sorties à partir de scripts de déploiement CLI.

    Le modèle terminé est disponible ici.

  3. Pour afficher le processus de débogage, placez une erreur dans le code en ajoutant la ligne suivante au script de déploiement :

    Write-Output1 $keyVaultName
    

    La commande correcte est Write-Output au lieu de Write-Output1.

  4. Sélectionnez Fichier>Enregistrer pour enregistrer le fichier.

Déployer le modèle

  1. Se connecter à Azure Cloud Shell

  2. Choisissez votre environnement préféré en sélectionnant PowerShell ou Bash (pour CLI) dans le coin supérieur gauche. Il est nécessaire de redémarrer l’interpréteur de commandes lors d’un tel changement.

    Téléchargement de fichier vers Azure Cloud Shell via le portail

  3. Sélectionnez Charger/télécharger des fichiers, puis sélectionnez Charger. Consultez la capture d’écran précédente. Sélectionnez le fichier que vous avez enregistré dans la section précédente. Après avoir chargé le fichier, vous pouvez utiliser la ls commande et la cat commande pour vérifier que le fichier a été chargé avec succès.

  4. Exécutez le script Azure CLI ou Azure PowerShell suivant pour déployer le modèle.

    echo "Enter a project name that is used to generate resource names:" &&
    read projectName &&
    echo "Enter the location (i.e. centralus):" &&
    read location &&
    echo "Enter your email address used to sign in to Azure:" &&
    read upn &&
    echo "Enter the user-assigned managed identity ID:" &&
    read identityId &&
    adUserId=$((az ad user show --id ${upn}) | jq -r '.id') &&
    resourceGroupName="${projectName}rg" &&
    keyVaultName="${projectName}kv" &&
    az group create --name $resourceGroupName --location $location &&
    az deployment group create --resource-group $resourceGroupName --template-file "$HOME/azuredeploy.json" --parameters identityId=$identityId keyVaultName=$keyVaultName objectId=$adUserId
    

    Le service de script de déploiement doit créer des ressources de script de déploiement supplémentaires pour l’exécution de script. La préparation et le processus de nettoyage peuvent prendre jusqu’à une minute pour se terminer en plus du temps d’exécution du script réel.

    Le déploiement a échoué, car la commande Write-Output1 non valide est utilisée dans le script. Vous obtiendrez une erreur indiquant :

    The term 'Write-Output1' is not recognized as the name of a cmdlet, function, script file, or operable
    program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
    

    Le résultat d’exécution du script de déploiement est stocké dans les ressources de script de déploiement à des fins de résolution des problèmes.

Déboguer le script ayant échoué

  1. Connectez-vous au portail Azure.

  2. Ouvrez le groupe de ressources. Il s’agit du nom du projet avec rg ajouté. Vous verrez deux ressources supplémentaires dans le groupe de ressources. Ces ressources sont appelées ressources de script de déploiement.

    Ressources de script de déploiement du modèle de gestion des ressources

    Les deux fichiers ont le suffixe azscripts . L’un est un compte de stockage et l’autre est une instance de conteneur.

    Sélectionnez Afficher les types masqués pour répertorier la deploymentScripts ressource.

  3. Sélectionnez le compte de stockage avec le suffixe azscripts .

  4. Sélectionnez la vignette Partages de fichiers . Vous verrez un dossier azscripts qui contient les fichiers d’exécution du script de déploiement.

  5. Sélectionnez azscripts. Vous verrez deux dossiers azscriptinput et azscriptoutput. Le dossier d’entrée contient un fichier de script PowerShell système et les fichiers de script de déploiement utilisateur. Le dossier de sortie contient un executionresult.json et le fichier de sortie de script. Vous pouvez voir le message d’erreur dans executionresult.json. Le fichier de sortie n’est pas là, car l’exécution a échoué.

Supprimez la Write-Output1 ligne et redéployez le modèle.

Lorsque le deuxième déploiement s’exécute correctement, les ressources de script de déploiement sont supprimées par le service de script, car la cleanupPreference propriété est définie sur OnSuccess.

Nettoyer les ressources

Lorsque les ressources Azure ne sont plus nécessaires, nettoyez les ressources que vous avez déployées en supprimant le groupe de ressources.

  1. Dans le portail Azure, sélectionnez Groupe de ressources dans le menu de gauche.
  2. Entrez le nom du groupe de ressources dans le champ Filtrer par nom .
  3. Sélectionnez le nom du groupe de ressources.
  4. Sélectionnez Supprimer le groupe de ressources dans le menu supérieur.

Étapes suivantes

Dans ce tutoriel, vous avez appris à utiliser un script de déploiement dans des modèles ARM. Pour savoir comment déployer des ressources Azure en fonction des conditions, consultez :