Erstellen eines virtuellen Express.js-Computer mit der Azure CLI

In diesem Tutorial wird ein virtueller Linux-Computer (virtual machine, VM) für eine Express.js-App erstellt. Der virtuelle Computer wird mit einer cloud-init-Konfigurationsdatei konfiguriert und enthält NGINX sowie ein GitHub-Repository für eine Express.js-App. Verbinden auf den virtuellen Computer mit SSH, ändern Sie die Web-App so, dass sie die Ablaufverfolgungsprotokollierung einbezieht, und zeigen Sie die öffentliche Express.js-Server-App in einem Webbrowser an.

Dieses Lernprogramm enthält die folgenden Aufgaben:

  • Anmelden bei Azure mit der Azure CLI
  • Erstellen einer Azure Linux-VM-Ressource mit Azure CLI
    • Öffnen des öffentlichen Ports 80
    • Installieren der Express.js-Demo-Web-App aus einem GitHub-Repository
    • Installieren von Web-App-Abhängigkeiten
    • Starten der Web-App
  • Erstellen einer Azure Monitoring-Ressource mit Azure CLI
    • Herstellen einer SSH-Verbindung mit dem virtuellen Computer
    • Installieren der Azure SDK-Clientbibliothek mit npm
    • Hinzufügen von Application Insights-Clientbibliothekscode zum Erstellen einer benutzerdefinierten Ablaufverfolgung
  • Anzeigen von Web-App über den Browser
    • Anfordern der Route /trace, um eine benutzerdefinierte Ablaufverfolgung im Application Insights-Protokoll zu generieren
    • Anzeigen der Anzahl im Protokoll gesammelter Ablaufverfolgungen mithilfe der Azure CLI
    • Anzeigen der Liste der Ablaufverfolgungen mithilfe des Azure-Portals
  • Entfernen von Ressourcen mithilfe der Azure CLI

Erstellen oder Verwenden eines vorhandenen Azure-Abonnements

Sie benötigen ein Azure-Benutzerkonto mit einem aktiven Abonnement. Erstellen Sie ein kostenloses Konto.

Voraussetzungen

  • SSH zum Herstellen einer Verbindung mit dem virtuellen Computer: Verwenden Sie Azure Cloud Shell oder ein modernes Terminal, z. B. bash shell, das SSH enthält.
  • Verwenden Sie die Bash-Umgebung in Azure Cloud Shell. Weitere Informationen finden Sie unter Schnellstart für Bash in Azure Cloud Shell.

  • Wenn Sie CLI-Referenzbefehle lieber lokal ausführen, installieren Sie die Azure CLI. Wenn Sie Windows oder macOS ausführen, sollten Sie die Azure CLI in einem Docker-Container ausführen. Weitere Informationen finden Sie unter Ausführen der Azure CLI in einem Docker-Container.

    • Wenn Sie eine lokale Installation verwenden, melden Sie sich mithilfe des Befehls az login bei der Azure CLI an. Führen Sie die in Ihrem Terminal angezeigten Schritte aus, um den Authentifizierungsprozess abzuschließen. Informationen zu anderen Anmeldeoptionen finden Sie unter Anmelden mit der Azure CLI.

    • Installieren Sie die Azure CLI-Erweiterung beim ersten Einsatz, wenn Sie dazu aufgefordert werden. Weitere Informationen zu Erweiterungen finden Sie unter Verwenden von Erweiterungen mit der Azure CLI.

    • Führen Sie az version aus, um die installierte Version und die abhängigen Bibliotheken zu ermitteln. Führen Sie az upgrade aus, um das Upgrade auf die aktuelle Version durchzuführen.

1. Erstellen einer Application Insights-Ressource für Webseiten

Hier erfahren Sie, wie Sie eine Azure-Ressourcengruppe für alle Ihre Azure-Ressourcen sowie eine Monitor-Ressource erstellen, um die Protokolldateien Ihrer Web-App in der Azure-Cloud zu sammeln. Wenn Sie eine Ressourcengruppe erstellen, können Sie die Ressourcen ganz einfach finden und löschen, wenn Sie fertig sind. Azure Monitor ist der Name des Azure-Diensts. Application Insights ist der Name der im Tutorial verwendeten Clientbibliothek.

  1. Optional, wenn Sie mehr als ein Abonnement haben, verwenden Sie az-Konto, um das Standardabonnement festzulegen, bevor Sie die Befehle für die Neuversion abschließen Standard.

    az account set \
        --subscription "ACCOUNT NAME OR ID" 
    
  2. Erstellen Sie eine Azure-Ressourcengruppe mit az group create. Verwenden Sie den Namen rg-demo-vm-eastus:

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

