Membuat komputer virtual Express.js menggunakan Azure CLI

Dalam tutorial ini, buat mesin virtual Linux (Mesin Virtual) untuk aplikasi Express.js. Mesin Virtual dikonfigurasikan dengan file konfigurasi cloud-init dan mencakup NGINX dan repositori GitHub untuk aplikasi Express.js. Koneksi ke VM dengan SSH, ubah aplikasi web menjadi menyertakan pencatatan jejak, dan lihat aplikasi server Express.js publik di browser web.

Tutorial ini mencakup tugas-tugas berikut:

  • Masuk ke Azure dengan Azure CLI
  • Membuat sumber daya Azure Linux VM dengan Azure CLI
    • Buka port publik 80
    • Instal demo Express.js aplikasi web dari repositori GitHub
    • Instal dependensi aplikasi web
    • Mulai aplikasi web
  • Membuat sumber daya Azure Monitoring dengan Azure CLI
    • Hubungkan ke VM dengan SSH
    • Instal pustaka klien Azure SDK dengan npm
    • Tambahkan kode pustaka klien Application Insights untuk membuat penelusuran khusus
  • Menampilkan aplikasi web dari browser
    • Meminta rute /trace untuk membuat penelusuran kustom di log Application Insights
    • Melihat jumlah jejak yang dikumpulkan dalam log dengan Azure CLI
    • Melihat daftar jejak dengan portal Microsoft Azure
  • Menghapus sumber daya dengan Azure CLI

Membuat atau menggunakan langganan Azure yang sudah ada

Anda memerlukan akun pengguna Azure dengan langganan aktif. Buat akun gratis.

Prasyarat

  • SSH untuk menyambungkan ke VM: Gunakan Azure Cloud Shell atau terminal modern seperti shell bash, yang mencakup SSH.

1. Buat sumber daya Application Insights untuk halaman web

Buat grup sumber daya Azure untuk semua sumber daya Azure Anda dan sumber daya Monitor untuk mengumpulkan file log aplikasi web Anda ke cloud Azure. Membuat grup sumber daya memungkinkan Anda menemukan sumber daya dengan mudah, dan menghapusnya setelah selesai. Azure Monitor adalah nama layanan Azure, sedangkan Application Insights adalah nama pustaka klien yang digunakan tutorial.

  1. Opsional, jika Anda memiliki lebih dari satu langganan, gunakan az account set untuk mengatur langganan default sebelum menyelesaikan perintah yang tersisa.

    az account set \
        --subscription "ACCOUNT NAME OR ID" 
    
  2. Buat grup sumber daya Azure dengan buat grup az. Gunakan nama rg-demo-vm-eastus:

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

Buat sumber daya Azure Monitor dengan Azure CLI

  1. Instal ekstensi Application Insights ke Azure CLI.

    az extension add -n application-insights
    
  2. Gunakan perintah berikut untuk membuat sumber daya pemantauan, dengan 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. Salin Hasil dari output, Anda akan memerlukan nilai tersebut sebagai instrumentationKey nanti.

  4. Biarkan terminal terbuka, Anda akan menggunakannya di langkah berikutnya.

2. Buat komputer virtual Linux menggunakan Azure CLI

Menggunakan file konfigurasi cloud-init untuk membuat server proksi terbalik NGINX dan server Express.js. NGINX digunakan untuk meneruskan port Express.js (3000) ke port umum (80).

  1. Buat file lokal bernama cloud-init-github.txt dan simpan konten berikut ke file atau Anda dapat menyimpan file repositori ke komputer lokal Anda. File yang diformat cloud-init harus ada di folder yang sama dengan jalur terminal untuk perintah Azure CLI Anda.

    #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. runcmd Tinjau bagian file untuk memahami apa yang dilakukannya.

    runcmd memiliki beberapa tugas:

    • Unduh Node.js, dan instal
    • Mengkloning repositori sampel Express.js dari GitHub ke myapp direktori
    • Instal dependensi aplikasi
    • Mulai aplikasi Express.js dengan PM2

