Öğretici - Azure’da ilk önyüklemede bir Linux sanal makinesini özelleştirmek için cloud-init kullanma

Şunlar için geçerlidir: ✔️ Linux VM'leri ✔️ Esnek ölçek kümeleri

Bir önceki öğreticide, sanal makineye nasıl SSH uygulanacağını ve NGINX öğesinin el ile nasıl yükleneceğini öğrendiniz. Hızlı ve tutarlı şekilde sanal makineler oluşturmak için genellikle bir otomasyon biçimi istenir. İlk önyüklemede bir sanal makineyi özelleştirmek için genellikle cloud-init kullanılır. Bu öğreticide şunların nasıl yapıldığını öğrenirsiniz:

  • cloud-init yapılandırma dosyası oluşturma
  • cloud-init dosyası kullanan bir sanal makine oluşturma
  • Sanal makine oluşturulduktan sonra çalıştırılan bir Node.js uygulamasını görüntüleme
  • Sertifikaları güvenli şekilde depolamak için Key Vault’u kullanma
  • cloud-init ile güvenli NGINX dağıtımlarını otomatikleştirme

CLI'yi yerel olarak yükleyip kullanmayı tercih ederseniz bu öğretici için Azure CLI 2.0.30 veya sonraki bir sürümünü çalıştırmanız gerekir. Sürümü bulmak için az --version komutunu çalıştırın. Yüklemeniz veya yükseltmeniz gerekirse, bkz. Azure CLI yükleme.

Cloud-init genel bakış

Cloud-init, Linux VM’sini ilk kez önyüklendiğinde özelleştirmeyi sağlayan, sık kullanılan bir yaklaşımdır. cloud-init’i paket yükleme, dosyalara yazma ve kullanıcılar ile güvenliği yapılandırma işlemleri için kullanabilirsiniz. cloud-init önyükleme işlemi sırasında çalışırken, yapılandırmanıza uygulayabileceğiniz ek adım veya gerekli aracı yoktur.

Cloud-init, dağıtımlar arasında da çalışır. Örneğin, bir paket yüklemek için apt-get install veya yum install kullanmazsınız. Bunun yerine, yüklenecek paketlerin listesini tanımlayabilirsiniz. Cloud-init, seçtiğiniz dağıtım için yerel paket yönetim aracını otomatik olarak kullanır.

Azure’a sağladıkları görüntülere cloud-init’in dahil edilmesini ve bu görüntülerde çalışmasını sağlamak için iş ortaklarımızla çalışıyoruz. Her dağıtım için cloud-init desteği hakkında ayrıntılı bilgi için bkz. Azure'da VM'ler için Cloud-init desteği.

cloud-init yapılandırma dosyası oluşturma

cloud-init’i uygulamalı olarak görmek için, NGINX’i yükleyen ve basit bir 'Merhaba Dünya' Node.js uygulaması çalıştıran bir sanal makine oluşturun. Aşağıdaki cloud-init yapılandırması, gerekli paketleri yükler, bir Node.js uygulaması oluşturur, ardından uygulamayı kullanıma hazırlar ve başlatır.

Bash isteminizde veya Cloud Shell cloud-init.txt adlı bir dosya oluşturun ve aşağıdaki yapılandırmayı yapıştırın. Örneğin, dosyayı oluşturmak ve kullanılabilir düzenleyicilerin listesini görmek için yazın sensible-editor cloud-init.txt . Başta birinci satır olmak üzere cloud-init dosyasının tamamının doğru bir şekilde kopyalandığından emin olun:

#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

cloud-init yapılandırma seçenekleri hakkında daha fazla bilgi için bkz. cloud-init config örnekleri.

Sanal makine oluşturma

VM oluşturabilmek için önce az group create ile bir kaynak grubu oluşturun. Aşağıdaki örnek, eastus konumunda myResourceGroupAutomate adlı bir kaynak grubu oluşturur:

