チュートリアル - Azure での Linux 仮想マシンの初回の起動時に cloud-init を使用してカスタマイズする方法Tutorial - How to use cloud-init to customize a Linux virtual machine in Azure on first boot

前のチュートリアルでは、仮想マシン (VM) に SSH 接続して NGINX を手動でインストールする方法について説明しました。In a previous tutorial, you learned how to SSH to a virtual machine (VM) and manually install NGINX. VM を迅速かつ一貫した方法で作成するには、一般的に、何らかの形で自動化することが必要です。To create VMs in a quick and consistent manner, some form of automation is typically desired. VM を初回起動時にカスタマイズする一般的なアプローチには、cloud-init を使用する方法があります。A common approach to customize a VM on first boot is to use cloud-init. このチュートリアルで学習する内容は次のとおりです。In this tutorial you learn how to:

  • cloud-init 構成ファイルを作成するCreate a cloud-init config file
  • cloud-init ファイルを使用する VM を作成するCreate a VM that uses a cloud-init file
  • VM の作成後に実行されている Node.js アプリを表示するView a running Node.js app after the VM is created
  • Key Vault を使用して証明書を安全に格納するUse Key Vault to securely store certificates
  • cloud-init を使用して NGINX のセキュリティで保護されたデプロイを自動化するAutomate secure deployments of NGINX with cloud-init

CLI をローカルにインストールして使用する場合、このチュートリアルでは、Azure CLI バージョン 2.0.30 以降を実行していることが要件です。If you choose to install and use the CLI locally, this tutorial requires that you are running the Azure CLI version 2.0.30 or later. バージョンを確認するには、az --version を実行します。Run az --version to find the version. インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。If you need to install or upgrade, see Install Azure CLI.

cloud-init の概要Cloud-init overview

cloud-Init は、Linux VM を初回起動時にカスタマイズするために広く使用されているアプローチです。Cloud-init is a widely used approach to customize a Linux VM as it boots for the first time. cloud-init を使って、パッケージをインストールしてファイルを書き込んだり、ユーザーとセキュリティを構成したりすることができます。You can use cloud-init to install packages and write files, or to configure users and security. 初回起動処理中に cloud-init が実行されるので、構成を適用するために追加の手順や必要なエージェントはありません。As cloud-init runs during the initial boot process, there are no additional steps or required agents to apply your configuration.

cloud-init はディストリビューション全体でも有効です。Cloud-init also works across distributions. たとえば、パッケージをインストールするときに apt-get installyum install は使用しません。For example, you don't use apt-get install or yum install to install a package. 代わりに、cloud-init ではインストールするパッケージの一覧をユーザーが定義できます。Instead you can define a list of packages to install. cloud-init によって、選択したディストリビューションに対してネイティブのパッケージ管理ツールが自動的に使用されます。Cloud-init automatically uses the native package management tool for the distro you select.

Microsoft ではパートナーと協力して、パートナーから Azure に提供されたイメージに cloud-init を含めて、使用できるようにしています。We are working with our partners to get cloud-init included and working in the images that they provide to Azure. 次の表は、Azure プラットフォーム イメージでの最新の cloud-init の可用性の概要を示しています。The following table outlines the current cloud-init availability on Azure platform images:

PublisherPublisher プランOffer SKUSKU VersionVersion cloud-init 対応cloud-init ready
CanonicalCanonical UbuntuServerUbuntuServer 18.04-LTS18.04-LTS latestlatest はいyes
CanonicalCanonical UbuntuServerUbuntuServer 16.04 LTS16.04-LTS latestlatest はいyes
CanonicalCanonical UbuntuServerUbuntuServer 14.04.5-LTS14.04.5-LTS latestlatest はいyes
CoreOSCoreOS CoreOSCoreOS 安定版Stable latestlatest はいyes
OpenLogic 7.6OpenLogic 7.6 CentOSCentOS 7-CI7-CI latestlatest previewpreview
RedHat 7.6RedHat 7.6 RHELRHEL 7-RAW-CI7-RAW-CI 7.6.20190724187.6.2019072418 はいyes
RedHat 7.7RedHat 7.7 RHELRHEL 7-RAW-CI7-RAW-CI 7.7.20190816017.7.2019081601 previewpreview

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