Buat sumber daya mesin virtual

  1. Masukkan perintah Azure CLI, az vm create, di terminal untuk membuat sumber daya Azure dari mesin virtual Linux. Perintah membuat VM dari file cloud-init dan menghasilkan kunci SSH untuk Anda. Perintah berjalan menampilkan tempat kunci disimpan.

    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. Tunggu sementara prosesnya mungkin memakan waktu beberapa menit.

  3. Jaga nilai publicIpAddress dari respons, diperlukan untuk melihat aplikasi web di browser dan untuk menyambungkan ke VM. Jika Anda kehilangan IP ini, gunakan perintah Azure CLI, az vm list-ip-addresses untuk mendapatkannya lagi.

  4. Proses membuat kunci SSH dan tetapi di lokasi yang dinyatakan dalam respons.

  5. Buka lokasi tersebut authorized_keys dan buat file:

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

Buka port untuk mesin virtual

Saat pertama kali dibuat, mesin virtual tidak memiliki port terbuka. Buka port 80 dengan perintah Azure CLI berikut, az vm open-port sehingga aplikasi web tersedia untuk umum:

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

Jelajahi situs web

  1. Gunakan alamat IP publik di browser web untuk memastikan mesin virtual tersedia dan berjalan. Ubah URL untuk menggunakan nilai dari publicIpAddress.

    http://YOUR-VM-PUBLIC-IP-ADDRESS
    
  2. Jika sumber daya gagal dengan kesalahan gateway, coba lagi dalam satu menit, aplikasi web mungkin memerlukan waktu satu menit untuk memulai.

  3. Aplikasi web mesin virtual mengembalikan informasi berikut:

    • Nama komputer virtual
    • IP klien Anda
    • Tanggal/Waktu Saat Ini

    Screenshot of web browser showing simple app served from Linus virtual machine on Azure.

  4. File kode awal untuk aplikasi web memiliki satu rute, yang melewati 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. Koneksi ke komputer virtual Linux menggunakan SSH

Di bagian tutorial ini, gunakan SSH di terminal untuk terhubung ke mesin virtual Anda. SSH adalah alat umum yang disediakan dengan berbagai shell modern, termasuk Azure Cloud Shell.

Hubungkan dengan SSH dan ubah aplikasi web

  1. Hubungkan ke mesin virtual jarak jauh dengan perintah berikut.

    Ganti YOUR-VM-PUBLIC-IP dengan IP publik mesin virtual Anda sendiri.

    ssh azureuser@YOUR-VM-PUBLIC-IP
    

    Proses ini mengasumsikan bahwa klien SSH Anda dapat menemukan kunci SSH Anda, dibuat sebagai bagian dari pembuatan VM Anda dan ditempatkan pada komputer lokal Anda.

  2. Jika Anda ditanya apakah Anda yakin ingin tersambung, menjawab y , atau yes melanjutkan.

  3. Gunakan perintah berikut untuk memahami di mana Anda berada di mesin virtual. Anda harus berada di akar azureuser: /home/azureuser.

    pwd
    
  4. Ketika koneksi selesai, perintah terminal harus berubah untuk menunjukkan nama pengguna dan nama sumber daya komputer virtual jarak jauh.

    azureuser@demo-vm:
    
  5. Aplikasi web Anda berada di subdirektori, myapp. Ubah ke direktori myapp dan cantumkan kontennya:

    cd myapp && ls -l
    
  6. Anda akan melihat konten yang mewakili repositori GitHub yang dikloning ke komputer virtual dan file paket 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
    

Instal SDK Pemantauan

  1. Di terminal SSH, yang terhubung ke komputer virtual Anda, instal pustaka klien Azure SDK untuk Application Insights.

    sudo npm install --save applicationinsights
    
  2. Tunggu sampai perintah selesai sebelum melanjutkan.

Menambahkan kunci instrumentasi Pemantauan

  1. Di terminal SSH, yang terhubung ke mesin virtual Anda, gunakan editor Nano untuk membuka file package.json.

    sudo nano package.json
    
  2. Tambahkan variabel lingkungan APPINSIGHTS_INSTRUMENTATIONKEY ke awal skrip Mulai Anda. Dalam contoh berikut, ganti REPLACE-WITH-YOUR-KEY dengan nilai kunci instrumentasi Anda.

    "start": "APPINSIGHTS_INSTRUMENTATIONKEY=REPLACE-WITH-YOUR-KEY pm2 start index.js --watch --log /var/log/pm2.log"
    
  3. Masih di terminal SSH, simpan file di editor Nano dengan control + X.

  4. Jika diminta di editor Nano, masukkan Y untuk menyimpan.

  5. Jika diminta di editor Nano, terima nama file saat diminta.

