Partager via


Créer une machine virtuelle Express.js en utilisant Azure CLI

Dans ce tutoriel, créez une machine virtuelle Linux pour une application Express.js. La machine virtuelle est configurée avec un fichier de configuration cloud-init, et elle inclut NGINX et un dépôt GitHub pour une application Express.js. Connectez-vous à la machine virtuelle avec SSH, modifiez l’application web pour y inclure la journalisation du suivi et consultez l’application serveur Express.js publique dans un navigateur web.

Ce didacticiel comprend les tâches suivantes :

  • Se connecter à Azure avec Azure CLI
  • Créer une ressource de machine virtuelle Linux Azure avec Azure CLI
    • Ouvrir le port 80 public
    • Installer une application web Express.js de démonstration à partir d’un dépôt GitHub
    • Installer les dépendances de l’application web
    • Démarrer l’application web
  • Créer une ressource de supervision Azure avec Azure CLI
    • Se connecter à la machine virtuelle avec SSH
    • Installer la bibliothèque de client du SDK Azure avec npm
    • Ajouter le code de la bibliothèque de client Application Insights pour créer un suivi personnalisé
  • Afficher l’application web dans le navigateur
    • Demander une route /trace pour générer un suivi personnalisé dans le journal Application Insights
    • Afficher le nombre de traces collectées dans le journal avec Azure CLI
    • Afficher la liste des traces avec le portail Azure
  • Supprimer les ressources avec Azure CLI

Prérequis

  • Un compte d’utilisateur et un abonnement Azure : créez un abonnement gratuit.
  • SSH pour vous connecter à la machine virtuelle : utilisez Azure Cloud Shell ou un terminal moderne tel qu'un interpréteur de commandes Bash, qui inclut SSH.

1. Créer une ressource Application Insights pour les pages web

Créez un groupe de ressources Azure pour toutes vos ressources Azure et une ressource Monitor pour collecter les fichiers journaux de votre application web dans le cloud Azure. La création d’un groupe de ressources vous permet de localiser facilement les ressources et de les supprimer quand vous avez terminé. Azure Monitor est le nom du service Azure, tandis qu’Application Insights est le nom de la bibliothèque de client utilisée par le tutoriel.

  1. (Facultatif) Si vous avez plusieurs abonnements, utilisez az account set pour définir l’abonnement par défaut avant d’effectuer les commandes restantes.

    az account set \
        --subscription "ACCOUNT NAME OR ID" 
    
  2. Créez un groupe de ressources Azure avec la commande az group create. Utilisez le nom rg-demo-vm-eastus :

    az group create \
        --location eastus \
        --name rg-demo-vm-eastus 
    

Créer une ressource Azure Monitor avec Azure CLI

  1. Installez l’extension Application Insights pour Azure CLI.

    az extension add -n application-insights
    
  2. Utilisez la commande suivante pour créer une ressource de surveillance, avec az monitor app-insights component create :

    az monitor app-insights component create \
      --app demoWebAppMonitor \
      --location eastus \
      --resource-group rg-demo-vm-eastus \
      --query instrumentationKey --output table
    
  3. Copiez le résultat de la sortie, vous aurez besoin de cette valeur en tant que votre instrumentationKey ultérieurement.

  4. Laissez le terminal ouvert, vous allez l’utiliser à l’étape suivante.

2. Créer une machine virtuelle Linux en utilisant Azure CLI

Utilise un fichier de configuration cloud-init pour créer à la fois le serveur proxy inverse NGINX et le serveur Express.js. NGINX est utilisé pour transférer le port Express.js (3000) vers le port public (80).

  1. Créez un fichier local nommé cloud-init-github.txt et enregistrez le contenu suivant dans le fichier. Vous pouvez aussi enregistrer le fichier du dépôt sur votre ordinateur local. Le fichier au format cloud-init doit se trouver dans le même dossier que le chemin du terminal pour vos commandes Azure CLI.

    #cloud-config
    package_upgrade: true
    packages:
      - nginx
    write_files:
      - owner: www-data:www-data
        path: /etc/nginx/sites-available/default
        content: |
          server {
            listen 80 default_server;
            server_name _;
            location / {
              # First, try if the file exists locally, otherwise request it from the app
              try_files $uri @app;
            }
            location @app {
              proxy_pass http://localhost:3000;
              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection 'upgrade';
              proxy_set_header X-Forwarded-For $remote_addr;
              proxy_set_header Host $host;
              proxy_cache_bypass $http_upgrade;
            }
          }
    runcmd:
      # install Node.js
      - 'curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -'
      - 'sudo apt-get install -y nodejs'
      # clone GitHub Repo into myapp directory
      - 'cd /home/azureuser'
      - git clone "https://github.com/Azure-Samples/js-e2e-vm" myapp
      # Start app
      - 'cd myapp && npm install && npm start'
      # restart NGINX
      - systemctl restart nginx
    
  2. Passez en revue la section runcmd du fichier pour comprendre son fonctionnement.

    runcmd a plusieurs tâches :

    • Télécharger Node.js et l’installer
    • Cloner l’exemple de dépôt Express.js à partir de GitHub dans le répertoire myapp
    • Installer les dépendances de l’application
    • Démarrer l’application Express.js avec PM2