cloud-init が動作していることを確認するには、NGINX をインストールして単純な "Hello World" Node.js アプリを実行する VM を作成します。To see cloud-init in action, create a VM that installs NGINX and runs a simple 'Hello World' Node.js app. 次の cloud-init 構成によって、必要なパッケージのインストール、Node.js アプリの作成、アプリの初期化と起動が行われます。The following cloud-init configuration installs the required packages, creates a Node.js app, then initialize and starts the app.

Bash プロンプトまたは Cloud Shell で、cloud-init.txt という名前のファイルを作成し、次の構成を貼り付けます。At your bash prompt or in the Cloud Shell, create a file named cloud-init.txt and paste the following configuration. たとえば、「sensible-editor cloud-init.txt」と入力し、ファイルを作成して使用可能なエディターの一覧を確認します。For example, type sensible-editor cloud-init.txt to create the file and see a list of available editors. cloud-init ファイル全体 (特に最初の行) が正しくコピーされたことを確認してください。Make sure that the whole cloud-init file is copied correctly, especially the first line:

#cloud-config
package_upgrade: true
packages:
  - nginx
  - nodejs
  - npm
write_files:
  - owner: www-data:www-data
    path: /etc/nginx/sites-available/default
    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
    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 の構成例に関するページを参照してください。For more information about cloud-init configuration options, see cloud-init config examples.

仮想マシンの作成Create virtual machine

VM を作成する前に、az group create を使用してリソース グループを作成します。Before you can create a VM, create a resource group with az group create. 次の例では、myResourceGroupAutomate という名前のリソース グループを場所 eastus に作成します。The following example creates a resource group named myResourceGroupAutomate in the eastus location:

az group create --name myResourceGroupAutomate --location eastus

ここで az vm create を使用して VM を作成します。Now create a VM with az vm create. --custom-data パラメーターを使用して、cloud-init 構成ファイルを渡します。Use the --custom-data parameter to pass in your cloud-init config file. 現在の作業ディレクトリの外部に構成ファイル cloud-init.txt を保存していた場合には、このファイルの完全パスを指定します。Provide the full path to the cloud-init.txt config if you saved the file outside of your present working directory. 次の例では、myVM という名前の VM を作成します。The following example creates a VM named myVM:

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

VM が作成され、パッケージがインストールされて、アプリが開始されるには、数分かかります。It takes a few minutes for the VM to be created, the packages to install, and the app to start. Azure CLI がプロンプトに戻った後にも引き続き実行するバック グラウンド タスクがあります。There are background tasks that continue to run after the Azure CLI returns you to the prompt. アプリにアクセスできるようになるには、さらに数分かかる場合があります。It may be another couple of minutes before you can access the app. VM が作成されたら、Azure CLI によって表示される publicIpAddress をメモしてください。When the VM has been created, take note of the publicIpAddress displayed by the Azure CLI. このアドレスは、Web ブラウザーから Node.js アプリにアクセスするために使用します。This address is used to access the Node.js app via a web browser.

Web トラフィックが VM にアクセスできるようにするには、az vm open-port を使用してインターネットからポート 80 を開きます。To allow web traffic to reach your VM, open port 80 from the Internet with az vm open-port:

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

Web アプリのテストTest web app

Web ブラウザーを開き、アドレス バーに「http://<publicIpAddress> 」と入力できるようになりました。Now you can open a web browser and enter http://<publicIpAddress> in the address bar. VM 作成処理で取得した独自のパブリック IP アドレスを指定します。Provide your own public IP address from the VM create process. Node.js アプリは次の例のように表示されます。Your Node.js app is displayed as shown in the following example:

実行中の NGINX サイトの表示

Key Vault の証明書の挿入Inject certificates from Key Vault

