[2024年版] DatabricksにおけるAWS PrivateLinkのバックエンド接続の設定(実践編)

以前こちらを書きましたが、いかんせん3年前のものなのでもう一度ウォークスルーします。

https://qiita.com/taka_yayoi/items/1ca54463469df05dd3ee

:::note info
**注意**
ここでは基本的な構成でのウォークスルーを行っています。ご自身のネットワーク要件に基づいて適宜変更してください。
:::

:::note info
**お詫び**
2024/8/22まで、[セキュリティグループの設定](#セキュリティグループの設定)で、アウトバウンドルールの「ワークスペースセキュリティグループへのすべてのTCPおよびUDPアクセスを許可します（内部トラフィック用）」の設定が漏れておりました。大変ご迷惑をおかけしました。
:::


当時は日本語マニュアルもありませんでした。

https://docs.databricks.com/ja/security/network/classic/privatelink.html

# 事前の検討事項

- **構成** どれを選ぶべきかに関しては[こちら](https://qiita.com/taka_yayoi/items/7abe6fa94cd89e12ba6e)を参考にしてください。
    1. バックエンドのみ
    1. バックエンド+フロントエンド
    1. バックエンド+フロントエンド+公衆回線からのアクセスをシャットダウン
- **クラスターから外部へのアクセスを許可するかどうか**
- **リージョン**
- **VPCにおけるIPアドレスのサイズ(CIDR)**
    Databricksワークスペースで使用するサブネットは最低2つ必要です。それらのサブネットは**異なるアベイラビリティゾーン**に存在する必要があります。Databricksの計算資源を構成するノード(1台のドライバー/ワーカー)は2つのIPアドレスを必要とします。このため、あるサブネットに配備できるノードの数は、確保しているIPアドレスの半分となります。各サブネットには、`/17～/26`のネットマスクが必要です。これら2つのサブネットのサイズを決定した後に、VPCのCIDRを決定します。

    - サブネットマスク`/17`: IPアドレス数は32,768、確保できるノード数は16,384
    - サブネットマスク`/26`: IPアドレス数は64、確保できるノード数は32
   
ここでは、以下の前提で設定を行います。
- Tokyoリージョン
- バックエンドPrivateLinkのみ
- 外部接続は許可しない
- サブネットのサイズは`/25`(64ノード)

**参考資料**
- [サブネット CIDR ブロック \- Amazon Virtual Private Cloud](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/subnet-sizing.html)
- [サブネットマスク早見表｜IPアドレスサブネットマスク早見表｜AHREF](https://www.ahref.org/subnet.php)


# AWSマネジメントコンソールでの作業

## VPCの作成

以下の設定でVPCを作成します。

- 名前タグ:`privatelink`
- IPv4 CIDR ブロック: `10.0.0.0/24`
- アベイラビリティゾーン (AZ) の数: 2
- パブリックサブネットの数: 0
- プライベートサブネットの数: 2
    - サブネット1のCIDR: 10.0.0.0/25(64ノード)
    - サブネット2のCIDR: 10.0.0.128/25(64ノード)
- NAT ゲートウェイ ($): なし
- VPC エンドポイント: S3ゲートウェイ
- DNSオプション: 両方チェック

![Screenshot 2024-05-25 at 8.44.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4200df27-d714-b8b6-ff98-7aa2c731a47e.png)
![Screenshot 2024-05-25 at 8.49.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/300fb61b-c037-95c2-dd7c-03a4d6f86667.png)
![Screenshot 2024-05-25 at 8.49.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/83add1e1-6251-e53f-f03d-28fcf3373a92.png)

## セキュリティグループの設定

[こちら](https://docs.databricks.com/ja/security/network/classic/customer-managed-vpc.html#security-groups)に従って設定を行います。

トラフィックソースとして自分自身を指定するので、ルールが空の状態でセキュリティグループを作成します。
![Screenshot 2024-05-25 at 9.14.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8e139fc8-8860-56b3-bf1b-6d318a1b5311.png)

**インバウンドルール**
![Screenshot 2024-05-25 at 9.16.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a4c28a0a-6e46-ab9a-8cb5-30702fecf4b2.png)

**アウトバウンドルール**

このように設定します。
![Screenshot 2024-05-25 at 9.19.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5f7c44b5-ce97-0c24-edc7-a000b2b81203.png)
![Screenshot 2024-05-25 at 9.19.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e4aa0eec-5222-34e4-baa2-6a853688e2ee.png)

セキュリティグループを作成した後に、**「ワークスペースセキュリティグループへのすべてのTCPおよびUDPアクセスを許可します（内部トラフィック用）」** を追加します。ここでの送信先には、上で作成したセキュリティグループを指定します。
![Screenshot 2024-08-22 at 19.49.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ce5439f6-73f5-3fa2-afcc-e0aa300e4a04.png)

## ネットワークACLの設定

ネットワークACLはデフォルトのままとし、すべてのトラフィックを許可します。ワークスペースデプロイの際には[こちら](https://docs.databricks.com/ja/security/network/classic/customer-managed-vpc.html#subnet-level-network-acls)の検証を行います。

![Screenshot 2024-05-25 at 10.41.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/84af4985-6599-3270-c954-9017b532b588.png)
![Screenshot 2024-05-25 at 10.41.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5c5b4dff-8bb9-1c66-7259-cf02b30bdc44.png)

ここではVPCエンドポイント用のサブネットは作成せず、ワークスペース用サブネットにVPCエンドポイントを作成します。VPCエンドポイント用のサブネットを作成した場合には、ルートテーブル、セキュリティグループを追加で作成してください。

## VPCエンドポイントの作成

バックエンドPrivateLinkの場合は、2つのVPCエンドポイントを作成します。

- [セキュアクラスター接続](https://docs.databricks.com/ja/security/network/classic/secure-cluster-connectivity.html)用VPCエンドポイント
- ワークスペース用: コンピュートプレーンへのDatabricks REST API呼び出しのために必要です。

ここでは、ガイドに従い以下の名前でエンドポイントを作成します。

- セキュアクラスター接続用: `databricks-ap-northeast-1-scc-vpce`
- ワークスペース用: `databricks-ap-northeast-1-workspace-vpce`

### セキュアクラスター接続用VPCエンドポイントの作成

エンドポイント名を入力し、**その他のエンドポイントサービス**を選択します。
![Screenshot 2024-05-25 at 9.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0c45f0d8-7783-1525-8073-41f77130af02.png)

[こちらのリファレンス](https://docs.databricks.com/ja/resources/supported-regions.html#privatelink)で`ap-northeast-1`を検索します。**セキュアなクラスター接続リレー**のサービス名は`com.amazonaws.vpce.ap-northeast-1.vpce-svc-02aa633bda3edbec0`となっているので、これを**サービス名**に貼り付けて、**サービスの検証**をクリックします。
![Screenshot 2024-05-25 at 9.29.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/882d1690-0348-2590-8976-8f80be379d7d.png)
問題がなければ **サービス名が検証されました。** と表示されます。

上のステップで作成した、VPC、AZごとのサブネット、セキュリティグループを選択します。VPCを設定する際に**追加設定**を展開し、**DNS名を有効化**にチェックを入れることを忘れない様にしてください。
![Screenshot 2024-05-25 at 9.41.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ff0053ce-a1c9-b83c-b84b-af24f03043bf.png)
![Screenshot 2024-05-25 at 9.32.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/10f8d8bf-a895-81c4-82c4-b02dcdb56f29.png)

**エンドポイントを作成**をクリックします。

### ワークスペース用VPCエンドポイントの作成

**ワークスペース（REST APIを含む）** のサービス名は`com.amazonaws.vpce.ap-northeast-1.vpce-svc-02691fd610d24fd64`なので、上の手順でエンドポイントを作成します。

2つのVPCエンドポイントが有効化されたことを確認します。
![Screenshot 2024-05-25 at 9.52.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b4161b67-a74a-0d89-41fe-f2e0f4b45ace.png)

# Databricksアカウントコンソールでの作業

アカウント管理者として https://accounts.cloud.databricks.com/ にログインします。

## VPCエンドポイントの登録

**クラウドリソース > ネットワーク > VPCエンドポイント** にアクセスします。**VPCエンドポイントを登録**をクリックします。
![Screenshot 2024-05-25 at 9.55.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/753adc49-c8e5-7242-7bfe-c60862cb7c66.png)

[手順](https://docs.databricks.com/ja/security/network/classic/privatelink.html#step-3a-register-your-vpc-endpoints-for-front-end-back-end-or-both)に従い、エンドポイント名、リージョン、上のステップで作成したVPCエンドポイントのIDを指定して設定を行います。
![Screenshot 2024-05-25 at 9.57.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b9e394d8-7f2f-2fa8-ebab-c5990b698192.png)
![Screenshot 2024-05-25 at 9.57.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ff3795c3-d366-1b7a-7af0-59685931e66a.png)
![Screenshot 2024-05-25 at 9.57.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/683ec703-9724-c654-63d1-9cff1eb3cb5c.png)

## ネットワーク構成の作成

[手順](https://docs.databricks.com/ja/admin/account-settings-e2/networks.html)に従い、ネットワーク構成を作成します。これまでの手順で作成した、VPCのID、サブネットのID、セキュリティグループのID、[上の手順](#vpcエンドポイントの登録)で作成したVPCエンドポイントを指定します。
![Screenshot 2024-05-25 at 10.02.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5e5b87a1-c723-d853-c73c-3eaee2197fcd.png)
![Screenshot 2024-05-25 at 10.02.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/567941f0-67ec-7f33-a630-9aeae064f7e8.png)

## プライベートアクセス設定オブジェクトの作成

[手順](https://docs.databricks.com/ja/security/network/classic/privatelink.html#step-3c-create-a-pas-object-for-front-end-back-end-or-both)に従って、オブジェクトを作成します。

バックエンドPrivateLinkのみの構成なので、パブリックアクセスは**True**に設定してインターネットからのアクセスを許可します。
![Screenshot 2024-05-25 at 10.07.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/90e93aa8-404c-b468-c59e-44471a10e4e6.png)

## ワークスペースの作成

[このステップ](https://docs.databricks.com/ja/admin/workspace/create-workspace.html)では、上の手順で作成したネットワーク構成オブジェクト、プライベートアクセス設定オブジェクトに加えて、認証情報設定やストレージ設定、Unity Catalogメタストアが必要となります。作成していない場合には、[こちら](https://docs.databricks.com/ja/admin/workspace/create-workspace.html#before-you-begin)を参考にして設定オブジェクトを作成してください。

**ワークスペース**にアクセスして**ワークスペースの作成**をクリックします。
![Screenshot 2024-05-25 at 10.10.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/932cf967-a2ba-3c9e-290f-33b791ebdfb3.png)

ワークスペース名、リージョン、資格情報、ストレージ設定、Unity Catalogメタストアを設定します。
![Screenshot 2024-05-25 at 10.12.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/126149d3-4aee-c2ef-6870-139f745d766b.png)

**高度な設定**を展開します。上のステップで作成したネットワーク構成オブジェクトとプライベートアクセス設定オブジェクトを選択します。

**保存**をクリックすると、ワークスペースの作成がスタートします。

:::note
**注意**
作成時に`Response not successful: Received status code 400`というエラーが出る場合には、AWSネットワークの設定が間違っている可能性があります。**クラウドリソース > ネットワーク > ネットワーク設定**にアクセスし、**VPCステータスメッセージ**を確認することで、トラブルシュートすることができます。
![Screenshot 2024-05-25 at 10.44.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2d72a51e-04b6-6ebd-d74d-09cf6930bd2c.png)
:::

うまくいけば、ワークスペースがデプロイされます。
![Screenshot 2024-05-25 at 10.45.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7f58809d-2161-a236-dcbf-3b24cbbf33c5.png)
![Screenshot 2024-05-25 at 10.45.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ab29297c-59a1-8855-b991-832bfb093f34.png)

アカウント管理者としてログインします。
![Screenshot 2024-05-25 at 10.46.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/55645bd2-5178-f40b-2b12-29bb578816ca.png)

# AWSマネジメントコンソールでの作業(続き)

ここで、もう一度AWSマネジメントコンソールでの作業に戻ります。[こちら](https://docs.databricks.com/ja/security/network/classic/privatelink.html#step-6-add-vpc-endpoints-for-other-aws-services)にあるように、追加でVPCエンドポイントを作成します。

## STS VPCインタフェースエンドポイントの作成

AWSのサービスを選択し、`sts`で検索します。`com.amazonaws.ap-northeast-1.sts`を選択し、VPC、サブネット、セキュリティグループを選択します。
![Screenshot 2024-05-25 at 10.50.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9bcbd976-5bf7-0c9b-dfe0-4d9ac23e101d.png)
![Screenshot 2024-05-25 at 10.50.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/19ff1175-5902-789b-c966-99de87398fe9.png)

## Kinesis VPCインタフェースエンドポイントの作成

AWSのサービスを選択し、`kinesis`で検索します。`com.amazonaws.ap-northeast-1.kinesis-streams`を選択し、VPC、サブネット、セキュリティグループを選択します。
![Screenshot 2024-05-25 at 10.54.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f157b54c-a714-f21d-4352-69e714474575.png)
![Screenshot 2024-05-25 at 10.54.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/12a1c062-606f-6e25-5cf5-e4f41cc2da90.png)

# Databricksワークスペースでの動作確認

ワークスペースにアクセスして、**クラスター**に移動します。最小規模のクラスターで構わないので、**Personal Computeで作成**をクリックします。
![Screenshot 2024-05-25 at 10.55.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a82c2eaf-ad0f-2b5d-20ad-0630203486ef.png)
**コンピューティングを作成**をクリックします。
![Screenshot 2024-05-25 at 10.56.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5f88ffc1-386d-6773-c12b-24072bf80a30.png)

クラスターが起動するかどうかが最初の関門です。起動に失敗する場合には上で設定した内容を再度確認してください。

グリーンランプがついたので無事に起動しました！
![Screenshot 2024-05-25 at 11.03.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2ce1708e-bb23-0860-d30e-25156bcb9fab.png)

サイドメニューの**新規 > ノートブック**を選択してノートブックを作成し、上で作成したクラスターにアタッチします。言語設定はPythonにしておきます。

以下を実行します。

```py
print("hello")
```
![Screenshot 2024-05-25 at 11.07.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fe14b71a-5d2e-da3c-9760-2c92fbc2ca66.png)

結果が返ってきたら動作確認は完了です。お疲れ様でした！クラスターは停止しておいてください。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

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