Tutoriel : Déployer une application Java sur un groupe de machines virtuelles identiques

Azure DevOps Services

Un groupe de machines virtuelles identiques vous permet de déployer et de gérer des machines virtuelles identiques et de mise à l’échelle automatique.

Les machines virtuelles sont créées si nécessaire dans un groupe identique. Vous définissez des règles pour contrôler comment et quand des machines virtuelles sont ajoutées ou supprimées du groupe identique. Ces règles peuvent être déclenchées en fonction de métriques telles que la charge processeur, l’utilisation de la mémoire ou le trafic réseau.

Dans ce tutoriel, vous créez une application Java et la déployez sur un groupe de machines virtuelles identiques. Vous apprenez à :

  • Créer un ensemble échelonnable de machines virtuelles
  • Générer une image d’ordinateur
  • Déployer une image personnalisée sur un groupe de machines virtuelles identiques

Conditions préalables

Avant de commencer, vous avez besoin des éléments suivants :

Configurer votre pipeline Java

  1. Dans votre projet Azure DevOps, sélectionnez Pipelines dans le menu de navigation de gauche.

  2. Sélectionnez Nouveau pipeline ou Créer un pipeline si ce pipeline est le premier dans le projet.

  3. Dans l’écran Où se trouve votre code , sélectionnez GitHub.

  4. Vous serez peut-être redirigé vers GitHub pour vous connecter. Si c’est le cas, entrez vos informations d’identification GitHub.

  5. Dans l’écran Sélectionner un référentiel , sélectionnez le référentiel dans lequel se trouve votre application .NET.

  6. Vous serez peut-être redirigé vers GitHub pour pouvoir installer l’application Azure Pipelines. Si c’est le cas, sélectionnez Approuver et installer.

Lorsque l’onglet Configurer s’affiche, sélectionnez Maven.

Personnaliser le pipeline

  1. Quand votre nouveau pipeline s’affiche, examinez le code YAML pour voir ce qu’il fait. Lorsque vous êtes prêt, sélectionnez Enregistrer et exécuter.

    Bouton Enregistrer et exécuter dans un nouveau pipeline YAML

  2. Vous êtes invité à valider un nouveau fichier azure-pipelines.yml dans votre référentiel. Dès que le message vous convient, sélectionnez à nouveau Enregistrer et exécuter.

    Si vous souhaitez voir votre pipeline en action, sélectionnez le travail de build.

    Vous venez de créer et d’exécuter un pipeline créé automatiquement pour vous, car votre code semblait correspondre au modèle Maven.

    Votre référentiel comprend maintenant un pipeline YAML (azure-pipelines.yml) opérationnel et prêt à être personnalisé !

  3. Dès que vous souhaitez commencer à apporter des modifications à votre pipeline, sélectionnez-le sur la page Pipelines, puis sélectionnez Modifier pour modifier le fichier azure-pipelines.yml.