Créer une ressource de machine virtuelle

  1. Entrez la commande Azure CLI, az vm create, sur un terminal pour créer une ressource Azure de machine virtuelle Linux. La commande crée la machine virtuelle à partir du fichier cloud-init et génère les clés SSH pour vous. La commande en cours d’exécution affiche l’emplacement de stockage des clés.

    az vm create \
      --resource-group rg-demo-vm-eastus \
      --name demo-vm \
      --location eastus \
      --public-ip-sku Standard \
      --image UbuntuLTS \
      --admin-username azureuser \
      --generate-ssh-keys \
      --custom-data cloud-init-github.txt
    
  2. Patientez, ce processus peut prendre quelques minutes.

  3. Gardez la valeur de publicIpAddress dans la réponse, vous en aurez besoin pour visualiser l’application web dans un navigateur et pour vous connecter à la machine virtuelle. Si vous perdez cette adresse IP, utilisez la commande Azure CLI, az vm list-ip-addresses, pour la récupérer à nouveau.

  4. Le processus a créé des clés SSH et les a placées dans un emplacement indiqué dans la réponse.

  5. Accédez à cet emplacement et créez le fichier authorized_keys :

    cd <SSH-KEY-LOCATION> && cat id_rsa >> authorized_keys
    

Ouvrir un port pour la machine virtuelle

Lors de la création initiale, la machine virtuelle n’a aucun port ouvert. Ouvrez le port 80 avec la commande Azure CLI suivante, az vm open-port, pour que l’application web soit disponible publiquement :

az vm open-port \
  --port 80 \
  --resource-group rg-demo-vm-eastus \
  --name demo-vm

Accéder au site web

  1. Utilisez l’adresse IP publique dans un navigateur web pour vérifier que la machine virtuelle est disponible et en cours d’exécution. Modifiez l’URL de façon à utiliser la valeur de publicIpAddress.

    http://YOUR-VM-PUBLIC-IP-ADDRESS
    
  2. Si la ressource échoue avec une erreur de passerelle, réessayez au bout d’une minute ; le démarrage de l’application web peut prendre une minute.

  3. L’application web de la machine virtuelle retourne les informations suivantes :

    • nom de la machine virtuelle
    • Votre ID client
    • Date/Heure actuelle

    Capture d’écran du navigateur web montrant une application simple servie à partir d’une machine virtuelle Linux sur Azure.

  4. Le fichier de code initial pour l’application web a une seule route, qui est passée par le proxy NGINX.

    const os = require('os');
    const express = require('express')
    const app = express()
    
    app.use('/public', express.static('public'))
    app.get('/', function (req, res) {
    
        const clientIP = req.headers['x-forwarded-for'];
        const msg = `HostName: ${os.hostname()}<br>ClientIP: ${clientIP}<br>DateTime: ${new Date()}<br><img width='200' height='200' src='/public/leaves.jpg' alt='flowers'>`
        console.log(msg)
    
        res.send(msg)
    })
    app.listen(3000, function () {
        console.log(`Hello world app listening on port 3000! ${Date.now()}`)
    })
    

3. Se connecter à une machine virtuelle Linux en utilisant SSH

Dans cette section du tutoriel, utilisez SSH dans un terminal pour vous connecter à votre machine virtuelle. SSH est un outil répandu fourni avec de nombreux shells modernes, notamment Azure Cloud Shell.

