Linux 用の仮想マシンの拡張機能とその機能

Azure 仮想マシン (VM) 拡張機能は、Azure VM でのデプロイ後の構成と自動タスクを提供する複数の小さなアプリケーションです。 たとえば、仮想マシンでソフトウェアのインストール、ウイルス対策保護、または仮想マシン内でスクリプトを実行する機能が必要な場合は、VM 拡張機能を使用できます。

Azure VM 拡張機能は、Azure CLI、PowerShell、Azure Resource Manager テンプレート (ARM テンプレート)、Azure portal を使って実行できます。 拡張機能は、新しい VM のデプロイにバンドルするか、既存の任意のシステムに対して実行することができます。

この記事では、Azure VM 拡張機能の概要と使う場合の前提条件を示し、それらを検出、管理、および削除する方法についてのガイダンスを提供します。 使用できる VM の拡張機能は数多くあるため、この記事では一般的な情報について説明します。 それぞれに固有の構成があり、独自のドキュメントがあります。

ユース ケースとサンプル

各 Azure VM 拡張機能には、特定のユース ケースがあります。 以下に例を示します。

プロセス固有の拡張機能のほか、カスタム スクリプト拡張機能を Windows と Linux の両方の仮想マシンで使用できます。 Linux 用カスタム スクリプト拡張機能では、VM で実行する任意の Bash スクリプトを使用できます。 カスタム スクリプトは、ネイティブの Azure ツールが提供可能な構成以上の構成を必要とする Azure のデプロイを設計する場合に役立ちます。

前提条件

Azure Linux エージェント

VM 上で拡張機能を処理するには、Azure Linux エージェントをインストールしておく必要があります。 一部の個々の拡張機能には、リソースまたは依存関係へのアクセスなどの前提条件があります。

Azure Linux エージェントは、Azure VM と Azure ファブリック コントローラーとの相互動作を管理します。 エージェントは、Azure VM のデプロイと管理の多くの機能面を担当します (VM 拡張機能の実行など)。

Azure Linux エージェントは、Azure Marketplace イメージにプレインストールされています。 また、サポートされているオペレーティング システムに手動でインストールすることもできます。

エージェントは、複数のオペレーティング システム上で動作します。 ただし、拡張機能フレームワークでは、拡張機能が使うオペレーティング システムに制限があります。 一部の拡張機能は、すべてのオペレーティング システムではサポートされず、エラー コード 51 ("OS がサポートされていません") が出力される場合があります。 サポートの可否については、個々の拡張機能のドキュメントを確認してください。

ネットワーク アクセス

拡張機能パッケージは、Azure Storage 拡張機能リポジトリからダウンロードされます。 拡張機能状態のアップロードは、Azure Storage に投稿されます。

サポートされているバージョンの Azure Linux エージェントを使っている場合は、VM のリージョンで Azure Storage へのアクセスを許可する必要はありません。 エージェントを使うと、エージェントの通信の場合に Azure ファブリック コントローラーに通信をリダイレクトすることができます。 サポートされていないバージョンのエージェントを使う場合は、そのリージョン内の Azure Storage への VM からの送信アクセスを許可する必要があります。

重要

ゲスト ファイアウォールを使ってプライベート IP アドレス 168.63.129.16 へのアクセスをブロックした場合、サポートされているバージョンのエージェントを使っている場合または送信アクセスを構成した場合でも、拡張機能は失敗します。

エージェントは、拡張機能パッケージおよびレポート ステータスをダウンロードするためだけに使用できます。 たとえば、拡張機能のインストール時に GitHub からスクリプトをダウンロードする必要がある場合 (カスタム スクリプト拡張機能)、または Azure Storage へのアクセスが必要な場合 (Azure Backup) は、追加のファイアウォールまたはネットワーク セキュリティ グループ (NSG) ポートを開く必要があります。 拡張機能はそれぞれ、独自のアプリケーションになっているため、要件も異なります。 たとえば、Azure Storage へのアクセスが必要な拡張機能の場合、Azure NSG サービス タグを使ってアクセスを許可できます。