Ajouter les tâches Copier des fichiers et publier des artefacts de build

  1. Mettez à jour votre pipeline pour inclure la CopyFiles@2 tâche. Cela crée un artefact que vous pouvez déployer sur votre groupe de machines virtuelles identiques.

      trigger: none
    
      pool:
        vmImage: 'ubuntu-latest'
    
      steps:
    - task: Maven@4
      inputs:
        mavenPomFile: 'pom.xml'
        mavenOptions: '-Xmx3072m'
        javaHomeOption: 'JDKVersion'
        jdkVersionOption: '1.8'
        jdkArchitectureOption: 'x64'
        publishJUnitResults: true
        testResultsFiles: '**/surefire-reports/TEST-*.xml'
        goals: 'package'
    
    - task: CopyFiles@2
      displayName: 'Copy File to: $(TargetFolder)'
      inputs:
        SourceFolder: '$(Build.SourcesDirectory)'
        Contents: |
          **/*.sh 
          **/*.war
          **/*jar-with-dependencies.jar
        TargetFolder: '$(System.DefaultWorkingDirectory)/pipeline-artifacts/'
        flattenFolders: true  
    

Créer une image personnalisée et la charger dans Azure

Vous aurez besoin d’un groupe de ressources, d’un compte de stockage et d’une galerie d’images partagées pour votre image personnalisée.

  1. Créez un groupe de ressources avec la commande az group create. Cet exemple crée un groupe de ressources nommé myVMSSResourceGroup à l’emplacement eastus2 :

    az group create --name myVMSSResourceGroup --location eastus2
    
  2. Créez un compte de stockage. Cet exemple crée un compte de stockage. vmssstorageaccount

    az storage account create \
      --name vmssstorageaccount \
      --resource-group myVMSSResourceGroup \
      --location eastus2 \
      --sku Standard_LRS 
    
  3. Créez une galerie d’images partagées.

    az sig create --resource-group myVMSSResourceGroup --gallery-name myVMSSGallery
    
  4. Créez une galerie d’images dans la myVMSSGallery ressource. Consultez Créer une galerie d’images partagées Azure à l’aide du portail pour en savoir plus sur l’utilisation des galeries d’images.

    az sig create --resource-group myVMSSResourceGroup --gallery-name myVMSSGallery
    
  5. Créez une définition d’image. Copiez la id nouvelle image qui ressemble /subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/galleries/myVMSSGallery/images/MyImageà .

    az sig image-definition create -g myVMSSResourceGroup --gallery-name myVMSSGallery --gallery-image-definition MyImage --publisher GreatPublisher --offer GreatOffer --sku GreatSku --os-type linux
    

Créer une identité managée

  1. Créez une identité managée dans votre groupe de ressources.

    az identity create -g myVMSSResourceGroup -n myVMSSIdentity
    
  2. À partir de la sortie, copiez le id. Le id sera semblable /subscriptions/<SUBSCRIPTION ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>à .

  3. Attribuez à l’identité managée les autorisations minimales requises pour la création et le déploiement d’images. Au lieu d’utiliser le rôle Contributeur large, attribuez ces rôles spécifiques :

    • Rôle de création d’images du service Azure Image Builder - Obligatoire pour le Générateur d’images pour créer et distribuer des images
    • Contributeur de compte de stockage - Limité au compte de stockage spécifique utilisé pour les artefacts de build
    • Contributeur de la galerie d’images partagées - Limité à la galerie spécifique

    Pour attribuer ces rôles à l’aide d’Azure CLI :

    # Assign Image Builder Service Image Creation Role (built-in role)
    az role assignment create --assignee-object-id <MANAGED_IDENTITY_OBJECT_ID> \
      --role "Azure Image Builder Service Image Creation Role" \
      --scope /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/myVMSSResourceGroup
    
    # Assign Storage Account Contributor to the specific storage account
    az role assignment create --assignee-object-id <MANAGED_IDENTITY_OBJECT_ID> \
      --role "Storage Account Contributor" \
      --scope /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/myVMSSResourceGroup/providers/Microsoft.Storage/storageAccounts/vmssstorageaccount
    
    # Assign Shared Image Gallery Contributor to the specific gallery
    az role assignment create --assignee-object-id <MANAGED_IDENTITY_OBJECT_ID> \
      --role "Shared Image Gallery Contributor" \
      --scope /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/myVMSSResourceGroup/providers/Microsoft.Compute/galleries/myVMSSGallery
    

    Pour obtenir l’ID d’objet de votre identité managée :

    az identity show -g myVMSSResourceGroup -n myVMSSIdentity --query principalId -o tsv
    

Créer l’image personnalisée

Pour créer une image personnalisée, vous pouvez utiliser la tâche DevOps du Générateur d’images de machine virtuelle Azure.

Avertissement

Sécurité de la chaîne d’approvisionnement : le script inline s’exécute avec des privilèges élevés (sudo). Suivez ces meilleures pratiques :

  • Vérifiez l’intégrité des artefacts avant l’exécution. Utilisez des sommes de contrôle ou des signatures numériques pour confirmer que les artéfacts de construction n’ont pas été falsifiés.
  • Passez en revue le script d’installation avant de valider le dépôt. Assurez-vous qu’elle effectue uniquement les opérations nécessaires.
  • Réduisez l’utilisation de sudo aux opérations qui nécessitent des privilèges élevés.
  • Évitez de télécharger et d’exécuter des scripts à partir de sources externes sans vérification d’intégrité.
  1. Avant d’ajouter la tâche du générateur d’images, créez une version de contrôle de votre script d’installation. Ajoutez-le à votre référentiel :

    # Generate SHA256 checksum for your install.sh script
    sha256sum install.sh > install.sh.sha256
    

    Validez à la fois install.sh et install.sh.sha256 dans votre référentiel.

  2. Ajoutez AzureImageBuilderTask@1 tâche à votre fichier YAML avec vérification d'intégrité. Remplacez les valeurs de <SUBSCRIPTION ID>, <RESOURCE GROUP>, <USER ASSIGNED IDENTITY NAME> par vos propres valeurs.

    - task: AzureImageBuilderTask@1
      displayName: 'Azure VM Image Builder Task'
      inputs:
        managedIdentity: '/subscriptions/<SUBSCRIPTION ID>/resourcegroups/<RESOURCE GROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<USER ASSIGNED IDENTITY NAME>'
        imageSource: 'marketplace'
        packagePath: '$(System.DefaultWorkingDirectory)/pipeline-artifacts'
        inlineScript: |
          set -e  # Exit on error
    
          # Verify artifact integrity
          echo "Verifying artifact integrity..."
          cd /tmp
          tar -zxvf pipeline-artifacts.tar.gz
    
          # Verify install.sh checksum
          if [ -f install.sh.sha256 ]; then
            sha256sum -c install.sh.sha256
            if [ $? -ne 0 ]; then
              echo "ERROR: install.sh checksum verification failed. Aborting."
              exit 1
            fi
          else
            echo "WARNING: Checksum file not found. Skipping integrity verification."
          fi
    
          # Create build artifacts directory and copy verified artifacts
          sudo mkdir -p /lib/buildArtifacts
          sudo cp install.sh /lib/buildArtifacts/.
    
          # Execute with minimal sudo - only the install script, not general commands
          sudo /lib/buildArtifacts/install.sh
        storageAccountName: 'vmssstorageaccount'
        distributeType: 'sig'
        galleryImageId: '/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Compute/galleries/myVMSSGallery/images/MyImage/versions/0.0.$(Build.BuildId)'
        replicationRegions: 'eastus2'
        ibSubscription: '<SUBSCRIPTION ID>'
        ibAzureResourceGroup: 'myVMSSResourceGroup'
        ibLocation: 'eastus2'
    
  3. Vérifiez que votre install.sh script suit ces pratiques de sécurité :

    #!/bin/bash
    set -e  # Exit on any error
    set -o pipefail  # Exit if any command in pipeline fails
    
    # Only run operations necessary for application setup
    # Avoid unnecessary sudo where possible
    
    echo "Installing application dependencies..."
    # Add your installation commands here
    
  4. Exécutez le pipeline pour générer votre première image. Vous devrez peut-être autoriser les ressources pendant l’exécution du pipeline.

  5. Accédez à la nouvelle image dans le portail Azure et ouvrez Vue d’ensemble. Sélectionnez Créer VMSS pour créer un groupe de machines virtuelles identiques à partir de la nouvelle image. Définissez le nom du groupe de machines virtuelles identiques sur vmssScaleSet. Consultez Créer un groupe de machines virtuelles identiques dans le portail Azure pour en savoir plus sur la création de groupes de machines virtuelles identiques dans le portail Azure.

Déployer des mises à jour sur le groupe de machines virtuelles identiques

Ajoutez une tâche Azure CLI à votre pipeline pour déployer des mises à jour sur le groupe identique. Ajoutez la tâche à la fin du pipeline. Remplacez <SUBSCRIPTION ID> par votre ID d’abonnement.

- task: AzureCLI@2
  inputs:
    azureSubscription: '`YOUR_SUBSCRIPTION_ID`' #Authorize and in the task editor
    ScriptType: 'pscore'
    scriptLocation: 'inlineScript'
    Inline: 'az vmss update --resource-group myVMSSResourceGroup --name vmssScaleSet --set virtualMachineProfile.storageProfile.imageReference.id=/subscriptions/<SUBSCRIPTION ID>/resourceGroups/myVMSSResourceGroup/providers/Microsoft.Compute/galleries/myVMSSGallery/images/MyImage/versions/0.0.$(Build.BuildId)'

Nettoyer les ressources

Accédez au portail Azure et supprimez votre groupe de ressources. myVMSSResourceGroup

Étapes suivantes