Se connecter avec SSH et modifier l’application web

  1. Connectez-vous à votre machine virtuelle distante avec la commande suivante.

    Remplacez YOUR-VM-PUBLIC-IP par l’IP publique de votre propre machine virtuelle.

    ssh azureuser@YOUR-VM-PUBLIC-IP
    

    Ce processus suppose que votre client SSH peut trouver vos clés SSH, créées dans le cadre de la création de votre machine virtuelle et placées sur votre machine locale.

  2. Si vous êtes invité à confirmer que vous voulez vous connecter, répondez y ou yes pour continuer.

  3. Utilisez la commande suivante pour savoir où vous êtes sur la machine virtuelle. Vous devez être à la racine d’azureuser : /home/azureuser.

    pwd
    
  4. Une fois la connexion établie, l’invite du terminal doit changer et indiquer le nom d’utilisateur et le nom de ressource de la machine virtuelle distante.

    azureuser@demo-vm:
    
  5. Votre application web se trouve dans le sous-répertoire myapp. Passez au répertoire myapp et listez son contenu :

    cd myapp && ls -l
    
  6. Vous devez voir des contenus représentant le dépôt GitHub cloné dans la machine virtuelle et les fichiers du package npm :

    -rw-r--r--   1 root root   891 Nov 11 20:23 cloud-init-github.txt
    -rw-r--r--   1 root root  1347 Nov 11 20:23 index-logging.js
    -rw-r--r--   1 root root   282 Nov 11 20:23 index.js
    drwxr-xr-x 190 root root  4096 Nov 11 20:23 node_modules
    -rw-r--r--   1 root root 84115 Nov 11 20:23 package-lock.json
    -rw-r--r--   1 root root   329 Nov 11 20:23 package.json
    -rw-r--r--   1 root root   697 Nov 11 20:23 readme.md
    

Installer le SDK de supervision

  1. Dans le terminal SSH connecté à votre machine virtuelle, installez la bibliothèque de client du kit SDK Azure pour Application Insights.

    sudo npm install --save applicationinsights
    
  2. Attendez que la commande se termine avant de continuer.

Ajouter une clé d’instrumentation de supervision

  1. Dans le terminal SSH connecté à votre machine virtuelle, utilisez l’éditeur Nano pour ouvrir le fichier package.json.

    sudo nano package.json
    
  2. Ajoutez une variable d’environnement APPINSIGHTS_INSTRUMENTATIONKEY au début de votre script Démarrage. Dans l’exemple suivant, remplacez REPLACE-WITH-YOUR-KEY par la valeur de votre clé d’instrumentation.

    "start": "APPINSIGHTS_INSTRUMENTATIONKEY=REPLACE-WITH-YOUR-KEY pm2 start index.js --watch --log /var/log/pm2.log"
    
  3. Toujours dans le terminal SSH, enregistrez le fichier dans l’éditeur Nano avec contrôle + X.

  4. Si vous y êtes invité dans l’éditeur Nano, entrez Y pour enregistrer.

  5. Si vous y êtes invité dans l’éditeur Nano, acceptez le nom de fichier.

Arrêter la machine virtuelle pour modifier l’application

La bibliothèque de client Azure se trouve à présent dans votre répertoire node_modules et la clé est passée à l’application en tant que variable d’environnement. L’étape suivante utilise Application Insights par programmation.

  1. Arrêtez PM2, qui est un gestionnaire de processus de mise en production des applications Node.js, avec les commandes suivantes :

    sudo npm run-script stop 
    
  2. Remplacez le index.js d'origine par le fichier avec Application Insights.

    sudo npm run-script appinsights
    
  3. La bibliothèque de client et le code de journalisation sont fournis pour vous.

    const express = require('express')
    const app = express()
    const os = require('os');
    
    console.log(JSON.stringify(process.env));
    
    const AppInsights = require('applicationinsights');
    
    if (process.env.APPINSIGHTS_INSTRUMENTATIONKEY) {
        console.log(`AppInsights configured with key ${process.env.APPINSIGHTS_INSTRUMENTATIONKEY}`);
    } else{
        console.log(`AppInsights not configured`);
    }
    
    AppInsights.setup(process.env.APPINSIGHTS_INSTRUMENTATIONKEY)
        .setAutoDependencyCorrelation(true)
        .setAutoCollectRequests(true)
        .setAutoCollectPerformance(true, true)
        .setAutoCollectExceptions(true)
        .setAutoCollectDependencies(true)
        .setAutoCollectConsole(true)
        .setUseDiskRetryCaching(true)
        .setSendLiveMetrics(false)
        .setDistributedTracingMode(AppInsights.DistributedTracingModes.AI)
        .start();
    
    const AppInsightsClient = AppInsights.defaultClient;
    
    
    app.get('/trace', (req, res) => {
    
        const clientIP = req.headers['x-forwarded-for'];
        const msg = `trace route ${os.hostname()} ${clientIP} ${new Date()}`;
    
        console.log(msg)
    
        if (process.env.APPINSIGHTS_INSTRUMENTATIONKEY) {
            AppInsightsClient.trackPageView();
            AppInsightsClient.trackTrace({ message: msg })
            AppInsightsClient.flush();
        } else {
            msg += ' AppInsights not configured';
        }
    
        res.send(`${msg}`)
    })
    
    app.get('/', function (req, res) {
    
        const clientIP = req.headers['x-forwarded-for'];
        const msg = `root route ${os.hostname()} ${clientIP} ${new Date()}`
    
        console.log(msg)
    
        res.send(msg)
    
    })
    app.listen(3000, function () {
        console.log(`Hello world app listening on port 3000! ${os.hostname()}`)
    })
    
  4. Redémarrez l’application avec PM2 pour récupérer la variable d’environnement suivante.

    sudo npm start
    

