Databricksワークスペース(E2)作成時のトラブルシューティング

[Troubleshooting creating workspaces \(E2\) \| Databricks on AWS](https://docs.databricks.com/administration-guide/account-settings-e2/troubleshooting.html) [2021/7/20時点]の翻訳です。

> [Databricksクイックスタートガイド](https://qiita.com/taka_yayoi/items/125231c126a602693610)のコンテンツです。

# 概要

以下のセクションでは、ワークスペース作成時の設定エラーおよび、どのようにエラーに対処するのかを説明します。多くの問題は、[Account Console](https://docs.databricks.com/administration-guide/account-settings-e2/workspaces.html)あるいは[Account API](https://docs.databricks.com/administration-guide/account-api/new-workspace.html)によるワークスペース作成に関わるものですが、当てはまらない場合にはその旨記載します。

> **注意**
この記事は[E2バージョンのDatabricksプラットフォームアカウント](https://docs.databricks.com/getting-started/overview.html#e2-architecture)におけるプロセスを説明するものです。新規Databricksアカウントと多くの既存アカウントはE2です。お持ちのアカウントタイプが不明の場合には、Databricks担当にお問い合わせください。

# 一般的なエラー

## VPCの最大数

VPCの最大数に関するエラーメッセージを受け取った場合には、リージョンで許可されるVPCの[最大数の引き上げをリクエスト](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)してください。このエラーは、顧客管理VPCではなく主にDatabricks管理VPCを用いているときに発生します。

## アドレスの最大数

アドレスの最大数に関するエラーメッセージを受け取った場合には、リージョンで許可されるVPCのElastic IPアドレスの[最大数の引き上げをリクエスト](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)してください。このエラーは、顧客管理VPCではなく主にDatabricks管理VPCを用いているときに発生します。

## このオペレーションは許可されていません

オペレーションが許可されていないというエラーメッセージを受け取った場合には、[IAMロールに関するドキュメント](https://docs.databricks.com/administration-guide/account-api/iam-role.html)で定義されている必要なポリシーがお使いのIAMロールに割り当てられているかを確認してください。

# ストレージ設定エラーメッセージ

## Malformed request: Failed storage configuration validation checks

ストレージ設定の検証チェックに失敗したとのメッセージを受け取った場合には、お使いのS3バケットのアクセス権が適切に設定されていないことを意味します。[AWSストレージの設定](https://docs.databricks.com/administration-guide/account-api/aws-storage.html)の手順に従って、S3バケットのアクセス権が適切に設定されていることを確認してください。

# クレディンシャル設定エラーメッセージ

## Malformed request: Failed credential configuration validation checks

エラーメッセージに含まれるアクセス権チェックのリストが原因特定に役立ちます。

- 10未満のアクセス権チェックでクレディンシャル設定検証が失敗した場合には、お使いのIAMポリシーに必要な権限が含まれていない可能性があります。[Create a cross\-account IAM role](https://docs.databricks.com/administration-guide/account-api/iam-role.html)の記事から適切なポリシーをコピーしてください。
- それ以上のチェックで検証が失敗した場合には、IAMロールの信頼関係の設定が適切に行われていない可能性が高いです。[Create a cross\-account IAM role](https://docs.databricks.com/administration-guide/account-api/iam-role.html)の記事にある手順に従い、適切にカスタマーロールの信頼関係が設定されていることを確認してください。

ポリシーと信頼関係が適切にせってされているのであれば、以下も確認してください。

- クレディンシャルオブジェクトに適切なロールARNを含めていることを確認してください。
- `AssumeRole`アクション、EC2/VPCアクセスを拒否する組織レベルの[service control policies](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)(SCP)が設定されていないか確認してください。不明な場合には、AWS管理者にSCPについてお尋ねください。

# ネットワーク設定

## サブネットは他のネットワークで既に使用されています

使用中のサブネットに関するエラーは以下のようなものとなります。

```
MALFORMED_REQUEST: Malformed parameters: subnet_id subnet-xxxxxxxx1 is already used by another Network, subnet_id subnet-xxxxxxxx2 is already used by another Network.
```

これは、Databricksのネットワーク設定が同じサブネットを使用していることを意味します。解決するためには、以下のいずれかを実施してください。

- 以前の設定を削除してください。Account APIを使用している場合には、[Delete network configuration API](https://docs.databricks.com/dev-tools/api/latest/account.html#operation/delete-network-config)を使用してください。設定を削除するために[Account Console](https://docs.databricks.com/administration-guide/account-settings-e2/account-console-e2.html)を使用することもできます。
- 以前の設定が使用されていない場合には、新たなワークスペースを作成するために設定を使用できます。
- 稼働中のワークスペースでネットワーク設定が使用さrている場合には、新たなサブネットを作成し、新たなワークスペースのために新たなネットワーク設定を作成します。

以前のワークスペース作成が失敗した場合、関連する設定コンポーネントは自動で削除されないことに注意してください。

## セットアップ時にネットワーク設定エラーはなかったが、ワークスペース作成時にエラーが発生

ネットワーク設定のセットアップ時にはエラーが発生しなくても、ワークスペースをデプロイする際にネットワーク設定のエラーが発生する場合があります。これは、Databricksがネットワークオブジェクトを生成する際、基本的な検証のみを行うためです。例えば、サブネットやセキュリティグループはユニークか、指定されていないフィールドはないかをチェックします。

新たなネットワーク設定で新たなワークスペースを作成する際にのみ、本格的なネットワーク設定の検証が行われます。ワークスペースのデプロイ時にエラーが発生した際には、ネットワーク検証エラーメッセージを確認してください。

## 新規クラスターが反応しない、あるいはイベントログに「data plane network is misconfigured」エラー

ワークスペースのデプロイが成功したように見えても、最初のテスト用のクラスターが反応しないケースがあります。約20-30分経過して、[クラスターのイベントログ]
(https://docs.databricks.com/clusters/clusters-manage.html#event-log)を参照した際、以下のようなエラーメッセージが表示されているかもしれません。

```
The data plane network is misconfigured. Please verify that the network for your data plane is configured correctly. Error message: Node daemon ping timeout in 600000 ms ...
```

このメッセージはルーティング、あるいはファイアウォールが適切に設定されていないことを意味します。新規クラスターのためにDatabrcicksがEC2をリクエストしましたが、EC2インスタンスが起動し、コントロールプレーンに接続する際に長い待ち時間が発生しました。クラスターマネージャはインスタンスを停止し、上記エラーを報告します。

お使いのネットワーク設定は、クラスターノードからDatabricksの[コントロールプレーン](https://docs.databricks.com/getting-started/overview.html)に接続できるように設定されている必要があります。クラスターを用いたクイックなトラブルシュートは、ワークスペースのサブネットの一つにEC２インスタンスをデプロイし、　`nc`、`ping`、`telnet`、`traceroute`のようなネットワークトラブルシュートのステップを踏むことです。それぞれのリージョンにおけるリレーCNAMEは[顧客管理VPCの記事](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe#%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%97%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%82%B9%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%83%81%E3%83%A3)に記載されています。アーティファクトのストレージに対しては、S3へのネットワーク疎通が成功することを確認してください。

リージョンごとのドメインとIPへのアクセスに関しては、[データプレーンに必要なアドレス](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe#%E5%BF%85%E8%A6%81%E3%81%A8%E3%81%AA%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%97%E3%83%AC%E3%83%BC%E3%83%B3%E3%81%AE%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9)を参照してください。リージョナルエンドポイントに関しては[こちら](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe#%E3%83%AA%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%8A%E3%83%AB%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88)を参照ください。以下の例では、AWSリージョン`eu-west-1`を使用しています。

```bash:Bash
# Verify access to the web application
nc -zv ireland.cloud.databricks.com 443

# Verify access to the secure cluster connectivity relay
nc -zv tunnel.eu-west-1.cloud.databricks.com 443

# Verify S3 global and regional access
nc -zv s3.amazonaws.com 443
nc -zv s3.eu-west-1.amazonaws.com 443

# Verify STS global and regional access
nc -zv sts.amazonaws.com 443
nc -zv sts.eu-west-1.amazonaws.com 443

# Verify regional Kinesis access
nc -zv kinesis.eu-west-1.amazonaws.com 443
```

上記コマンドがすべて正常に動作するのであれば、ネットワークは適切に設定されていますが、ファイアウォールを使用している場合には他の問題が発生する場合があります。ファイアウォールでは、Databricksコマンドが失敗するような、ディープパケットインスペクション、SSLインスペクションなどが実行される可能性があります。Databricksのサブネットに作成したEC2インスタンスを用いて以下を実行してみてください。

```bash:Bash
curl  -X GET -H 'Authorization: Bearer <token>' \
https://<workspace-name>.cloud.databricks.com/api/2.0/clusters/spark-versions
```

`<token>`はパーソナルアクセストークンに置換し、お使いのワークスペースのURLを指定してください。詳細は[Authentication using Databricks personal access tokens](https://docs.databricks.com/dev-tools/api/latest/authentication.html)を参照してください。

このリクエストが失敗する場合、SSL検証を回避するために`-k`オプションを試してみてください。`-k`オプションでうまくいく場合、ファイアウォールでSSL証明書に関係する問題が起きています。

以下のコマンドを用いてSSL証明書を参照し、ドメインをお使いのリージョンの[コントロールプレーンWebアプリケーション](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe#%E5%BF%85%E8%A6%81%E3%81%A8%E3%81%AA%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%97%E3%83%AC%E3%83%BC%E3%83%B3%E3%81%AE%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9)のドメインに置換してください。

```bash:Bash
openssl s_client -showcerts -connect oregon.cloud.databricks.com:443
```

このコマンドはリターンコードとDatabricks証明書を表示します。エラーが発生する場合には、ファイアウォールが適切に設定されておらず、修正が必要な可能性があります。

[SSLの問題はネットワーク層の問題ではない](https://security.stackexchange.com/questions/19681/where-does-ssl-encryption-take-place)ことに注意してください。ファイアウォールにおけるトラフィックはSSLの問題を示しません。ソース、ディスティネーションリクエストが期待通り動作することを確認してください。

## ワークスペースは稼働しているようだが、ネットワーク設定が`WARNED`ステータス

クラスターを起動し、データジョブを実行して、`DBFS_DOWN`や`METASTORE_DOWN`が[クラスターのイベントログ](https://qiita.com/taka_yayoi/items/991aae376c089df58504#%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AD%E3%82%B0)に表示されないことを確認してください。このようなエラーが出ていない場合には、`WARNED`は必ずしも問題ではありません。

新規ワークスペースにおいては、Databricksは数多くのことをチェックします。ワークスペースのサブネット→NATゲートウェイ→インターネットゲートウェイのようにシンプルなルーティングにしていない場合には、Databricksではネットワークが適切かをチェックできません。このような場合、Databricksはネットワーク設定に対して警告を出します。

### サブネットのルートテーブルのエラーをチェック

クラスターのイベントログに、以下のようなエラーが出るかもしれません。

```
subnet: Route Table with ID rtb-xxxxxxxx used for subnet with ID subnet-yyyyyyyyy is missing default route to direct all traffic to the NAT gateway nat-zzzzzzzzzzz.
```

このエラーは、シンプルなDatabricksワークスペース設定では実際に問題を示している場合があります。

ファイアウォール経由でのルーティング(例：ハブスポークでのトランジットゲートウェイ経由)などご自身で外向きの通信の設定をしている場合には、このエラーはあまり意味のあるものではありません。

このエラーの他の原因としては、クラスター用のDatabricksサブネットとしてNATサブネットを登録していることが考えられます。DatabricksワークスペースのサブネットのリストからNATサブネットを削除し、ワークスペースを再作成してください。

### ネットワーク設定のサブネットのリストにNATサブネットを追加しないでください

DatabricksワークスペースのサブネットのリストにはNATサブネットを追加しないでください。NATサブネットはNATゲートウェイのためのもので、Databricksクラスターノードをデプロイするサブネットではありません。ネットワーク設定を作成する際には、Databricksノードのための二つのサブネットのみを指定してください。

## メタストアを使用する際の問題、あるいはクラスターイベントログに`METASTORE_DOWN`イベント

ワークスペースが稼働し、クラスターも動作しているのにもかかわらず、[クラスターのイベントログ](https://qiita.com/taka_yayoi/items/991aae376c089df58504#%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AD%E3%82%B0)に`METASTORE_DOWN `イベントが表示される、あるいはお使いの[メタストア](https://docs.databricks.com/data/metastores/index.html)が動作していないようであれば、SquidプロキシのようなWeb Application Firewall (WAF)を使っていないか確認してください。クラスターノードはWAFを越えて動作しないいくつかのサービスに接続しなくてはなりません。

## クラスター起動エラー：failed to launch Spark container on instance

以下のようなエラーをクラスターログで見るかもしれません。

```
Cluster start error: failed to launch spark container on instance ...
Exception: Could not add container for ... with address ....
Timed out with exception after 1 attempts
```

この[クラスターログ](https://qiita.com/taka_yayoi/items/991aae376c089df58504#%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AD%E3%82%B0)は、インスタンスがルートS3バケットに対してアクセスするためにSTSを使用できない可能性を示しています。これは、VPCエンドポイントを用いてコミュニケーションを切断したり、ファイアウォールを追加して、侵入防御を実装している際に起こります。

修正するには、以下のいずれかを実施してください。

- [VPCの要件](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe)にあるように、グローバルSTSエンドポイント(`sts.amazonaws.com`)への接続を許可するようにファイアウォールを変更してください。
- [リージョナルエンドポイント](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe#%E3%83%AA%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%8A%E3%83%AB%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88)を設定してVPCエンドポイントを使用してください。

エラーに関してさらに情報が必要な場合は、AWS CLIの`decode-authorization-message`を呼び出してください。詳細は、[AWS article for decode\-authorization\-message](https://docs.aws.amazon.com/cli/latest/reference/sts/decode-authorization-message.html)を参照してください。コマンドは以下のようになります。

```bash:Bash
aws sts decode-authorization-message --encoded-message
```

このエラーは、ワークスペースとは別に、STS VPCエンドポイントに対して異なるセキュリティグループを持つVPCエンドポイントを設定した場合に発生する場合があります。それぞれのセキュリティグループ内のリソースが通信できるようにセキュリティグループを更新するか、ワークスペースのサブネットと同じセキュリティグループ内にSTS VPCエンドポイントを設定してください。

クラスターノードが顧客のS3ポリシーを用いてS3ルートバケットにアクセスする際にSTSを使用する必要があります。DatabricksのクラスターノードからAWS STSサービスへとネットワークが疎通する必要があります。

## 最新のルールによるセキュリティグループの更新ができない

以下のようなエラーを見るケースがあります。

```
Security Group with ID sg-xxxx could not be updated with latest Security Group Rules
```

[IAMロールのドキュメント](https://docs.databricks.com/administration-guide/account-api/iam-role.html)の内容に従うようにIAMロールを更新してください。いくつかのケースでは、`AuthorizeSecurityGroupEgress`に対するリソース、類似のアクションはカンマ区切りの値を持つ場合があります。それらを一つのリソースではなく、別々のリソースとしてアップデートしてください。

**適切**

```json:JSON
"Action": [
    "ec2:AuthorizeSecurityGroupEgress",
    "ec2:AuthorizeSecurityGroupIngress",
    "ec2:RevokeSecurityGroupEgress",
    "ec2:RevokeSecurityGroupIngress"
],
"Resource": [
    "arn:aws:ec2:us-east-1:444:security-group/sg-xxxx",
    "arn:aws:ec2:us-east-1:444:security-group/sg-yyyy",
    "arn:aws:ec2:us-east-1:444:security-group/sg-zzzz"
],
```

**不適切**

```json:JSON
"Resource": ["arn:aws:ec2:us-east-1:444:security-group/sg-xxxx,sg-yyyy,sg-zzzz"],
```

## ネットワークセットアップの問題がある場合、Databircks管理のVPCの利用を検討ください

ネットワークセットアップに直面する際には、ワークスペースを作成する際に、顧客管理VPCではなく、Databricks管理のVPCを選択することもできます。

> **重要!**
ワークスペースを作成する際に顧客管理VPCを作成するかどうかを選択する必要があります。ワークスペース作成後に変更することはできません。

作成に失敗したワークスペースをDatabricks管理VPCに切り替えるには、異なるクロスアカウントIAMロールが必要になります。

1. [クロスアカウントIAMロールのドキュメント](https://docs.databricks.com/administration-guide/account-api/iam-role.html#create-a-cross-account-role-and-an-access-policy)に移動します。
1. **Databricks VPC**とラベル付けされているポリシーをコピーします。
1. このポリシーを[workspace creation using the Account Console](https://docs.databricks.com/administration-guide/account-settings-e2/workspaces.html)あるいは[workspace creation using the Account API](https://docs.databricks.com/administration-guide/account-api/new-workspace.html)で使用します。
    - [アカウントコンソール](https://docs.databricks.com/administration-guide/account-settings-e2/account-console-e2.html)のネットワーク設定ピッカーで**Databricks-managed**を選択します。
    - Account APIでは、`network_id`要素を含めないように注意してください。以下のようになります。

```json:JSON
{
  "workspace_name": "<workspace-name>",
  "deployment_name": "<deployment-name>",
  "aws_region": "<aws-region>",
  "credentials_id": "<credentials-id>",
  "storage_configuration_id": "<storage-configuration-id>"
}
```


# Account API固有のエラーメッセージ

以下のエラーは、ワークスペースを作成する際のAccount APIリクエストによって返される場合があるメッセージです。

## Malformed request: Invalid `<config>` in the HTTP request body

リクエストのボディのJSONが適切にフォーマットされていません。このエラーメッセージの`<config>`は、クレディンシャル、ストレージ設定、ネットワーク設定を参照します。URLの特殊文字が適切にエスケープされていることを確認するか、あるいは、PostmanのようなREST APIクライアントアプリケーションを使用してください。

## Malformed request: Invalid `<config>` in body

リクエストのボディのJSONが適切にフォーマットされていません。このエラーメッセージの`<config>`は、クレディンシャル、ストレージ設定、ネットワーク設定を参照します。URLの特殊文字が適切にエスケープされていることを確認するか、あるいは、PostmanのようなREST APIクライアントアプリケーションを使用してください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)