適用対象: ✔️ 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 install や yum 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 アプリは次の例のように表示されます。
次のステップ
このチュートリアルでは、VM の初回の起動時に cloud-init を使用してカスタマイズしました。 以下の方法を学習しました。
- cloud-init 構成ファイルを作成する
- cloud-init ファイルを使用する VM を作成する
- VM の作成後に実行されている Node.js アプリを表示する
- Key Vault を使用して証明書を安全に格納する
- cloud-init を使用して NGINX のセキュリティで保護されたデプロイを自動化する
次のチュートリアルに進み、カスタムの VM イメージを作成する方法を学習してください。