Azure Databricks でのクラスター起動が Instances Unreachable エラーで失敗する際のトラブルシューティング

## はじめに

Azure Databricks でクラスターの起動に失敗するケースがいくつかありますが、今回は下記 Instances Unreachable エラーが出力される場合のトラブルシューティングに焦点を絞ります。基本的には**クラスター ノードからコントロール プレーンに接続できない**際に発生するエラーです。

```console:English
Cluster terminated. Reason: Instances Unreachable
An unexpected error was encountered while setting up the cluster. Please retry and contact Azure Databricks if the problem persists.
Internal error message: Timeout while placing node
```

```console:日本語
クラスターが終了しました。 理由： 予期しない起動エラー
クラスターのセットアップ中に予期しないエラーが発生しました。もう一度試してもエラーが続く場合はDatabricksにお問い合わせください。
内部エラーメッセージ: Timeout while placing nodes.
```

## トラブルシューティング

### 1. クラスター名の確認

クラスター名に**日本語 (マルチバイト文字)** が含まれているとクラスター作成時にエラーが発生します。
Azure Databricks でクラスターを作成するとき、デフォルトでは`<ユーザー名>'s Cluster`なので、ユーザー名が日本語の場合は注意する必要があります。

### 2. ネットワーク構成の確認

Databricks で **[VNet Injection](https://learn.microsoft.com/ja-jp/azure/databricks/administration-guide/cloud-configurations/azure/vnet-inject)** を設定すると、クラスター ノードからコントロール プレーンへの接続方式に様々な選択肢があります。4 つの接続方式例でのトラブルシューティングについて説明していきます。

#### 例 2-1. 強制トンネリングをオンプレミス環境を経由する場合

強制トンネリングでオンプレミス環境を経由する場合は主に以下を確認する必要があります。
* オンプレミス環境からインターネットに接続する際のアウトバウンドに [公式ページ](https://learn.microsoft.com/ja-jp/azure/databricks/administration-guide/cloud-configurations/azure/udr)に記載されたルールが許可されているか
* ワークスペースのパブリック アクセス設定が有効かどうか

強制トンネリングで Hub VNet を経由する場合も同様となります。下図はオンプレミス環境を経由する際の構成例です。

![databricks-17.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/e947e018-eb2e-c623-d513-73cd89dd3036.png)

#### 例 2-2. Azure Firewall を経由する場合

Azure Firewall を経由する場合は主に以下を確認する必要があります。
* [公式ページ](https://learn.microsoft.com/ja-jp/azure/databricks/administration-guide/cloud-configurations/azure/udr)に従い適切なルールが Azure Firewall で許可されているか
* クラスター ノードから Azure Firewall に疎通できているか (User Defined Route、VNet Peering、NSG の設定が正しいか)
* ワークスペースのパブリック アクセス設定が有効かどうか

下図は Azure Firewall を経由する際の構成例です。

![databricks-15.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/c4976ba7-063b-5c99-9322-56a5291e7b09.png)

#### 例 2-3. Private Endpoint を経由する場合

Private Endpoint を経由する場合は主に以下を確認する必要があります。
* Private DNS Zone 等で名前解決できているか
* (Private Endpoint が別の VNet にあるとき) VNet Peering や NSG アウトバウンドが正しく設定できているか

下図は Private Endpoint を経由する際の構成例です。

![databricks-14.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/a2aa2b8d-e27a-2b75-e4d7-f871dcb9a794.png)


#### 例 2-4. Databricks VNet から直接パブリック アクセスする場合

Databricks VNet からコントロール プレーンに直接パブリック アクセスする場合は主に以下を確認する必要があります。
* NSG アウトバウンドに問題がないか
* ワークスペースのパブリック アクセス設定が有効かどうか

Azure のデータセンター間通信はパブリック アクセスであっても外部インターネットを経由せず、構成としては下図となります。

<img width="600" alt="スクリーンショット 2022-09-23 13.19.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/2d875bef-9516-8105-3830-e03607e0eb1f.png">



なお、ワークスペース作成時に`必須の NSG ルール`を`すべてのルール`と設定すれば、NSG に必要なルールが自動で追加されます。

<img width="600" alt="スクリーンショット 2022-09-23 13.19.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/f010bd2e-2c3a-fad5-0756-71889bb523fe.png">

自動で追加される NSG ルールは下図となります。

![スクリーンショット 2023-03-26 13.38.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/15998447-4e55-cdf5-5182-8eab22c83f60.png)


### 3. Init Script の確認

[Init Script](https://learn.microsoft.com/ja-jp/azure/databricks/clusters/init-scripts) で `hosts` 等のネットワーク設定を入れているかを確認します。なお、Init Script が実行される前にコントロール プレーンへの接続が発生します。 ですので、`adb-XXXXX.XX.azuredatabricks.net` のプライベート エンドポイントを Init Script で追記した `hosts` で名前解決を行おうとしても、クラスター起動に失敗する可能性があるので注意しましょう。

## おわりに

Azure Databricks でのクラスター起動時に Instance Unreachable エラーで失敗する際のトラブルシューティング方法について説明しました。他のエラーについては下記ページを参考にトラブルシューティングしましょう。

https://kb.databricks.com/clusters/cluster-failed-launch