Tutorial - Cara menggunakan cloud-init untuk menyesuaikan komputer virtual Linux di Azure pada boot pertama

Berlaku untuk: ✔️ Mesin Virtual Linux ✔️ Set skala fleksibel

Dalam tutorial sebelumnya, Anda belajar cara SSH ke komputer virtual (VM) dan menginstal NGINX secara manual. Untuk membuat VM dengan cepat dan konsisten, beberapa bentuk otomatisasi biasanya diinginkan. Pendekatan umum untuk menyesuaikan VM pada boot pertama adalah menggunakan cloud-init. Dalam tutorial ini, Anda akan mempelajari cara:

  • Membuat file konfigurasi cloud-init
  • Membuat VM yang menggunakan file cloud-init
  • Melihat aplikasi Node.js yang sedang berjalan setelah VM dibuat
  • Menggunakan Azure Key Vault untuk menyimpan sertifikat dengan aman
  • Mengotomatiskan penyebaran NGINX yang aman dengan cloud-init

Jika Anda memilih untuk menginstal dan menggunakan CLI secara lokal, tutorial ini mengharuskan Anda menjalankan Azure CLI versi 2.0.30 atau versi lebih baru. Jalankan az --version untuk menemukan versinya. Jika Anda perlu menginstal atau meningkatkan versi, lihat Menginstal Azure CLI.

Gambaran Umum cloud-init

Cloud-init adalah pendekatan yang digunakan luas untuk mengustomisasi Linux VM saat boot pertama kali. Anda dapat menggunakan cloud-init untuk memasang paket dan menulis file, atau untuk mengonfigurasi pengguna dan keamanan. Saat cloud-init berjalan selama proses booting awal, tidak ada langkah tambahan atau agen yang diperlukan untuk menerapkan konfigurasi Anda.

Cloud-init juga berjalan di seluruh distribusi. Misalnya, Anda tidak menggunakan apt-get install atau yum install untuk memasang paket. Sebagai gantinya, Anda dapat menentukan daftar paket yang akan dipasang. Cloud-init secara otomatis menggunakan alat manajemen paket asli untuk distro yang Anda pilih.

Kami bekerja sama dengan mitra kami untuk memasukkan cloud-init dan bekerja dalam gambar yang mereka berikan kepada Azure. Untuk informasi terperinci dukungan cloud-init untuk setiap distribusi, lihat Dukungan cloud-init untuk VM di Azure.

Membuat file konfigurasi cloud-init

Untuk melihat cloud-init beraksi, buat VM yang menginstal NGINX dan menjalankan aplikasi 'Hello World' Node.js sederhana. Konfigurasi cloud-init berikut init menginstal paket yang diperlukan, membuat aplikasi Node.js, lalu menginisialisasi dan memulai aplikasi.

Di prompt bash Anda atau di Cloud Shell, buat file bernama cloud-init.txt dan tempelkan konfigurasi berikut. Misalnya, sensible-editor cloud-init.txt ketik untuk membuat file dan melihat daftar editor yang tersedia. Pastikan bahwa seluruh file cloud-init disalin dengan benar, terutama baris pertama:

#cloud-config
package_upgrade: true
packages:
  - nginx
  - nodejs
  - npm
