次の方法で共有


cloud-init を使用した VM プロビジョニングのトラブルシューティング

注意事項

この記事では、サービス終了 (EOL) 状態の Linux ディストリビューションである CentOS について説明します。 適宜、使用と計画を検討してください。 詳細については、「CentOS のサポート終了に関するガイダンス」を参照してください。

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

cloud-init を使用してプロビジョニングを行って、一般化されたカスタム イメージを作成していたが、VM が正常に作成されなかったことがわかった場合、カスタム イメージのトラブルシューティングを行う必要があります。

プロビジョニングに関する問題の例:

  • Cloud-init は、エラー時に Compute Resource Provider API によって返される障害を報告します。
  • VM が "作成中" で 40 分間スタックし、VM の作成が失敗としてマークされる。
  • カスタム データ または ユーザー データ は処理されません。
  • エフェメラル ディスクのマウントに失敗する (SCSI リソース ディスクに付属する VM SKU の場合)。
  • ユーザーが作成されないか、ユーザー アクセスの問題がある。
  • ネットワークが正しく設定されない。
  • スワップ ファイルまたはパーティションのエラーが発生している。

この記事では、cloud-init のトラブルシューティングを行う方法について説明します。 詳細については、cloud-init の詳細に関するページを参照してください。

cloud-init によって報告され、エラーとしてログに記録されたエラーのトラブルシューティング

Cloud-init は、プロビジョニング中に Azure にエラーを報告するときに構造化エラーを出力します。 これには、エラーの調査に役立つ理由とサポート データ (タイムスタンプ、VM 識別子、ドキュメント URL など) が含まれます。

理由 説明 アクション
DHCP インターフェイスが見つからない ネットワーク インターフェイスが見つかりませんでした。 VM を削除して再作成します。 問題が解決しない場合は、ネットワーク ドライバーまたは Azure 固有のカーネルがインストールされていることを確認し、ブート診断を確認して eth0 が列挙されていることを確認します。
DHCP リースを取得できない 一時的なプラットフォームの問題により、DHCP サービスが応答しません。 VM を削除して再作成します。
プライマリ DHCP インターフェイスが見つからない プライマリ DHCP インターフェイスが見つかりませんでした。 ブート診断を確認して、プライマリ ネットワーク インターフェイスに eth0 という名前が付けられ、名前が変更されていないことを確認します。
IMDS のクエリを実行する接続タイムアウト IMDS への接続は、一時的なプラットフォームの問題、NSG、または OS ファイアウォールの構成によりタイムアウトになる可能性があります。 VM を削除して再作成します。 問題が解決しない場合は、NSG または OS ファイアウォールが IMDS へのアクセスを妨げていることを確認します。
IMDS のクエリ中の読み取りタイムアウト IMDS への接続は、一時的なプラットフォームの問題または OS ファイアウォールの構成によりタイムアウトになる可能性があります。 VM を削除して再作成します。 問題が解決しない場合は、OS ファイアウォールが IMDS へのアクセスを妨げているわけではないかどうかを検証します。
予期しないメタデータ解析 ovf-env.xml ovf-env.xmlの VM メタデータの形式が正しくありません。 cloud-init 問題トラッカーに報告します (下記参照)。
ホストのシャットダウンを待機中のエラー ホストのシャットダウン処理中にエラーが発生しました。 cloud-init 問題トラッカーに報告します (下記参照)。
azure-proxy-agent が見つかりません azure-proxy-agentバイナリがありません。 イメージに Azure プロキシ エージェントがインストールされていることを確認します。 その他のトラブルシューティングについては、 MSP のトラブルシューティング ガイドを参照してください。
azure-proxy-agent 状態の失敗 プロキシ エージェントが状態エラーを報告しました。 プロキシ エージェントのログを確認し、必要に応じて更新します。 その他のトラブルシューティングについては、 MSP のトラブルシューティング ガイドを参照してください。
ハンドルされない例外 cloud-init 内で予期しないエラーが発生しました。 cloud-init 問題トラッカーに報告します (下記参照)。