Erstellen einer Azure Monitor-Ressource mithilfe der Azure CLI

  1. Installieren Sie die Application Insights-Erweiterung für die Azure CLI.

    az extension add -n application-insights
    
  2. Verwenden Sie den folgenden Befehl, um eine Überwachungsressource zu erstellen, wobei die Komponente "az monitor app-insights" erstellt wird:

    az monitor app-insights component create \
      --app demoWebAppMonitor \
      --location eastus \
      --resource-group rg-demo-vm-eastus \
      --query instrumentationKey --output table
    
  3. Kopieren Sie das Ergebnis aus der Ausgabe, sie benötigen diesen Wert als instrumentationKey später.

  4. Lassen Sie das Terminal geöffnet, verwenden Sie es im nächsten Schritt.

2. Erstellen eines virtuellen Linux-Computers mit Azure CLI

Verwendet eine Cloud-Init-Konfigurationsdatei, um sowohl den NGINX-Reverseproxyserver als auch den Express.js-Server zu erstellen. NGINX wird verwendet, um den Express.js-Port (3000) an den öffentlichen Port (80) weiterzuleiten.

  1. Erstellen Sie eine lokale Datei namens cloud-init-github.txt, und speichern Sie den folgenden Inhalt in der Datei, oder speichern Sie die Datei des Repositorys auf Ihrem lokalen Computer. Die formatierte Datei vom Typ cloud-init muss sich im gleichen Ordner befinden, der auch im Terminalpfad für Ihre Azure CLI-Befehle verwendet wird.

    #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. Sehen Sie sich den Abschnitt runcmd der Datei an, um die Funktionsweise zu verstehen.

    runcmd hat verschiedene Aufgaben:

    • Herunterladen und Installieren von Node.js
    • Klonen des Express.js-Beispielrepositorys aus GitHub in das Verzeichnis myapp
    • Installieren der Anwendungsabhängigkeiten
    • Starten der Express.js-App mit PM2

Erstellen einer VM-Ressource

  1. Geben Sie den Azure CLI-Befehl ein, az vm create, an einem Terminal, um eine Azure-Ressource eines virtuellen Linux-Computers zu erstellen. Der Befehl erstellt den virtuellen Computer auf der Grundlage der cloud-init-Datei und generiert die SSH-Schlüssel für Sie. Der Speicherort der Schlüssel wird bei der Befehlsausführung angezeigt.

    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. Warten Sie, während der Vorgang einige Minuten dauern kann.

  3. Halten Sie den publicIpAddress-Wert aus der Antwort, es ist erforderlich, die Web-App in einem Browser anzuzeigen und eine Verbindung mit der VM herzustellen. Wenn Sie diese IP verlieren, verwenden Sie den Azure CLI-Befehl az vm list-ip-addresses , um sie erneut abzurufen.

  4. Der Prozess hat SSH-Schlüssel erstellt, aber an einem Speicherort, der in der Antwort angegeben ist.

  5. Wechseln Sie zu diesem Speicherort, und erstellen Sie die authorized_keys Datei:

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

Öffnen eines Ports für den virtuellen Computer

Nach der Erstellung verfügt der virtuelle Computer zunächst über keine geöffneten Ports. Öffnen Sie Port 80 mit dem folgenden Azure CLI-Befehl, az vm open-port , damit die Web-App öffentlich verfügbar ist:

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

Öffnen der Website im Browser

  1. Verwenden Sie die öffentliche IP-Adresse in einem Webbrowser, um sich zu vergewissern, dass der virtuelle Computer verfügbar ist und ausgeführt wird. Ändern Sie die URL so, dass der Wert von publicIpAddressverwendet wird.

    http://YOUR-VM-PUBLIC-IP-ADDRESS
    
  2. Sollte für die Ressource ein Gatewayfehler auftreten, warten Sie eine Minute, und versuchen Sie es dann erneut. (Unter Umständen dauert es etwas, bis die Web-App gestartet wurde.)

  3. Die Web-App des virtuellen Computers gibt die folgenden Informationen zurück:

    • Name des virtuellen Computers
    • Ihre Client-ID
    • Aktuelles Datum/aktuelle Uhrzeit

    Screenshot des Webbrowsers mit einfacher App, die von linus virtual machine auf Azure bereitgestellt wird.

  4. Die anfängliche Codedatei für die Web-App verfügt über eine einzelne Route, die über den NGINX-Proxy geleitet wird.

    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. Verbinden auf virtuellen Linux-Computer mit SSH