write_files:
  - owner: www-data:www-data
    path: /etc/nginx/sites-available/default
    defer: true
    content: |
      server {
        listen 80;
        location / {
          proxy_pass http://localhost:3000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection keep-alive;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }
      }
  - owner: azureuser:azureuser
    path: /home/azureuser/myapp/index.js
    defer: true
    content: |
      var express = require('express')
      var app = express()
      var os = require('os');
      app.get('/', function (req, res) {
        res.send('Hello World from host ' + os.hostname() + '!')
      })
      app.listen(3000, function () {
        console.log('Hello world app listening on port 3000!')
      })
runcmd:
  - service nginx restart
  - cd "/home/azureuser/myapp"
  - npm init
  - npm install express -y
  - nodejs index.js

Untuk informasi selengkapnya tentang opsi konfigurasi cloud-init, lihat contoh konfigurasi cloud-init.

Buat komputer virtual

Sebelum Anda dapat membuat VM, buat grup sumber daya dengan grup az buat. Contoh berikut membuat grup sumber daya bernama myResourceGroupAutomate di lokasi eastus:

az group create --name myResourceGroupAutomate --location eastus

Sekarang buat VM dengan az vm create. Gunakan --custom-data parameter untuk meneruskan file konfigurasi cloud-init Anda. Berikan jalur lengkap ke konfigurasi cloud-init.txt jika Anda menyimpan file di luar direktori kerja Anda saat ini. Berikut contoh membuat VM dengan nama myVm:

az vm create \
    --resource-group myResourceGroupAutomate \
    --name myAutomatedVM \
    --image Ubuntu2204 \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init.txt

Dibutuhkan beberapa menit agar VM dibuat, paket untuk diinstal, dan aplikasi untuk memulai. Ada tugas latar belakang yang terus berjalan setelah Azure CLI mengembalikan Anda ke perintah. Mungkin beberapa menit lagi sebelum Anda dapat mengakses aplikasi. Ketika VM telah dibuat, perhatikan yang publicIpAddress ditampilkan oleh Azure CLI. Alamat ini digunakan untuk mengakses aplikasi Node.js melalui browser web.

Untuk memungkinkan lalu lintas web mencapai VM Anda, buka port 80 dari Internet dengan az vm open-port:

az vm open-port --port 80 --resource-group myResourceGroupAutomate --name myAutomatedVM

Menguji aplikasi web

Sekarang Anda dapat membuka penelusuran web dan memasukkan http://<publicIpAddress> di bilah alamat. Berikan alamat IP publik Anda sendiri dari proses pembuatan VM. Aplikasi Node.js Anda ditampilkan seperti yang ditunjukkan dalam contoh berikut:

Menampilkan menjalankan situs NGINX

Menyuntikkan sertifikat dari Azure Key Vault

Bagian opsional ini memperlihatkan bagaimana Anda dapat menyimpan sertifikat dengan aman di Azure Key Vault dan menyuntikkannya selama penyebaran VM. Daripada menggunakan gambar khusus yang menyertakan sertifikat yang dipanggang, proses ini memastikan bahwa sertifikat terbaru disuntikkan ke VM pada boot pertama. Selama proses, sertifikat tidak pernah meninggalkan platform Azure atau diekspos dalam skrip, riwayat baris perintah, atau templat.

Azure Key Vault melindungi kunci dan rahasia kriptografi, seperti sertifikat atau kata sandi. Azure Key Vault membantu merampingkan proses manajemen kunci dan memungkinkan Anda mempertahankan kontrol tombol yang mengakses dan mengenkripsi data Anda. Skenario ini memperkenalkan beberapa konsep Azure Key Vault untuk membuat dan menggunakan sertifikat, meskipun bukan gambaran lengkap tentang cara menggunakan Azure Key Vault.

Langkah-langkah berikut ini memperlihatkan bagaimana Anda bisa:

  • Membuat Azure Key Vault
  • Membuat atau mengunggah sertifikat ke Azure Key Vault
  • Buat rahasia dari sertifikat untuk disuntikkan ke VM
  • Membuat VM dan menyuntikkan sertifikat

Membuat Azure Key Vault

Pertama, buat Azure Key Vault dengan buat keyvault az dan aktifkan untuk digunakan saat Anda menerapkan VM. Setiap Azure Key Vault memerlukan nama yang unik, dan semuanya harus lebih kecil. Ganti mykeyvault contoh berikut dengan nama Azure Key Vault unik Anda sendiri:

keyvault_name=mykeyvault
az keyvault create \
    --resource-group myResourceGroupAutomate \
    --name $keyvault_name \
    --enabled-for-deployment

Hasilkan sertifikat dan simpan di Azure Key Vault

Untuk penggunaan produksi, Anda harus mengimpor sertifikat yang valid yang ditandatangani oleh penyedia tepercaya dengan impor sertifikat az keyvault. Untuk tutorial ini, contoh berikut menunjukkan bagaimana Anda dapat menghasilkan sertifikat yang ditandatangani sendiri dengan pembuatan sertifikat az keyvault yang menggunakan kebijakan sertifikat default:

az keyvault certificate create \
    --vault-name $keyvault_name \
    --name mycert \
    --policy "$(az keyvault certificate get-default-policy --output json)"

Siapkan sertifikat untuk digunakan dengan VM

Untuk menggunakan sertifikat selama proses pembuatan VM, dapatkan ID sertifikat Anda dengan versi daftar rahasia az keyvault. VM membutuhkan sertifikat dalam format tertentu untuk menyuntikkannya pada boot, jadi konversi sertifikat dengan az vm secret format. Contoh berikut menetapkan output perintah ini ke variabel untuk kemudahan penggunaan di langkah-langkah berikutnya:

secret=$(az keyvault secret list-versions \
          --vault-name $keyvault_name \
          --name mycert \
          --query "[?attributes.enabled].id" --output tsv)
vm_secret=$(az vm secret format --secret "$secret" --output json)

Buat konfigurasi cloud-init untuk mengamankan NGINX

Saat Anda membuat VM, sertifikat dan kunci disimpan dalam direktori /var/lib/waagent/ yang dilindungi. Untuk mengotomatisasi penambahan sertifikat ke VM dan mengonfigurasi NGINX, Anda dapat menggunakan konfigurasi cloud-init yang diperbarui dari contoh sebelumnya.

Buat file bernama cloud-init-secured.txt dan tempelkan konfigurasi berikut. Jika Anda menggunakan Cloud Shell, buat file konfigurasi cloud-init di sana dan bukan di komputer lokal Anda. Misalnya, ketik sensible-editor cloud-init-secured.txt untuk membuat file dan melihat daftar editor yang tersedia. Pastikan bahwa seluruh file cloud-init disalin dengan benar, terutama baris pertama:

#cloud-config
package_upgrade: true
packages:
  - nginx
  - nodejs
  - npm
write_files:
  - owner: www-data:www-data
    path: /etc/nginx/sites-available/default
    defer: true
    content: |
      server {
        listen 80;
        listen 443 ssl;
        ssl_certificate /etc/nginx/ssl/mycert.cert;
        ssl_certificate_key /etc/nginx/ssl/mycert.prv;
        location / {
          proxy_pass http://localhost:3000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection keep-alive;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }
      }
  - owner: azureuser:azureuser
    path: /home/azureuser/myapp/index.js
    defer: true
    content: |
      var express = require('express')
      var app = express()
      var os = require('os');
      app.get('/', function (req, res) {
        res.send('Hello World from host ' + os.hostname() + '!')
      })
      app.listen(3000, function () {
        console.log('Hello world app listening on port 3000!')
      })
runcmd:
  - secretsname=$(find /var/lib/waagent/ -name "*.prv" | cut -c -57)
  - mkdir /etc/nginx/ssl
  - cp $secretsname.crt /etc/nginx/ssl/mycert.cert
  - cp $secretsname.prv /etc/nginx/ssl/mycert.prv
  - service nginx restart
  - cd "/home/azureuser/myapp"
  - npm init
  - npm install express -y
  - nodejs index.js

Buat VM yang aman

Sekarang buat VM dengan az vm create. Data sertifikat disuntikkan dari Azure Key Vault dengan --secrets parameter. Seperti contoh sebelumnya, Anda juga meneruskan konfigurasi cloud-init dengan --custom-data parameter:

az vm create \
    --resource-group myResourceGroupAutomate \
    --name myVMWithCerts \
    --image Ubuntu2204 \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init-secured.txt \
    --secrets "$vm_secret"

Dibutuhkan beberapa menit agar VM dibuat, paket untuk diinstal, dan aplikasi untuk memulai. Ada tugas latar belakang yang terus berjalan setelah Azure CLI mengembalikan Anda ke perintah. Mungkin beberapa menit lagi sebelum Anda dapat mengakses aplikasi. Ketika VM telah dibuat, perhatikan yang publicIpAddress ditampilkan oleh Azure CLI. Alamat ini digunakan untuk mengakses aplikasi Node.js melalui browser web.

Untuk memungkinkan lalu lintas web yang aman mencapai VM Anda, buka port 443 dari Internet dengan az vm open-port:

az vm open-port \
    --resource-group myResourceGroupAutomate \
    --name myVMWithCerts \
    --port 443

Uji aplikasi web aman

Sekarang Anda dapat membuka penelusuran web dan memasukkan https://<publicIpAddress> di bilah alamat. Berikan alamat IP publik Anda sendiri seperti yang ditunjukkan pada output proses pembuatan VM sebelumnya. Terima peringatan keamanan jika Anda menggunakan sertifikat yang ditandatangani sendiri:

Terima peringatan keamanan penjelajah web

Situs NGINX dan aplikasi Node.js aman Anda kemudian ditampilkan seperti dalam contoh berikut:

Menampilkan menjalankan situs NGINX yang aman

Langkah berikutnya

Dalam tutorial ini, Anda mengonfigurasi VM pada boot pertama dengan cloud-init. Anda mempelajari cara untuk:

  • Membuat file konfigurasi cloud-init
  • Membuat VM yang menggunakan file cloud-init
  • Melihat aplikasi Node.js yang sedang berjalan setelah VM dibuat
  • Menggunakan Azure Key Vault untuk menyimpan sertifikat dengan aman
  • Mengotomatiskan penyebaran NGINX yang aman dengan cloud-init

Lanjutkan ke tutorial berikutnya untuk mempelajari cara membuat gambar VM kustom.