ブート診断を有効にして確認する方法については、「 ブート診断」を参照してください。

これらの問題のいずれかがプロビジョニングの後続の試行で解決しない場合は、通常、イメージの構成ミスが原因です。 cloud-init の問題があると考える理由がある場合は、 cloud-init GitHub イシュー トラッカーに報告してください。

cloud-init によって報告されないその他のエラーのトラブルシューティング

障害に応じて、次の手順を検討してください。

手順 1:customData を使用せずにデプロイをテストする

cloud-init で、渡される customData を受け取ることができるのは、VM が作成されるときです。 最初に、これによってデプロイに問題が発生していないことを確認する必要があります。 何も構成を渡さずに VM をプロビジョニングしてみてください。 VM のプロビジョニングが失敗した場合は、以下の手順に進みます。渡した構成が適用されていないことがわかったら、手順 4 に進みます。

手順 2:イメージ要件を確認する

VM のプロビジョニング エラーの主な原因は、OS イメージが Azure で実行するための前提条件を満たしていないことです。 Azure でのプロビジョニングを試行する前に、イメージが適切に準備されていることを確認します。

次の記事では、Azure でサポートされているさまざまな Linux ディストリビューションを準備する方法について説明しています。

サポートされている Azure cloud-init イメージの場合、Linux ディストリビューションでは、Azure にイメージを正しくプロビジョニングするために必要なパッケージと構成が既に用意されています。 独自にキュレートしたイメージから VM が作成できない場合は、既に cloud-init 用に構成されている、サポート対象の Azure Marketplace イメージに対して、オプションの customData を使用してみてください。 customData が Azure Marketplace イメージで正常に動作する場合は、キュレートしたイメージに問題がある可能性があります。

ステップ 3: VM ログを収集して確認する

VM がプロビジョニングできないとき、Azure では 20 分間 "作成中" の状態が表示されてから、VM を再起動します。さらに 20 分間待機した後で最終的に VM デプロイを失敗としてマークし、最後に OSProvisioningTimedOut エラーでマークします。

VM が実行されているときは、プロビジョニングが失敗した理由を理解するために、VM のログが必要になります。 VM のプロビジョニングが失敗した理由を理解するには、VM を停止しないでください。 VM を実行させたままにします。 ログを収集するために、障害が発生した VM を実行中の状態のままにしておく必要があります。 ログを収集するには、次のいずれかの方法を使用します。

sudo cat /rescue/var/log/cloud-init*
sudo cat /rescue/var/log/waagent*
sudo cat /rescue/var/log/syslog*
sudo cat /rescue/var/log/rsyslog*
sudo cat /rescue/var/log/messages*
sudo cat /rescue/var/log/kern*
sudo cat /rescue/var/log/dmesg*
sudo cat /rescue/var/log/boot*

または、Azure portalを使用して手動で復旧 VM を作成することもできます。 詳細については、「Azure portal で OS ディスクを復旧 VM に接続して Linux VM のトラブルシューティングを行う」を参照してください。

最初のトラブルシューティングを開始するには、cloud-init のログから開始し、障害が発生した場所を把握してから、他のログを詳細に使用して分析情報を提供します。

  • /var/log/cloud-init.log
  • /var/log/cloud-init-output.log
  • シリアル/ブート ログ

すべてのログで、"Failed"、"WARNING"、"WARN"、"err"、"error"、"ERROR" の検索を開始します。 大文字と小文字を区別せずに検索するように構成を設定することをお勧めします。

ヒント

カスタム イメージのトラブルシューティングを行う場合は、イメージにユーザーを追加することを検討してください。 プロビジョニングで管理者ユーザーを設定できない場合でも、OS にログインできます。

ログを分析する

ここでは、cloud-init の各ログで検索する項目をさらに詳しく説明します。

/var/log/cloud-init.log

既定では、優先度がデバッグ以上のすべての cloud-init イベントが /var/log/cloud-init.log に書き込まれます。 これによって、cloud-init 初期化中に発生したすべてのイベントの詳細なログが提供されます。