Utilisez l’application pour vérifier la journalisation

  1. Dans un navigateur web, testez l’application avec la nouvelle route trace :

    http://YOUR-VM-PUBLIC-IP-ADDRESS/trace
    

    Le navigateur affiche la réponse trace route demo-vm YOUR-CLIENT-IP VM-DATE-TIME avec votre adresse IP.

Affichage du journal pour NGINX

La machine virtuelle collecte les journaux d'activité pour NGINX, ceux-ci peuvent être consultés.

Service Emplacement du journal
NGINX /var/log/nginx/access.log
  1. Toujours dans le terminal SSH, affichez le journal de machine virtuelle pour le service de proxy NGINX avec la commande suivante pour voir le journal :
cat /var/log/nginx/access.log
  1. Le journal contient l’appel depuis votre ordinateur local.
"GET /trace HTTP/1.1" 200 10 "-"

Affichage du journal pour PM2

La machine virtuelle collecte les journaux d'activité pour PM2, ceux-ci peuvent être consultés.

Service Emplacement du journal
PM2 /var/log/pm2.log
  1. Affichez le journal de machine virtuelle pour le service PM2, qui est votre application web Express.js Node. Dans le shell Bash, utilisez la commande suivante pour visualiser le journal :

    cat /var/log/pm2.log
    
  2. Le journal contient l’appel depuis votre ordinateur local.

    grep "Hello world app listening on port 3000!" /var/log/pm2.log
    
  3. Le journal comprend aussi vos variables d’environnement, notamment votre clé ApplicationInsights, passées dans le script de démarrage npm. Utilisez la commande grep suivante pour vérifier que votre clé se trouve dans les variables d’environnement.

    grep APPINSIGHTS_INSTRUMENTATIONKEY /var/log/pm2.log
    

    Cette action affiche votre journal PM2 avec APPINSIGHTS_INSTRUMENTATIONKEY mis en évidence avec une couleur différente.

Journalisation des machines virtuelles et journalisation cloud

Dans cette application, l’utilisation de console.log écrit les messages dans les journaux PM2 trouvés sur la machine virtuelle uniquement. Si vous supprimez les journaux ou la machine virtuelle, vous perdez ces informations.

Si vous souhaitez conserver les journaux au-delà de la durée de vie de votre machine virtuelle, utilisez Application Insights.

5. Nettoyer les ressources

Une fois que vous avez terminé ce tutoriel, supprimez le groupe de ressources qui comprend toutes ses ressources pour ne pas être facturé pour des utilisations supplémentaires.

Dans le même terminal, utilisez la commande Azure CLI, az group delete, pour supprimer le groupe de ressources :

az group delete --name rg-demo-vm-eastus -y

Cette commande prend quelques minutes.

Dépannage

Si vous rencontrez des problèmes, utilisez le tableau suivant pour comprendre comment les résoudre :

Problème Résolution
Erreur de passerelle 502 Cela peut indiquer que votre fichier index.js ou package.js contient une erreur. Pour plus d’informations, consultez vos journaux PM2 sur /var/log/pm2.log. L’erreur la plus récente se trouve au bas du fichier. Si vous êtes sûr que ces fichiers sont corrects, arrêtez et démarrez PM2 à l’aide des scripts npm dans package.json.

Exemple de code

Étapes suivantes