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
- Demander une route
- 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.
Utilisez l’environnement Bash dans Azure Cloud Shell. Pour plus d’informations, consultez Démarrage rapide pour Bash dans Azure Cloud Shell.
Si vous préférez exécuter les commandes de référence de l’interface de ligne de commande localement, installez l’interface Azure CLI. Si vous exécutez sur Windows ou macOS, envisagez d’exécuter Azure CLI dans un conteneur Docker. Pour plus d’informations, consultez Guide pratique pour exécuter Azure CLI dans un conteneur Docker.
Si vous utilisez une installation locale, connectez-vous à Azure CLI à l’aide de la commande az login. Pour finir le processus d’authentification, suivez les étapes affichées dans votre terminal. Pour connaître les autres options de connexion, consultez Se connecter avec Azure CLI.
Lorsque vous y êtes invité, installez l’extension Azure CLI lors de la première utilisation. Pour plus d’informations sur les extensions, consultez Utiliser des extensions avec Azure CLI.
Exécutez az version pour rechercher la version et les bibliothèques dépendantes installées. Pour effectuer une mise à niveau vers la dernière version, exécutez az upgrade.
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.
(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"
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
Installez l’extension Application Insights pour Azure CLI.
az extension add -n application-insights
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
Copiez le résultat de la sortie, vous aurez besoin de cette valeur en tant que votre
instrumentationKey
ultérieurement.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).
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
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
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
Patientez, ce processus peut prendre quelques minutes.
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.
Le processus a créé des clés SSH et les a placées dans un emplacement indiqué dans la réponse.
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
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
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.
L’application web de la machine virtuelle retourne les informations suivantes :
- nom de la machine virtuelle
- Votre ID client
- Date/Heure actuelle
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
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.
Si vous êtes invité à confirmer que vous voulez vous connecter, répondez
y
ouyes
pour continuer.Utilisez la commande suivante pour savoir où vous êtes sur la machine virtuelle. Vous devez être à la racine d’azureuser :
/home/azureuser
.pwd
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:
Votre application web se trouve dans le sous-répertoire
myapp
. Passez au répertoiremyapp
et listez son contenu :cd myapp && ls -l
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
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
Attendez que la commande se termine avant de continuer.
Ajouter une clé d’instrumentation de supervision
Dans le terminal SSH connecté à votre machine virtuelle, utilisez l’éditeur Nano pour ouvrir le fichier
package.json
.sudo nano package.json
Ajoutez une variable d’environnement
APPINSIGHTS_INSTRUMENTATIONKEY
au début de votre script Démarrage. Dans l’exemple suivant, remplacezREPLACE-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"
Toujours dans le terminal SSH, enregistrez le fichier dans l’éditeur Nano avec contrôle + X.
Si vous y êtes invité dans l’éditeur Nano, entrez Y pour enregistrer.
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.
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
Remplacez le
index.js
d'origine par le fichier avec Application Insights.sudo npm run-script appinsights
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()}`) })
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
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 |
- 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
- 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 |
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
Le journal contient l’appel depuis votre ordinateur local.
grep "Hello world app listening on port 3000!" /var/log/pm2.log
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 . |