例えば次が挙げられます。

2019-10-10 04:51:25,321 - util.py[DEBUG]: Failed mount of '/dev/sr0' as 'auto': Unexpected error while running command.
Command: ['mount', '-o', 'ro,sync', '-t', 'auto', u'/dev/sr0', '/run/cloud-init/tmp/tmpLIrklc']
Exit code: 32
Reason: -
Stdout:
Stderr: mount: unknown filesystem type 'udf'
2020-01-31 00:21:53,352 - DataSourceAzure.py[WARNING]: /dev/sr0 was not mountable

エラーまたは警告が見つかったら、cloud-init 化ログを逆方向に読んで、エラーまたは警告に到達する前に cloud-init が何をしようとしたかを把握します。 多くの場合、エラーの前には cloud-init が OS コマンドを実行するか、プロビジョニング操作を実行しています。このように、エラーがログに出現した理由について分析情報が得られます。 次の例では、エラーが発生する直前に、cloud-init がデバイスをマウントしようとしました。

2019-10-10 04:51:24,010 - util.py[DEBUG]: Running command ['mount', '-o', 'ro,sync', '-t', 'auto', u'/dev/sr0', '/run/cloud-init/tmp/tmpXXXXX'] with allowed return codes [0] (shell=False, capture=True)

シリアル コンソールを利用できる場合は、cloud-init が実行しようとしたコマンドを再実行してみてください。

/var/log/cloud-init.log のログは、/etc/cloud/cloud.cfg.d/05_logging.cfg 内で再構成することもできます。 cloud-init のログについて詳しくは、cloud-init のドキュメントをご覧ください

/var/log/cloud-init-output.log

stdoutで、stderr から情報を取得できます。 通常、これには、ルーティング テーブル情報、ネットワーク情報、ssh ホスト キー検証情報、cloud-init の各ステージの stdoutstderr および各ステージのタイムスタンプが含まれます。 必要であれば、stderr および stdout のログを /etc/cloud/cloud.cfg.d/05_logging.cfg から再構成できます。

シリアル/ブート ログ

cloud-init には、複数の依存関係があります。これらは、Azure のイメージの必要な前提条件として説明されています。たとえば、ネットワーク、ストレージ、ISO のマウントの可否、一時ディスクのマウントとフォーマットの可否などです。 これらのいずれかによってエラーがスローされ、cloud-init が失敗する可能性があります。 たとえば、VM が DHCP リースを取得できない場合、cloud-init は失敗します。

引き続き、cloud-init がプロビジョニングに失敗した理由を特定できない場合は、cloud-init のどのステージで、いつモジュールが実行されたかを把握する必要があります。 詳しくは、cloud-init の詳細に関するページを参照してください。

手順 4:構成が適用されてない理由を調査する

cloud-init のすべての障害で、致命的なプロビジョニング エラーが発生するわけではありません。 たとえば、cloud-init の構成で runcmd モジュールを使用している場合、実行しているコマンドのゼロ以外の終了コードによって、VM プロビジョニングが失敗します。 これは、cloud-init の最初の 3 つのステージで行われるコア プロビジョニング機能の後に実行されるためです。 構成が適用されなかった理由をトラブルシューティングするには、手順 3 のログと cloud-init モジュールを手動で確認します。 例えば次が挙げられます。

  • runcmd - スクリプトはエラーなしで実行されますか。 ターミナルから手動で構成を実行し、想定どおりに動作することを確認します。
  • パッケージのインストール - VM はパッケージ リポジトリにアクセスできますか。
  • VM に提供された customData データ構成もチェックする必要があります。これは /var/lib/cloud/instances/<unique-instance-identifier>/user-data.txt にあります。

次のステップ

それでも、cloud-init で構成が実行されなかった理由を特定できない場合は、cloud-init の各ステージで何が行われたか、およびモジュールがいつ実行されたかを詳しく調べる必要があります。 詳しくは、cloud-init 構成の詳細に関するページを参照してください。