次の方法で共有


チュートリアル - Azure での Linux 仮想マシンの初回の起動時に cloud-init を使用してカスタマイズする方法

適用対象: ✔️ Linux VM ✔️ フレキシブルなスケール セット

前のチュートリアルでは、仮想マシン (VM) に SSH 接続して NGINX を手動でインストールする方法について説明しました。 VM を迅速かつ一貫した方法で作成するには、一般的に、何らかの形で自動化することが必要です。 VM を初回起動時にカスタマイズする一般的なアプローチには、cloud-init を使用する方法があります。 このチュートリアルで学習する内容は次のとおりです。

  • cloud-init 構成ファイルを作成する
  • cloud-init ファイルを使用する VM を作成する
  • VM の作成後に実行されている Node.js アプリを表示する
  • Key Vault を使用して証明書を安全に格納する
  • cloud-init を使用して NGINX のセキュリティで保護されたデプロイを自動化する

CLI をローカルにインストールして使用する場合、このチュートリアルでは、Azure CLI バージョン 2.0.30 以降を実行していることが要件です。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。

cloud-init の概要

cloud-Init は、Linux VM を初回起動時にカスタマイズするために広く使用されているアプローチです。 cloud-init を使って、パッケージをインストールしてファイルを書き込んだり、ユーザーとセキュリティを構成したりすることができます。 初回起動処理中に cloud-init が実行されるので、構成を適用するために追加の手順や必要なエージェントはありません。

cloud-init はディストリビューション全体でも有効です。 たとえば、パッケージをインストールするときに apt-get installyum install は使用しません。 代わりに、cloud-init ではインストールするパッケージの一覧をユーザーが定義できます。 cloud-init によって、選択したディストリビューションに対してネイティブのパッケージ管理ツールが自動的に使用されます。

Microsoft ではパートナーと協力して、パートナーから Azure に提供されたイメージに cloud-init を含めて、使用できるようにしています。 ディストリビューションごとの cloud-init のサポートに関する詳しい情報については、Azure での VM に対する cloud-init のサポートに関する記事を参照してください。

cloud-init 構成ファイルを作成する

cloud-init が動作していることを確認するには、NGINX をインストールして単純な "Hello World" Node.js アプリを実行する VM を作成します。 次の cloud-init 構成では、必要なパッケージをインストールし、Node.js アプリを作成した後、アプリを初期化して起動します。

Bash プロンプトまたは Cloud Shell で、cloud-init.txt という名前のファイルを作成し、次の構成を貼り付けます。 たとえば、「sensible-editor cloud-init.txt」と入力し、ファイルを作成して使用可能なエディターの一覧を確認します。 cloud-init ファイル全体 (特に最初の行) が正しくコピーされたことを確認してください。

#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 構成オプションの詳細については、cloud-init の構成例に関するページを参照してください。

仮想マシンの作成

VM を作成する前に、az group create を使用してリソース グループを作成します。 次の例では、リソース グループを作成します。 これらのコマンドでは、繰り返しデプロイ中に名前の競合を防ぐために、ランダムなサフィックスがリソース グループと VM 名に追加されます。

export RANDOM_SUFFIX=$(openssl rand -hex 3)
export RESOURCE_GROUP="myResourceGroupAutomate$RANDOM_SUFFIX"
export REGION="eastus2"
az group create --name $RESOURCE_GROUP --___location $REGION

結果:

{
  "id": "/subscriptions/xxxxx-xxxxx-xxxxx-xxxxx/resourceGroups/myResourceGroupAutomatexxx",
  "___location": "eastus",
  "managedBy": null,
  "name": "myResourceGroupAutomatexxx",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

ここで az vm create を使用して VM を作成します。 --custom-data パラメーターを使用して、cloud-init 構成ファイルを渡します。 現在の作業ディレクトリの外部に構成ファイル cloud-init.txt を保存していた場合には、このファイルの完全パスを指定します。 次の例では、VM を作成します。VM 名にもランダム サフィックスが追加されることに注意してください。

export VM_NAME="myAutomatedVM$RANDOM_SUFFIX"
az vm create \
    --resource-group $RESOURCE_GROUP \
    --name $VM_NAME \
    --image Ubuntu2204 \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init.txt

結果:

{
  "fqdns": "",
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupAutomatexxx/providers/Microsoft.Compute/virtualMachines/myAutomatedVMxxx",
  "___location": "eastus",
  "name": "myAutomatedVMxxx",
  "powerState": "VM running",
  "publicIpAddress": "x.x.x.x",
  "resourceGroup": "myResourceGroupAutomatexxx",
  "zones": ""
}

VM が作成され、パッケージがインストールされて、アプリが開始されるには、数分かかります。 Azure CLI がプロンプトに戻った後にも引き続き実行するバック グラウンド タスクがあります。 アプリにアクセスできるようになるには、さらに数分かかる場合があります。 VM が作成されたら、Azure CLI によって表示される publicIpAddress をメモしてください。 このアドレスは、Web ブラウザーから Node.js アプリにアクセスするために使用します。

Web トラフィックが VM にアクセスできるようにするには、az vm open-port を使用してインターネットからポート 80 を開きます。

az vm open-port --port 80 --resource-group $RESOURCE_GROUP --name $VM_NAME

結果:

{
  "endpoints": [
    {
      "name": "80",
      "protocol": "tcp",
      "publicPort": 80,
      "privatePort": 80
    }
  ],
  "id": "/subscriptions/xxxxx/resourceGroups/myResourceGroupAutomatexxx/providers/Microsoft.Compute/virtualMachines/myAutomatedVMxxx",
  "___location": "eastus",
  "name": "myAutomatedVMxxx"
}

Web アプリのテスト

Web ブラウザーを開き、アドレス バーにパブリック IP アドレスを入力できるようになりました。 VM 作成処理で取得した独自のパブリック IP アドレスを指定します。 Node.js アプリは次の例のように表示されます。

実行中の NGINX サイトを示すスクリーンショット。

次のステップ

このチュートリアルでは、VM の初回の起動時に cloud-init を使用してカスタマイズしました。 以下の方法を学習しました。

  • cloud-init 構成ファイルを作成する
  • cloud-init ファイルを使用する VM を作成する
  • VM の作成後に実行されている Node.js アプリを表示する
  • Key Vault を使用して証明書を安全に格納する
  • cloud-init を使用して NGINX のセキュリティで保護されたデプロイを自動化する

次のチュートリアルに進み、カスタムの VM イメージを作成する方法を学習してください。