省略可能なこのセクションでは、証明書を Azure Key Vault に安全に格納し、VM のデプロイ時に挿入する方法を説明します。This optional section shows how you can securely store certificates in Azure Key Vault and inject them during the VM deployment. 組み込みの証明書を含むカスタム イメージを使用するのではなく、この処理を使用することによって、初回起動時に最新の証明書が VM に挿入されます。Rather than using a custom image that includes the certificates baked-in, this process ensures that the most up-to-date certificates are injected to a VM on first boot. 処理の際に、証明書が Azure プラットフォームから流出したり、スクリプト、コマンドラインの履歴、またはテンプレートで公開されたりすることはありません。During the process, the certificate never leaves the Azure platform or is exposed in a script, command-line history, or template.

Azure Key Vault では、証明書やパスワードなどの暗号化キーと秘密が保護されます。Azure Key Vault safeguards cryptographic keys and secrets, such as certificates or passwords. Key Vault は、キー管理プロセスを合理化し、データにアクセスして暗号化するキーの制御を維持するのに役立ちます。Key Vault helps streamline the key management process and enables you to maintain control of keys that access and encrypt your data. このシナリオでは、証明書を作成して使用するための Key Vault の概念をいくつか紹介します。ただし、これは Key Vault の使用方法に関する網羅的な概要ではありません。This scenario introduces some Key Vault concepts to create and use a certificate, though is not an exhaustive overview on how to use Key Vault.

以下の手順では、次の操作方法を説明します。The following steps show how you can:

  • Azure Key Vault を作成するCreate an Azure Key Vault
  • 証明書を生成したり、Key Vault にアップロードしたりするGenerate or upload a certificate to the Key Vault
  • 証明書からシークレットを作成して VM に挿入するCreate a secret from the certificate to inject in to a VM
  • VM を作成して証明書を挿入するCreate a VM and inject the certificate

Azure Key Vault を作成するCreate an Azure Key Vault

最初に、az keyvault create を使用して Key Vault を作成し、VM をデプロイするときに使用できるようにします。First, create a Key Vault with az keyvault create and enable it for use when you deploy a VM. 各 Key Vault には一意の名前が必要であり、その名前はすべて小文字にする必要があります。Each Key Vault requires a unique name, and should be all lower case. 次の例の mykeyvault は一意の Key Vault 名で置き換えてください。Replace mykeyvault in the following example with your own unique Key Vault name:

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

証明書を生成して Key Vault に格納するGenerate certificate and store in Key Vault

実際の運用では、az keyvault certificate import を使用して、信頼できるプロバイダーによって署名された有効な証明書をインポートする必要があります。For production use, you should import a valid certificate signed by trusted provider with az keyvault certificate import. このチュートリアルでは、az keyvault certificate create で、既定の証明書ポリシーを使用する自己署名証明書を生成する方法を次の例に示します。For this tutorial, the following example shows how you can generate a self-signed certificate with az keyvault certificate create that uses the default certificate policy:

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

VM で使用する証明書を準備するPrepare certificate for use with VM

VM の作成処理の際に証明書を使用するには、az keyvault secret list-versions を使用して証明書の ID を取得します。To use the certificate during the VM create process, obtain the ID of your certificate with az keyvault secret list-versions. VM は、ブート時に挿入するための特定の形式の証明書を必要とするため、az vm secret format を使って証明書を変換します。The VM needs the certificate in a certain format to inject it on boot, so convert the certificate with az vm secret format. 次の例では、以降の手順で使用しやすくするために、コマンドの出力を変数に割り当てています。The following example assigns the output of these commands to variables for ease of use in the next steps:

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 をセキュリティで保護する cloud-init 構成を作成するCreate cloud-init config to secure NGINX

VM を作成するとき、証明書とキーは、保護された /var/lib/waagent/ ディレクトリに格納されます。When you create a VM, certificates and keys are stored in the protected /var/lib/waagent/ directory. VM への証明書の追加と NGINX の構成を自動化するために、前の例の更新された cloud-init 構成を使用できます。To automate adding the certificate to the VM and configuring NGINX, you can use an updated cloud-init config from the previous example.