In diesem Abschnitt des Tutorials wird SSH in einem Terminal verwendet, um eine Verbindung mit Ihrem virtuellen Computer herzustellen. SSH ist ein gängiges Tool, das mit vielen modernen Shells bereitgestellt wird. Dazu zählt auch Azure Cloud Shell.

Herstellen einer SSH-Verbindung und Ändern der Web-App

  1. Stellen Sie mithilfe des folgenden Befehls eine Verbindung mit Ihrem virtuellen Computer her.

    Ersetzen Sie YOUR-VM-PUBLIC-IP durch die öffentliche IP-Adresse Ihres eigenen virtuellen Computers.

    ssh azureuser@YOUR-VM-PUBLIC-IP
    

    Bei diesem Prozess wird davon ausgegangen, dass der verwendete SSH-Client Ihre SSH-Schlüssel finden kann, die im Rahmen der VM-Erstellung erstellt und auf Ihrem lokalen Computer platziert wurden.

  2. Wenn Sie gefragt werden, ob Sie sicher sind, dass Sie eine Verbindung herstellen, beantworten y oder yes fortfahren möchten.

  3. Verwenden Sie den folgenden Befehl, um zu prüfen, wo Sie sich auf dem virtuellen Computer befinden. Sie sollten sich im Stammverzeichnis von „azureuser“ befinden: /home/azureuser.

    pwd
    
  4. Nach Abschluss der Verbindung sollte die Terminalaufforderung geändert werden, um den Benutzernamen und den Ressourcennamen des virtuellen Remotecomputers anzugeben.

    azureuser@demo-vm:
    
  5. Ihre Web-App befindet sich im Unterverzeichnis myapp. Wechseln Sie zum Verzeichnis myapp, und listen Sie den Inhalt auf:

    cd myapp && ls -l
    
  6. Inhalte, die das GitHub-Repository darstellen, das in den virtuellen Computer geklont ist, und die npm-Paketdateien sollten angezeigt werden:

    -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
    

Installieren eines SDK für die Überwachung

  1. Installieren Sie im SSH-Terminal, das mit Ihrem virtuellen Computer verbunden ist, die Azure SDK-Clientbibliothek für Application Insights.

    sudo npm install --save applicationinsights
    
  2. Warten Sie, bis der Befehl abgeschlossen ist, bevor Sie fortfahren.

Hinzufügen des Instrumentierungsschlüssels für die Überwachung

  1. Installieren Sie im SSH-Terminal, das mit Ihrem virtuellen Computer verbunden ist, den Nano-Editor, um die Datei package.json zu öffnen.

    sudo nano package.json
    
  2. Fügen Sie am Anfang des Startskripts die Umgebungsvariable APPINSIGHTS_INSTRUMENTATIONKEY hinzu. Ersetzen Sie im folgenden Beispiel REPLACE-WITH-YOUR-KEY durch den Wert Ihres Instrumentierungsschlüssels.

    "start": "APPINSIGHTS_INSTRUMENTATIONKEY=REPLACE-WITH-YOUR-KEY pm2 start index.js --watch --log /var/log/pm2.log"
    
  3. Speichern Sie im SSH-Terminal die Datei im Nano-Editor mit STRG + X.

  4. Wenn Sie im Nano-Editor dazu aufgefordert werden, geben Sie "Y " ein, um zu speichern.

  5. Wenn Sie im Nano-Editor dazu aufgefordert werden, akzeptieren Sie den Dateinamen, wenn Sie dazu aufgefordert werden.

Beenden des virtuellen Computers zum Ändern der Anwendung