エージェントのトラフィック要求をリダイレクトするために、Azure Linux エージェントはプロキシ サーバーのサポートを備えています。 ただし、このプロキシ サーバーのサポートは拡張機能には適用されません。 プロキシを使用するには、個々の拡張機能を構成する必要があります。

VM 拡張機能の検出

Azure VM に使用できる VM 拡張機能は多数あります。 完全な一覧を確認するには、az vm extension image list を使用します。 次の例では、westus の場所で利用できるすべての拡張機能が表示されています:

az vm extension image list --location westus --output table

VM 拡張機能の実行

Azure VM 拡張機能は、既存の VM 上で動作します。 これは、既にデプロイされている VM 上で構成を変更したり、接続を復旧したりする必要がある場合に便利です。 VM 拡張機能は、ARM テンプレートのデプロイにバンドルすることもできます。 拡張機能を ARM テンプレートと共に使うことで、デプロイ後の操作なしで Azure VM をデプロイおよび構成することができます。

既存の VM に対して拡張機能を実行するには、次の方法を使用できます。

Azure CLI

az vm extension set コマンドを使って、既存の VM に対して Azure VM 拡張機能を実行できます。 次の例では、myResourceGroup という名前のリソース グループ内の myVM という名前の VM に対して Custom Script 拡張機能を実行します。 例のリソース グループ名、VM 名、および実行するスクリプト (https://raw.githubusercontent.com/me/project/hello.sh) を実際の情報に置き換えます。

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM \
  --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --settings '{"fileUris": ["https://raw.githubusercontent.com/me/project/hello.sh"],"commandToExecute": "./hello.sh"}'

拡張機能が正しく実行されると、出力は次の例のようになります:

info:    Executing command vm extension set
+ Looking up the VM "myVM"
+ Installing extension "CustomScript", VM: "mvVM"
info:    vm extension set command OK

Azure PowerShell

Set-AzVMExtension コマンドを使用して、既存の VM に対して Azure VM 拡張機能を実行できます。 次の例では、myResourceGroup という名前のリソース グループ内の myVM という名前の VM に対して Custom Script 拡張機能を実行します。 例のリソース グループ名、VM 名、および実行するスクリプト (https://raw.githubusercontent.com/me/project/hello.sh) を実際の情報に置き換えます。

$Params = @{
    ResourceGroupName  = 'myResourceGroup'
    VMName             = 'myVM'
    Name               = 'CustomScript'
    Publisher          = 'Microsoft.Azure.Extensions'
    ExtensionType      = 'CustomScript'
    TypeHandlerVersion = '2.1'
    Settings          = @{fileUris = @('https://raw.githubusercontent.com/me/project/hello.sh'); commandToExecute = './hello.sh'}
}
Set-AzVMExtension @Params

拡張機能が正しく実行されると、出力は次の例のようになります:

RequestId IsSuccessStatusCode StatusCode ReasonPhrase
--------- ------------------- ---------- ------------
                         True         OK OK

Azure portal

VM 拡張機能は、Azure portal から既存の VM に適用できます。 ポータルで VM を選び、[拡張機能] を選び、[追加] を選びます。 利用可能な拡張機能の一覧から目的の拡張機能を選び、ウィザードの手順に従います。

次の図は、Azure portal からの Linux 用カスタム スクリプト拡張機能のインストールを示しています。

Screenshot of the dialog for installing the Custom Script extension for Linux.

Azure Resource Manager のテンプレート

ARM テンプレートに VM 拡張機能を追加して、テンプレートのデプロイと共に実行することができます。 テンプレートを使用して拡張機能をデプロイする場合は、完全に構成された Azure デプロイを作成できます。

たとえば、次の JSON は、負荷分散された一連の VM と Azure SQL データベースをデプロイした後、各 VM に .NET Core アプリケーションをインストールする完全な ARM テンプレートからの抜粋です。 VM 拡張機能はソフトウェアのインストールに対応します。

{
    "apiVersion": "2015-06-15",
    "type": "extensions",
    "name": "config-app",
    "location": "[resourceGroup().location]",
    "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
    ],
    "tags": {
    "displayName": "config-app"
    },
    "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
        ]
    },
    "protectedSettings": {
        "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
    }
}