az group create --name myResourceGroupAutomate --location eastus

Şimdi az vm create ile bir VM oluşturun. --custom-data parametresini kullanarak cloud-init yapılandırma dosyanızı geçirin. Dosyayı mevcut çalışma dizininizin dışına kaydettiyseniz cloud-init.txt yapılandırmasının tam yolunu belirtin. Aşağıdaki örnek myVM adlı bir VM oluşturur:

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

VM’nin oluşturulması, paketlerin yüklenmesi ve uygulamanın başlatılması birkaç dakika sürebilir. Azure CLI sizi isteme geri döndürdükten sonra çalışmaya devam eden arka plan görevleri vardır. Uygulamaya erişmeniz birkaç dakika sürebilir. VM oluşturulduktan sonra, Azure CLI tarafından görüntülenen publicIpAddress değerini not edin. Bu adres, web tarayıcısı aracılığıyla Node.js uygulamasına erişmek için kullanılır.

Web trafiğinin VM’nize erişmesine izin vermek için, az vm open-port komutuyla İnternet’te 80 numaralı bağlantı noktasını açın:

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

Web uygulamasını test etme

Artık bir web tarayıcısı açıp adres çubuğuna http://< publicIpAddress> girebilirsiniz. VM oluşturma işleminden kendi herkese açık IP adresinizi sağlayın. Node.js uygulamanız, aşağıdaki örnekte olduğu gibi görüntülenir:

Çalışan NGINX sitesini görüntüleme

Key Vault’tan sertifikalar ekleme

Bu isteğe bağlı bölümde, Azure Key Vault’ta sertifikaları nasıl güvenli şekilde depolayabileceğiniz ve sanal makine dağıtımı sırasında bunları nasıl ekleyebileceğiniz gösterilir. Bu süreç, sertifikaları içeren özel bir görüntü kullanmak yerine ilk önyüklemede bir sanal makineye en güncel sertifikaların eklenmesini sağlar. İşlem sırasında sertifika hiçbir zaman Azure platformundan ayrılmaz veya bir betikte, komut satırı geçmişinde ya da şablonda gösterilmez.

Azure Key Vault, sertifikalar veya parolalar gibi şifreleme anahtarları ile gizli dizilerin güvenliğini sağlar. Key Vault, anahtar yönetimi işleminin kolaylaştırılmasına yardımcı olur ve verilerinize erişen ve bunları şifreleyen anahtarları denetiminizde tutmanıza olanak sağlar. Bu senaryo, Key Vault’un nasıl kullanılacağına dair kapsamlı bir genel bakış sunmasa da, sertifika oluşturma ve kullanmaya yönelik bazı Key Vault kavramlarını sunar.

Aşağıdaki adımlar şunları nasıl yapabileceğinizi gösterir:

  • Azure Key Vault oluşturma
  • Sertifikaları oluşturma veya Key Vault’a yükleme
  • Sanal makineye eklenecek sertifikadan gizli dizi oluşturma
  • VM oluşturma ve sertifika ekleme

Azure Key Vault oluşturma

İlk olarak az keyvault create ile bir Key Vault oluşturun ve bu anahtarın VM dağıtırken kullanılmasını etkinleştirin. Her Key Vault benzersiz bir ad gerektirir ve küçük harflerle yazılmalıdır. Aşağıdaki örnekte yer alan mykeyvault değerini, kendi benzersiz Key Vault adınızla değiştirin:

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

Sertifika oluşturma ve sertifikayı Key Vault’ta depolama

Üretim sırasında kullanım için, az keyvault certificate import komutunu kullanarak güvenilen bir sağlayıcı tarafından imzalanan geçerli bir sertifikayı içeri aktarmalısınız. Bu öğreticide, aşağıdaki örnekte varsayılan sertifika ilkesini kullanan az keyvault certificate create ile nasıl otomatik olarak imzalanan sertifika oluşturabileceğiniz gösterilmektedir:

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