Die Azure-Clientbibliothek befindet sich nun im Verzeichnis node_modules, und der Schlüssel wird als Umgebungsvariable an die App übergeben. Im nächsten Schritt werden Application Insights programmgesteuert verwendet.

  1. Beenden Sie PM2, einen Manager für den Produktionsprozess für Node.js-Anwendungen, mit den folgenden Befehlen:

    sudo npm run-script stop 
    
  2. Ersetzen Sie das Original index.js durch die Datei mithilfe von Application Insights.

    sudo npm run-script appinsights
    
  3. Der Clientbibliotheks- und Protokollierungscode wird für Sie bereitgestellt.

    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. Starten Sie die App mit PM2 neu, um die nächste Umgebungsvariable zu übernehmen.

    sudo npm start
    

Verwenden der App zum Überprüfen der Protokollierung

  1. Testen Sie die App mit der neuen Route trace in einem Webbrowser:

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

    Im Browser wird die Antwort trace route demo-vm YOUR-CLIENT-IP VM-DATE-TIME mit Ihrer IP-Adresse angezeigt.

Anzeigen des Protokolls für NGINX

Der virtuelle Computer (VM) sammelt Protokolle für NGINX, die zum Anzeigen verfügbar sind.

Dienst Speicherort des Protokolls
NGINX /var/log/nginx/access.log
  1. Zeigen Sie im SSH-Terminal das VM-Protokoll für den NGINX-Proxydienst mit dem folgenden Befehl an, um das Protokoll einzusehen:
cat /var/log/nginx/access.log
  1. Das Protokoll enthält den Aufruf Ihres lokalen Computers.
"GET /trace HTTP/1.1" 200 10 "-"

Anzeigen des Protokolls für PM2

Der virtuelle Computer sammelt Protokolle für PM2, die zum Anzeigen verfügbar sind.

Dienst Speicherort des Protokolls
PM2 /var/log/pm2.log
  1. Zeigen Sie das VM-Protokoll für den PM2-Dienst an. Dabei handelt es sich um Ihre Express.js-Node-Web-App. Verwenden Sie in der gleichen Bash-Shell den folgenden Befehl, um das Protokoll anzuzeigen:

    cat /var/log/pm2.log
    
  2. Das Protokoll enthält den Aufruf Ihres lokalen Computers.

    grep "Hello world app listening on port 3000!" /var/log/pm2.log
    
  3. Das Protokoll enthält außerdem Ihre Umgebungsvariablen (einschließlich Ihres ApplicationInsights-Schlüssels), die im npm-Startskript übergeben werden. Verwenden Sie den folgenden grep-Befehl, um zu überprüfen, ob Ihr Schlüssel in den Umgebungsvariablen enthalten ist:

    grep APPINSIGHTS_INSTRUMENTATIONKEY /var/log/pm2.log
    

    Dadurch wird Ihr PM2-Protokoll mit dem in einer anderen Farbe hervorgehobenen Instrumentierungsschlüssel (APPINSIGHTS_INSTRUMENTATIONKEY) angezeigt.

VM-Protokollierung und Cloudprotokollierung

In dieser Anwendung werden unter Verwendung von console.log die Nachrichten nur in die auf dem virtuellen Computer gefundenen PM2-Protokolle geschrieben. Wenn Sie die Protokolle oder den virtuellen Computer löschen, gehen diese Informationen verloren.

Wenn Sie die Protokolle über die Lebensdauer Ihres virtuellen Computers hinaus beibehalten möchten, verwenden Sie Application Insights.

5. Bereinigen von Ressourcen

Nachdem Sie dieses Lernprogramm abgeschlossen haben, müssen Sie die Ressourcengruppe entfernen, die alle zugehörigen Ressourcen enthält, um sicherzustellen, dass sie nicht mehr in Rechnung gestellt werden.

Verwenden Sie im selben Terminal den Azure CLI-Befehl az group delete, um die Ressourcengruppe zu löschen:

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

Die Ausführung dieses Befehls dauert einige Minuten.

Problembehandlung

Verwenden Sie bei Problemen die folgende Tabelle, um zu verstehen, wie Sie Ihr Problem beheben können:

Problem Lösung
Gatewayfehler 502 Dieser Fehler kann darauf hindeuten, dass die Datei „index.js“ oder „package.js“ einen Fehler enthält. Weitere Informationen finden Sie in Ihren PM2-Protokollen unter /var/log/pm2.log. Der zuletzt aufgetretene Fehler befindet sich am Ende der Datei. Wenn Sie sicher sind, dass diese Dateien korrekt sind, beenden Sie das PM2 mit den npm-Skripts in package.json.

Beispielcode

Nächste Schritte