ARM テンプレートの作成の詳細については、「Azure Resource Manager テンプレートの仮想マシン」を参照してください。

VM 拡張機能データをセキュリティで保護する

VM 拡張機能の実行時には、資格情報、ストレージ アカウント名、アクセス キーなどの機密情報を含めなければならない場合があります。 多くの VM 拡張機能には、データを暗号化し、ターゲットの VM 内でのみ暗号化を解除する保護された構成が含まれます。 拡張機能には、それぞれ固有の保護された構成スキーマがあります。スキーマについては、拡張機能のドキュメントで詳しく説明されています。

次の例は、Linux 用カスタム スクリプト拡張機能のインスタンスを示しています。 実行するコマンドには、一連の資格情報が含まれています。 この例では、実行するコマンドは暗号化されません。

{
  "apiVersion": "2015-06-15",
  "type": "extensions",
  "name": "config-app",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
      ],
      "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
  }
}

commandToExecute プロパティを protected 構成に移動することで、次の例のように実行文字列をセキュリティで保護できます。

{
  "apiVersion": "2015-06-15",
  "type": "extensions",
  "name": "config-app",
  "location": "[resourceGroup().location]",
  "dependsOn": [
    "[concat('Microsoft.Compute/virtualMachines/', concat(variables('vmName'),copyindex()))]"
  ],
  "tags": {
    "displayName": "config-app"
  },
  "properties": {
    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
      ]
    },
    "protectedSettings": {
      "commandToExecute": "[concat('sudo sh config-music.sh ',variables('musicStoreSqlName'), ' ', parameters('adminUsername'), ' ', parameters('sqlAdminPassword'))]"
    }
  }
}

エージェントと拡張機能の更新方法

エージェントと拡張機能は、同じ自動更新メカニズムを共有します。

更新プログラムが使用可能で自動更新が有効になっている場合、拡張機能に変更が加えた後、または他の VM モデルが次のように変更された後にのみ、更新プログラムが VM にインストールされます。

  • データ ディスク
  • 拡張機能
  • 拡張機能タグ
  • ブート診断コンテナー
  • ゲスト OS のシークレット
  • VM サイズ
  • ネットワーク プロファイル

別のリージョンの VM は異なるバージョン上に搭載できるので、パブリッシャーは別のタイミングで、更新プログラムをリージョンで使用できるようにします。

Note

一部の更新プログラムでは、追加のファイアウォール規則を必要とする可能性があります。 「ネットワーク アクセス」を参照してください。

エージェントの更新プログラム

Linux VM エージェントには、1 つのパッケージに "プロビジョニング エージェント コード" と "拡張機能処理コード" が含まれています。 これらは分離できません。

Azure 上で cloud-init を使ってプロビジョニングする場合、プロビジョニング エージェントを無効にすることができます。

エージェントのサポートされているバージョンでは自動更新を使用できます。 更新できる唯一のコードは、プロビジョニング エージェント コードではなく、拡張機能処理コードです。 プロビジョニング エージェント コードは一度だけ実行されるコードです。

拡張機能処理コードは、次の処理を担当します。

  • Azure ファブリックとの通信。
  • インストール、状態の報告、個々の拡張機能の更新、拡張機能の削除など、VM 拡張機能操作の処理。 更新プログラムには、拡張機能処理コードに対するセキュリティ修正プログラム、バグ修正プログラム、拡張機能が含まれます。

エージェントがインストールされると、親デーモンが作成されます。 次に、この親によって、拡張機能の処理に使われる子プロセスが生成されます。 エージェントの更新プログラムを使用できる場合は、ダウンロードされます。 親によって子プロセスの停止、アップグレード、再起動が行われます。 更新プログラムに問題がある場合、親プロセスによって前の子のバージョンにロール バックされます。