Sertifikayı VM ile kullanım için hazırlama

VM oluşturma sürecinde sertifikayı kullanmak için, az keyvault secret list-versions komutuyla sertifikanızın kimliğini alın. VM, sertifikanın önyüklemede eklenmesi için belirli bir biçimde olmasını gerektirir, bu nedenle az vm secret format komutu ile sertifikayı dönüştürün. Aşağıdaki örnekte, sonraki adımlarda kullanım kolaylığı sağlamak için bu komutların çıkışı değişkenlere atanmaktadır:

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)

NGINX’in güvenliğini sağlamak için cloud-init yapılandırması oluşturma

VM oluşturduğunuzda, sertifika ve anahtarlar korunan /var/lib/waagent/ dizininde depolanır. VM’ye sertifika eklenmesini ve NGINX’in yapılandırılmasını otomatikleştirmek için önceki örnekte yer alan güncelleştirilmiş bir cloud-init yapılandırmasını kullanabilirsiniz.

cloud-init-secured.txt adlı bir dosya oluşturup aşağıdaki yapılandırmayı yapıştırın. Cloud Shell kullanıyorsanız cloud-init yapılandırma dosyasını yerel makinenizde değil orada oluşturun. Örneğin, dosyayı oluşturmak ve kullanılabilir düzenleyicilerin listesini görmek için yazın sensible-editor cloud-init-secured.txt . Başta birinci satır olmak üzere cloud-init dosyasının tamamının doğru bir şekilde kopyalandığından emin olun:

#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

Güvenli VM oluşturma

Şimdi az vm create ile bir VM oluşturun. Bu sertifika verileri, --secrets parametresiyle Key Vault’tan eklenir. Önceki örnekte olduğu gibi --custom-data parametresi ile de cloud-init yapılandırmasını geçirirsiniz:

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"

VM’nin oluşturulması, paketlerin yüklenmesi ve uygulamanın başlatılması birkaç dakika sürebilir. Azure CLI sizi isteme geri döndürdükten sonra çalışmaya devam eden arka plan görevleri vardır. Uygulamaya erişmeniz birkaç dakika sürebilir. VM oluşturulduktan sonra, Azure CLI tarafından görüntülenen publicIpAddress değerini not edin. Bu adres, web tarayıcısı aracılığıyla Node.js uygulamasına erişmek için kullanılır.

Güvenli web trafiğinin VM’nize erişmesine izin vermek için, az vm open-port komutuyla internette 443 numaralı bağlantı noktasını açın:

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

Güvenli web uygulamasını test etme

Artık bir web tarayıcısı açıp adres çubuğuna https://< publicIpAddress> girebilirsiniz. Önceki VM oluşturma işleminin çıkışında gösterildiği gibi kendi genel IP adresinizi girin. Otomatik olarak imzalanan sertifika kullanıyorsanız güvenlik uyarısını kabul edin:

Web tarayıcısı güvenlik uyarısını kabul edin

Güvenli NGINX siteniz ve Node.js uygulamanız aşağıdaki örnekte olduğu gibi görüntülenir:

Çalışan güvenli NGINX sitesini görüntüleme

Sonraki adımlar

Bu öğreticide, cloud-init ile ilk önyüklemede VM’leri yapılandırdınız. Şunları öğrendiniz:

  • cloud-init yapılandırma dosyası oluşturma
  • cloud-init dosyası kullanan bir sanal makine oluşturma
  • Sanal makine oluşturulduktan sonra çalıştırılan bir Node.js uygulamasını görüntüleme
  • Sertifikaları güvenli şekilde depolamak için Key Vault’u kullanma
  • cloud-init ile güvenli NGINX dağıtımlarını otomatikleştirme

Özel VM görüntülerinin nasıl oluşturulacağını öğrenmek için sonraki öğreticiye geçin.