Hentikan VM untuk mengubah aplikasi

Pustaka klien Azure sekarang ada di direktori node_modules Anda dan kunci diteruskan ke aplikasi sebagai variabel lingkungan. Langkah berikutnya secara terprogram menggunakan Application Insights.

  1. Stop PM2, yang merupakan manajer proses produksi untuk aplikasi Node.js, dengan perintah berikut:

    sudo npm run-script stop 
    
  2. Ganti asli index.js dengan file menggunakan Application Insights.

    sudo npm run-script appinsights
    
  3. Pustaka klien dan kode pengelogan disediakan untuk Anda.

    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. Mulai ulang aplikasi dengan PM2 untuk mengambil variabel lingkungan berikutnya.

    sudo npm start
    

Menggunakan aplikasi untuk memverifikasi pengelogan

  1. Di browser web, uji aplikasi dengan rute trace baru:

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

    Browser menampilkan respons, trace route demo-vm YOUR-CLIENT-IP VM-DATE-TIME dengan alamat IP Anda.

Melihat log untuk NGINX

Mesin virtual (VM) mengumpulkan log untuk NGINX, yang tersedia untuk dilihat.

Service Lokasi log
NGINX /var/log/nginx/access.log
  1. Masih di terminal SSH, lihat log VM untuk layanan proksi NGINX dengan perintah berikut untuk melihat log:
cat /var/log/nginx/access.log
  1. Log menyertakan panggilan dari komputer lokal Anda.
"GET /trace HTTP/1.1" 200 10 "-"

Melihat log untuk PM2

Mesin virtual mengumpulkan log untuk PM2, yang tersedia untuk dilihat.

Service Lokasi log
PM2 /var/log/pm2.log
  1. Lihat log VM untuk layanan PM2, yang merupakan aplikasi web Node Express.js Anda. Di shell bash yang sama, gunakan perintah berikut untuk melihat log:

    cat /var/log/pm2.log
    
  2. Log menyertakan panggilan dari komputer lokal Anda.

    grep "Hello world app listening on port 3000!" /var/log/pm2.log
    
  3. Log juga menyertakan variabel lingkungan Anda, termasuk kunci ApplicationInsights Anda, yang diteruskan dalam skrip mulai npm. gunakan perintah grep berikut untuk memverifikasi kunci Anda ada di variabel lingkungan.

    grep APPINSIGHTS_INSTRUMENTATIONKEY /var/log/pm2.log
    

    Ini menampilkan log PM2 Anda dengan APPINSIGHTS_INSTRUMENTATIONKEY disorot dalam warna yang berbeda.

Pengelogan VM dan pengelogan cloud

Dalam aplikasi ini, menggunakan console.log menulis pesan ke log PM2 yang ditemukan hanya pada VM. Jika Anda menghapus log atau VM, Anda kehilangan informasi tersebut.

Jika Anda ingin mempertahankan log di luar masa pakai mesin virtual Anda, gunakan Application Insights.

5. Menghapus sumber daya

Setelah menyelesaikan tutorial ini, Anda perlu menghapus grup sumber daya, yang mencakup semua sumber dayanya untuk memastikan Anda tidak ditagih untuk penggunaan lagi.

Di terminal yang sama, gunakan perintah Azure CLI, az group delete, untuk menghapus grup sumber daya:

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

Perintah ini membutuhkan waktu beberapa menit.

Pemecahan Masalah

Jika Anda mengalami masalah, gunakan tabel berikut untuk memahami cara mengatasi masalah Anda:

Masalah Resolusi
Kesalahan Gateway 502 Ini bisa menunjukkan file index.js atau package.js Anda memiliki kesalahan. Lihat log PM2 Anda di /var/log/pm2.log untuk informasi lebih lanjut. Kesalahan terbaru ada di bagian bawah file. Jika Anda yakin file tersebut benar, hentikan dan mulai PM2 menggunakan skrip npm di package.json.

Kode Sampel

Langkah berikutnya