親プロセスを自動的に更新することはできません。 親を更新するには、ディストリビューション パッケージの更新が必要です。

実行中のバージョンを確認するには、次のように waagent を確認します。

waagent --version

出力は次の例のようになります。

WALinuxAgent-2.2.45 running on <Linux Distro>
Python: 3.6.9
Goal state agent: 2.7.1.0

上記の出力例で、親 (つまりパッケージのデプロイ済みバージョン) は WALinuxAgent-2.2.45 です Goal state agent 値は自動更新バージョンです。

AutoUpdate.Enabled=y のように、エージェントの自動更新を常に有効にすることを強くお勧めします。 自動更新を有効にしないと、エージェントを手動で更新し続ける必要があり、バグとセキュリティの修正プログラムを取得できません。

拡張機能の更新プログラム

拡張機能の更新プログラムが使用可能で自動更新が有効になっている場合、VM モデルの変更が発生すると、Azure Linux エージェントによって拡張機能がダウンロードされ、アップグレードされます。

拡張機能の自動更新プログラムは、"マイナー" または "修正プログラム" のどちらかです。 マイナー更新プログラムは、拡張機能をプロビジョニングするときに、オプトインまたはオプトアウトできます。 次の例は、ARM テンプレートで "autoUpgradeMinorVersion": true, を使ってマイナー バージョンを自動的にアップグレードする方法を示しています。

    "publisher": "Microsoft.Azure.Extensions",
    "type": "CustomScript",
    "typeHandlerVersion": "2.1",
    "autoUpgradeMinorVersion": true,
    "settings": {
        "fileUris": [
        "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-linux/scripts/config-music.sh"
        ]
    },

最新のマイナー リリースのバグ修正プログラムを取得するには、拡張機能のデプロイで常に自動更新を選ぶことを強くお勧めします。 セキュリティや重要なバグの修正を含む修正プログラムをオプトアウトすることはできません。

自動更新を無効にした場合、またはメジャー バージョンをアップグレードする必要がある場合、az vm extension set または Set-AzVMExtension を使用し、ターゲット バージョンを指定します。

拡張機能の更新プログラムを識別する方法

拡張機能が autoUpgradeMinorVersion を使って VM 上に設定されているかどうかを識別する

拡張機能が autoUpgradeMinorVersion を使ってプロビジョニングされたかどうかは、VM モデルから判断できます。 確認するには、az vm show を使用して、次のようにリソース グループと VM の名前を指定します:

az vm show --resource-group myResourceGroup --name myVM

autoUpgradeMinorVersiontrue に設定されている出力例を次に示します。

  "resources": [
    {
      "autoUpgradeMinorVersion": true,
      "forceUpdateTag": null,
      "id": "/subscriptions/guid/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM/extensions/customScript",

autoUpgradeMinorVersion イベントが発生した時間を特定する

拡張機能への更新がいつ行われたかを判断するには、 /var/log/waagent.log で VM 上のエージェント ログを確認します。

次の例では、VM に Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025 がインストールされています。 修正プログラムは Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027 に対して使用できました。

INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Expected handler state: enabled
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Decide which version to use
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Use version: 2.3.9027
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Current handler state is: NotInstalled
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Download extension package
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Unpack extension package
INFO Event: name=Microsoft.OSTCExtensions.LinuxDiagnostic, op=Download, message=Download succeeded
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Initialize extension directory
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Update settings file: 0.settings
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025] Disable extension.
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9025] Launch command:diagnostic.py -disable
...
INFO Event: name=Microsoft.OSTCExtensions.LinuxDiagnostic, op=Disable, message=Launch command succeeded: diagnostic.py -disable
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Update extension.
INFO [Microsoft.OSTCExtensions.LinuxDiagnostic-2.3.9027] Launch command:diagnostic.py -update
2017/08/14 20:21:57 LinuxAzureDiagnostic started to handle.

エージェントのアクセス許可

タスクを実行するには、エージェントが root として実行される必要があります。

VM 拡張機能のトラブルシューティング