cloud-init-secured.txt というファイルを作成し、次の構成を貼り付けます。Create a file named cloud-init-secured.txt and paste the following configuration. Cloud Shell を使用する場合は、ローカル コンピューター上ではなく、その場所に cloud-init 構成ファイルを作成します。If you use the Cloud Shell, create the cloud-init config file there and not on your local machine. たとえば、「sensible-editor cloud-init-secured.txt」と入力し、ファイルを作成して使用可能なエディターの一覧を確認します。For example, type sensible-editor cloud-init-secured.txt to create the file and see a list of available editors. cloud-init ファイル全体 (特に最初の行) が正しくコピーされたことを確認してください。Make sure that the whole cloud-init file is copied correctly, especially the first line:

#cloud-config
package_upgrade: true
packages:
  - nginx
  - nodejs
  - npm
write_files:
  - owner: www-data:www-data
    path: /etc/nginx/sites-available/default
    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
    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

セキュリティで保護された VM を作成するCreate secure VM

ここで az vm create を使用して VM を作成します。Now create a VM with az vm create. 証明書のデータは、--secrets パラメーターを使用して Key Vault から挿入されます。The certificate data is injected from Key Vault with the --secrets parameter. 前の例のように、--custom-data パラメーターを使用して cloud-init 構成も渡します。As in the previous example, you also pass in the cloud-init config with the --custom-data parameter:

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

VM が作成され、パッケージがインストールされて、アプリが開始されるには、数分かかります。It takes a few minutes for the VM to be created, the packages to install, and the app to start. Azure CLI がプロンプトに戻った後にも引き続き実行するバック グラウンド タスクがあります。There are background tasks that continue to run after the Azure CLI returns you to the prompt. アプリにアクセスできるようになるには、さらに数分かかる場合があります。It may be another couple of minutes before you can access the app. VM が作成されたら、Azure CLI によって表示される publicIpAddress をメモしてください。When the VM has been created, take note of the publicIpAddress displayed by the Azure CLI. このアドレスは、Web ブラウザーから Node.js アプリにアクセスするために使用します。This address is used to access the Node.js app via a web browser.

セキュリティで保護された Web トラフィックが VM にアクセスできるようにするには、az vm open-port を使用してインターネットからポート 443 を開きます。To allow secure web traffic to reach your VM, open port 443 from the Internet with az vm open-port:

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

セキュリティで保護された Web アプリをテストするTest secure web app

Web ブラウザーを開き、アドレス バーに「https://<publicIpAddress> 」と入力できるようになりました。Now you can open a web browser and enter https://<publicIpAddress> in the address bar. 前の VM 作成プロセスの出力で示されているように、独自のパブリック IP アドレスを提供します。Provide your own public IP address as shown in the output of the previous VM create process. 自己署名証明書を使用した場合は、セキュリティ警告を受け入れます。Accept the security warning if you used a self-signed certificate:

Web ブラウザーのセキュリティ警告を受け入れる

セキュリティで保護された NGINX サイトと Node.js アプリは、次の例のように表示されます。Your secured NGINX site and Node.js app is then displayed as in the following example:

セキュリティで保護された実行中の NGINX サイトの表示

次の手順Next steps

このチュートリアルでは、VM の初回の起動時に cloud-init を使用してカスタマイズしました。In this tutorial, you configured VMs on first boot with cloud-init. 以下の方法について学習しました。You learned how to:

  • cloud-init 構成ファイルを作成するCreate a cloud-init config file
  • cloud-init ファイルを使用する VM を作成するCreate a VM that uses a cloud-init file
  • VM の作成後に実行されている Node.js アプリを表示するView a running Node.js app after the VM is created
  • Key Vault を使用して証明書を安全に格納するUse Key Vault to securely store certificates
  • cloud-init を使用して NGINX のセキュリティで保護されたデプロイを自動化するAutomate secure deployments of NGINX with cloud-init

次のチュートリアルに進み、カスタムの VM イメージを作成する方法を学習してください。Advance to the next tutorial to learn how to create custom VM images.