各 VM 拡張機能には、固有のトラブルシューティング手順が存在する場合があります。 たとえば、カスタム スクリプト拡張機能を使う場合、スクリプト実行の詳細は、拡張機能が実行された VM のローカルに保存されます。

次のトラブルシューティング アクションは、すべての VM 張機能に適用されます。

  • Azure Linux エージェント ログをチェックするには、/var/log/waagent.log で拡張機能がプロビジョニングされたときのアクティビティを確認します。

  • /var/log/azure/<extensionName> で拡張機能のログをさらに詳しくチェックします。

  • エラー コード、既知の問題、その他の拡張機能固有の情報については、拡張機能固有のドキュメントのトラブルシューティングのセクションを参照してください。

  • システム ログを確認します。 排他的なパッケージ マネージャーへのアクセスを必要とする別のアプリケーションのインストールが長時間実行されている場合など、拡張機能に干渉する可能性のある他の操作をチェックします。

拡張機能のエラーの一般的な理由

  • 拡張機能の実行には 20 分かかります (例外は、90 分かかるカスタム スクリプトと Chef です)。デプロイにかかる時間がこれを超過する場合、タイムアウトとマークされます。 この原因としては、VM のリソースが少ない場合や、拡張機能がプロビジョニングを試行している間に他の VM の構成や起動タスクによって大量のリソースが消費されている場合が考えられます。

  • 最小限の前提条件が満たされていません。 一部の拡張機能では、HPC イメージなど、VM SKU 上に依存関係があります。 拡張機能は、Azure Storage やパブリック サービスとの通信など、特定のネットワーク アクセス要件を必要とする場合があります。 その他の例としては、パッケージ リポジトリへのアクセス、ディスク領域の不足、セキュリティ上の制限事項が考えられます。

  • パッケージ マネージャーのアクセスが排他的です。 場合によっては、長時間にわたる VM 構成の実行が拡張機能のインストールと競合し、どちらもパッケージ マネージャーへの排他的なアクセスを必要とする状況になることがあります。

拡張機能の状態表示

VM 拡張機能が VM に対して実行された後は、次のように、拡張機能のステータスを返す az vm get-instance-view を使用します:

az vm get-instance-view \
    --resource-group myResourceGroup \
    --name myVM \
    --query "instanceView.extensions"

出力は次の例のようになります。

  {
    "name": "customScript",
    "statuses": [
      {
        "code": "ProvisioningState/failed/0",
        "displayStatus": "Provisioning failed",
        "level": "Error",
        "message": "Enable failed: failed to execute command: command terminated with exit status=127\n[stdout]\n\n[stderr]\n/bin/sh: 1: ech: not found\n",
        "time": null
      }
    ],
    "substatuses": null,
    "type": "Microsoft.Azure.Extensions.CustomScript",
    "typeHandlerVersion": "2.1.6"
  }

拡張機能の実行の状態は、Azure portal で確認することもできます。 VM を選び、[拡張機能] を選び、目的の拡張機能を選びます。

VM 拡張機能の再実行

VM 拡張機能の再実行が必要な場合があります。 拡張機能を再実行するには、その拡張機能を削除し、その後任意の実行方法で拡張機能を再実行します。

拡張機能を削除するには、次のように az vm extension delete を使用します:

az vm extension delete \
    --resource-group myResourceGroup \
    --vm-name myVM \
    --name customScript

また、Azure portal で拡張機能を削除することもできます。

  1. VM を選択します。
  2. [拡張機能] を選択します。
  3. 拡張機能を選びます。
  4. [アンインストール] を選択します。

一般的な VM 拡張機能のリファレンス

拡張機能の名前 説明
Linux 用カスタム スクリプト拡張機能 Azure 仮想マシンに対してスクリプトを実行します。
VMAccess 拡張機能 Azure 仮想マシンへのアクセスを回復します。 また、ユーザーと資格情報の管理にも使用できます。
Azure Diagnostics 拡張機能 Azure Diagnostics を管理します

次のステップ

VM 拡張機能の詳細については、「Azure 仮想マシンの拡張機能とその機能」を参照してください。