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

:::note alert
**この情報は古くなっています。[マニュアル](https://docs.databricks.com/ja/security/network/classic/privatelink.html)や[\[2024年版\] DatabricksにおけるAWS PrivateLinkのバックエンド接続の設定\(実践編\)](https://qiita.com/taka_yayoi/items/cf0afda292404bc03412)を参照ください。**
:::


本書は、[DatabricksにおけるAWS PrivateLinkの有効化](https://qiita.com/taka_yayoi/items/c6bdbb6452f6a0895961)に記載されているバックエンド接続の設定手順をまとめたものとなっています。

# 全体構成

本書でDatabricksをセットアップするVPCはインターネットに接続されていないクローズドネットワーク環境であり、外部との通信は全てエンドポイント経由で構成する環境を想定しております。本書で示しているものはあくまで一例です。お客様の要件に応じて構成を変更してください。

AWS PrivateLinkを用いることで、公衆ネットワークを経由することなしに、AWS VPCやオンプレミスのネットワークからAWSサービスへのプライベート接続を実現することができます。E2バージョンプラットフォーム上のDatabricksワークスペースでは、以下の2つのタイプのPrivateLink接続をサポートしています。

- **フロントエンド**(ユーザーからワークスペースへの接続): フロントエンドPrivateLink接続によって、ユーザーはVPCインタフェースエンドポイント経由でDatabricksのwebアプリケーション、REST API、Databricks Connect APIに接続することができます。
- **バックエンド**(データプレーンからコントロールプレーンへの接続): 顧客管理VPCのDatabricksランタイムクラスター([データプレーン](https://qiita.com/taka_yayoi/items/7d209bc8d32bc5f2dba4))は、DatabricksクラウドアカウントにあるDatabricksワークスペースのコアサービス([コントロールプレーン](https://qiita.com/taka_yayoi/items/7d209bc8d32bc5f2dba4))に接続します。クラスターは2つの目的でコントロールプレーンに接続します：REST APIとセキュアクラスター接続のリレーです。このタイプのPrivateLinkでは、二つの異なるサービスを使用するため、二つの異なるVPCインタフェースエンドポイントが必要となります。

本書では以下の構成を想定しています。ユーザー側からDatabricksの接続でもPrivateLinkを使用するフロントエンド接続に関しては、[DatabricksにおけるAWS PrivateLinkの有効化](https://qiita.com/taka_yayoi/items/c6bdbb6452f6a0895961)、および[DatabricksにおけるAWS PrivateLinkのフロントエンド接続の設定\(実践編\) ](https://qiita.com/taka_yayoi/items/4f08a48e431c38b8bca5)をご覧ください。
![Screen Shot 2021-11-02 at 8.05.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/52ebf5b5-eb86-27e5-81f5-6b36f66ff3ce.png)


# 参考資料
- [Databricksアカウントのセットアップとワークスペースのデプロイメント \- Qiita](https://qiita.com/taka_yayoi/items/c53beee557ae4a9643ac)
- [Databricksにおける顧客管理VPC \- Qiita](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe)
- [DatabricksにおけるAWS PrivateLinkの有効化 \- Qiita](https://qiita.com/taka_yayoi/items/c6bdbb6452f6a0895961)
- [Databricksワークスペース\(E2\)作成時のトラブルシューティング \- Qiita](https://qiita.com/taka_yayoi/items/483f3392a7b40b89c152)
- [Use AWS Glue Data Catalog as the metastore for Databricks Runtime \| Databricks on AWS](https://docs.databricks.com/data/metastores/aws-glue-metastore.html)

# 全体の流れ

1. 事前準備
    1. クロスアカウントIAMロールの作成
    1. クレデンシャル設定情報の登録
    1. S3バケットの設定
    1. 顧客管理VPCの作成
1. PrivateLinkの設定
    1. **PrivateLinkの有効化** Databricksがお客様のE2、AWSアカウントを有効化し、ワークスペースエンドポイントサービス、リレーエンドポイントサービスにアクセスできるようにする。(プレビュー期間はマニュアルの操作)
    1. **VPCエンドポイントの作成** お客様がワークスペース、リレーエンドポイントサービスに対して、ユーザー・ワークスペース間、DP・CP間のためのVPCエンドポイントを作成する。
    1. **VPCエンドポイントの登録** お客様がE2 Account APIを用いて、VPCエンドポイントをDatabricksに登録する。
    1. **プライベートアクセス設定オブジェクトの作成** お客様が(ワークスペースに対するプライベート/パブリックアクセスを決定した後で)E2 Account APIを用いて「プライベートアクセス設定」オブジェクトを作成する。
    1. **ネットワークオブジェクトの作成** お客様がE2 Account APIを用いて、DPからCP間の接続のためのVPCエンドポイントを参照するネットワークオブジェクトを作成する。
    1. **ワークスペースの配備** お客様がE2 Account APIを用いて「プライベートアクセス設定」とネットワークオブジェクトをリンクさせたワークスペースを配備する。

# 事前準備

事前準備における、クロスアカウントIAMロールの作成、クレデンシャル設定情報の登録、S3バケットの設定に関しては、[Databricksアカウントのセットアップとワークスペースのデプロイメント](https://qiita.com/taka_yayoi/items/c53beee557ae4a9643ac#%E5%88%9D%E6%9C%9F%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)を参考に設定を行ってください。AWS上でのDatabricksの環境構築を行う際には、Databricks担当者のサポートを受けることをお勧めします。[こちら](mailto:sales-jp@databricks.com)からお問い合わせください。

ステップバイステップの手順はこちらをご覧ください。

https://qiita.com/taka_yayoi/items/58ff1bda2ef91829eee9

## 顧客管理VPCの作成

### VPCの作成

以下の設定でVPCを作成します。名前、CIDRは適宜変更してください。

- 名前タグ - オプション: privatelink-test
- IPv4 CIDR ブロック: 10.0.0.0/22

![Screen Shot 2021-11-01 at 19.39.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/80404002-6621-44ea-41b6-a83aa345a53d.png)

アクションから「DNS ホスト名を編集」を選択し、DNS ホスト名の有効化にチェックをつけて、変更を保存をクリックしてください。
![Screen Shot 2021-11-01 at 19.42.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6866849b-f7c8-9045-0a41-f6ece8106bcc.png)

DNSホスト名とDNS解決が有効になっていることを確認します。
![Screen Shot 2021-11-01 at 19.42.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4ffa20b4-b67f-0765-bed3-58a76bc4bf3e.png)

### サブネットの作成

PrivateLink構成では以下のサブネットが必要となります。名称、CIDRは適宜変更してください。CIDRはワークスペース内で起動するクラスターの数に基づき決定する必要があります。**ワークスペース用サブネット1とワークスペース用サブネット2は別のアベイラビリティゾーンに作成する必要があります。**

| サブネット | CIDR | 名前 |
|:--|:--|:--|
|ワークスペース用サブネット1   |10.0.1.0/24   |databricks-ws-1   |
|ワークスペース用サブネット2   |10.0.2.0/24   |databricks-ws-2   |
|VPCエンドポイント用サブネット   |10.0.3.0/24   |databricks-vpce   |

![Screen Shot 2021-11-01 at 19.47.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/32781ba2-4430-48c1-9b6f-2595bb9f35ab.png)

**databricks-ws-1**
![Screen Shot 2021-11-01 at 19.47.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/39e9a9ad-8ce1-916d-565a-a0a01a20c8e9.png)

**databricks-ws-2**
![Screen Shot 2021-11-01 at 19.49.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d0c8f102-e6c0-7562-feb9-be84db88e36f.png)

**databricks-vpce**
![Screen Shot 2021-11-01 at 19.49.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/654e5ff8-a912-00a4-0441-6337b65fa0c8.png)

### ルートテーブル

PrivateLink構成では、メインルートテーブルに加えて、VPCエンドポイント用サブネット**databricks-vpce**にアタッチするルートテーブルが必要となります。

| 送信先 | ターゲット |
|:--|:--|
| 10.0.0.0/22(VPCのCIDR)  | local  |

**private-link-vpe-rt**
![Screen Shot 2021-11-01 at 19.54.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2458d1a6-5efd-c3c4-2f0b-4b160e263bbf.png)

作成したルートテーブルをサブネット**databricks-vpce**に関連づけます。ルートテーブルの「サブネットの関連付け」で「サブネットの関連付けを編集」をクリックします。

**databricks-vpce**にチェックをつけ、「関連付けを保存」をクリックします。
![Screen Shot 2021-11-01 at 19.56.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/522bcba7-b448-191a-1b55-2d88b10541be.png)

![Screen Shot 2021-11-01 at 19.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ddff05fb-d0af-e6fd-9451-44a48268f781.png)

### ネットワークACL

[サブネットの作成](#サブネットの作成)で作成したサブネットのネットワークACLがデフォルトのすべての通信を許可する様に設定されていることを確認します。
![Screen Shot 2021-11-01 at 19.59.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b2fbbbbc-2b66-65c3-1bf3-c715cf5e00a7.png)

### セキュリティグループ

PrivateLink構成では以下の2つのセキュリティグループが必要となります。

| セキュリティグループ | 名前| 説明 |VPC |
|:--|:--|:--|:--|
|ワークスペース用サブネット向けセキュリティグループ   | pl-sg-1  | SG for workspace subnet  |privatelink-test|
|VPCエンドポイント用サブネット向けセキュリティグループ   |pl-sg-2   |SG for vpce subnet   |privatelink-test|

**pl-sg-1のインバウンドルール**

自分自身(セキュリティグループ)を指定するには、一度ルールが空の状態でセキュリティグループを作成後に、以下の設定を追加します。

| タイプ | ソース |
|:--|:--|
|すべてのTCP   |pl-sg-1   |
|すべてのUDP   |pl-sg-1   |

**pl-sg-1のアウトバウンドルール**

| タイプ | ポート | 送信先 |
|:--|:--|:--|
|すべてのTCP   ||pl-sg-1   |
|すべてのUDP   ||pl-sg-1   |
|カスタムTCP   |443   |0.0.0.0/0|
|カスタムTCP    |3306   |0.0.0.0/0|
|カスタムTCP   |6666   |0.0.0.0/0|

自分自身を追加するには、一度セキュリティグループを作成した後にソース、送信先で選択します。
![Screen Shot 2021-11-01 at 20.12.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2a53e4b5-174f-c0ab-558b-b7e595ae8bb8.png)
![Screen Shot 2021-11-01 at 20.12.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3bbab4b6-1beb-d294-0391-e8395257ca36.png)

設定後は以下の様になります。
![Screen Shot 2021-11-01 at 20.14.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b929f8bb-abf8-d2d2-1aa7-bfe6ec424327.png)
![Screen Shot 2021-11-01 at 20.14.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8993a6df-e369-a031-51ef-0925d05c7eb6.png)

**pl-sg-2のインバウンドルール**

| タイプ | ポート | ソース |
|:--|:--|:--|
|カスタムTCP   |443   |10.0.0.0/22(VPCのCIDR)|
|カスタムTCP    |6666   |10.0.0.0/22(VPCのCIDR)|

**pl-sg-2のアウトバウンドルール**

| タイプ | ポート | 送信先 |
|:--|:--|:--|
|カスタムTCP   |443   |10.0.0.0/22(VPCのCIDR)|
|カスタムTCP    |6666   |10.0.0.0/22(VPCのCIDR)|

設定後は以下の様になります。
![Screen Shot 2021-11-01 at 20.19.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2167899c-f8b6-c3e1-0ce0-8b2746f8cfcd.png)
![Screen Shot 2021-11-01 at 20.19.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7a15a2e9-18b6-e3ca-729f-4c827fe323ab.png)

# PrivateLinkの設定

## PrivateLinkの有効化

Databricks担当者に以下をお伝えください。Databricks側にてPrivateLinkの有効化作業を行います。

- 環境をデプロイするAWSリージョン
- AWSのアカウントID
- 事前準備でアクセスするAccount Consoleで確認できるDatabricksのAccount ID

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

以下のエンドポイントを作成します。

- VPCエンドポイントサービス(Workspace VPC endpoint service)
- VPCエンドポイントサービス(Back-end SCC relay service)
- S3 VPCゲートウェイエンドポイント
- STS VPCインタフェースエンドポイント
- Kinesis VPCインタフェースエンドポイント

S3、STS、Kinesisのエンドポイントに関しては、顧客管理VPCで[リージョナルエンドポイントの設定](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リージョンに対応するVPCエンドポイントサービスを[こちら](https://docs.databricks.com/administration-guide/cloud-configurations/aws/privatelink.html#create-the-aws-vpc-endpoints)で確認します。東京リージョン(ap-northeast-1)の場合は以下となります。

- Workspace VPC endpoint service: `com.amazonaws.vpce.ap-northeast-1.vpce-svc-02691fd610d24fd64`
- Back-end SCC relay service: `com.amazonaws.vpce.ap-northeast-1.vpce-svc-02aa633bda3edbec0`

**サービスカテゴリ**で**サービスを名前で検索**を選択し、上のエンドポイントサービスで検索を行います。

**VPC**は上で作成したVPCを選択します。**サブネット**は**databricks-vpce**のみを選択します。
![Screen Shot 2021-11-01 at 20.30.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/881db666-da80-f35c-5c6a-513760f92966.png)

**セキュリティグループ**は**pl-sg-2**を選択します。
![Screen Shot 2021-11-01 at 20.30.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3abbbbe2-c483-f8d6-f266-ae68a7b712ec.png)

作成するとステータスが「承諾の保留中」となりますが問題ありません。Back-end SCC relay serviceについても同じ設定を行います。
![Screen Shot 2021-11-01 at 20.32.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/24684d33-c803-a7af-e3bd-f9ad7311ed54.png)
![Screen Shot 2021-11-01 at 20.32.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3bdf7d23-355d-21a9-1413-e828d2fa445e.png)

この様な状態になります。次のステップで使用するので、作成した2つのエンドポイントID(Workspace VPC endpoint service/Back-end SCC relay service)をメモしておきます。
![Screen Shot 2021-11-01 at 20.34.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/752ea2e1-d5f5-c2d2-3e9b-d8995e2c2312.png)

### S3 VPCゲートウェイエンドポイント

**サービスカテゴリ**でAWS サービスを選択し、S3で検索します。結果からGatewayタイプの「com.amazonaws.ap-northeast-1.s3(東京リージョンの場合)」を選択します。**VPC**には上で作成したVPCを選択します。
![Screen Shot 2021-11-01 at 20.38.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d9fea844-d7f8-b57e-89d4-c2b833fa65d6.png)

**ルートテーブル**では、メインルートテーブルを選択します。これによって、ワークスペース用サブネットにアタッチされます。
![Screen Shot 2021-11-01 at 20.39.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ec119c9e-c5d6-9f7b-bd19-89b2df1f75d4.png)

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

**サービスカテゴリ**でAWS サービスを選択し、stsで検索します。結果からInterfaceタイプの「com.amazonaws.ap-northeast-1.sts(東京リージョンの場合)」を選択します。**VPC**には上で作成したVPCを選択します。**サブネット**には**databricks-ws-1**と**databricks-ws-2**を選択します。
![Screen Shot 2021-11-01 at 20.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5be516dc-4088-8585-0d20-bcc119a7957f.png)

**セキュリティグループ**には、ワークスペース用の**pl-sg-1**を選択します。
![Screen Shot 2021-11-01 at 20.43.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/290d8465-185c-6246-baf0-c0e5a7d85f4b.png)

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

**サービスカテゴリ**でAWS サービスを選択し、kinesisで検索します。結果からInterfaceタイプの「com.amazonaws.ap-northeast-1.kinesis-streams(東京リージョンの場合)」を選択します。**VPC**には上で作成したVPCを選択します。**サブネット**には**databricks-ws-1**と**databricks-ws-2**を選択します。
![Screen Shot 2021-11-01 at 20.46.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1380cd10-92fb-2bd2-049a-f17a9d9e4792.png)

**セキュリティグループ**には、ワークスペース用の**pl-sg-1**を選択します。
![Screen Shot 2021-11-01 at 20.46.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3f08eb79-0f8d-73be-c37a-cc1602dbeba4.png)

ここまで設定すると以下の様になります。
![Screen Shot 2021-11-01 at 20.48.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7c40e3ac-0574-7165-99fe-85271975084c.png)

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

以降はAccount APIを操作します。ローカル環境でコマンドプロンプト、ターミナルなどを開いてください。ここでは、以下のツールを使用します。

- curl
- jq

以下の情報をメモしておいてください。

- DatabricksアカウントID
- [アカウントオーナー](https://qiita.com/taka_yayoi/items/c53beee557ae4a9643ac)のメールアドレスおよびパスワード
- 作成した2つのエンドポイントID(Workspace VPC endpoint service/Back-end SCC relay service)

### Workspace VPC endpoint serviceの登録

```bash
curl -X POST -u <アカウントオーナーのメールアドレス>:<アカウントオーナーのパスワード> \
'https://accounts.cloud.databricks.com/api/2.0/accounts/<DatabricksアカウントID>/vpc-endpoints' \
-d '{
"vpc_endpoint_name": "workspace-rest-api",
"region": "ap-northeast-1",
"aws_vpc_endpoint_id": "<Workspace VPC endpoint serviceのVPCエンドポイントID>"
}' | jq
```

結果

```
{
  "vpc_endpoint_id": "17f25981-069f-455f-a116-c2de067ba476",
  "account_id": "<DatabricksアカウントID>",
  "vpc_endpoint_name": "workspace-rest-api",
  "aws_vpc_endpoint_id": "vpce-0c4c07c32f30868b3",
  "aws_endpoint_service_id": "vpce-svc-02691fd610d24fd64",
  "use_case": "WORKSPACE_ACCESS",
  "region": "ap-northeast-1",
  "aws_account_id": "814153277231",
  "state": "pending"
}
```

上の`vpc_endpoint_id`をメモしておきます。

### Back-end SCC relay serviceの登録

以下を実行してエンドポイントを登録します。

```bash
curl -X POST -u <アカウントオーナーのメールアドレス>:<アカウントオーナーのパスワード> \
'https://accounts.cloud.databricks.com/api/2.0/accounts/<DatabricksアカウントID>/vpc-endpoints' \
-d '{
"vpc_endpoint_name": "scc-relay",
"region": "ap-northeast-1",
"aws_vpc_endpoint_id": "<Back-end SCC relay serviceのVPCエンドポイントID>"
}' | jq
```

結果

```
{
  "vpc_endpoint_id": "2a25fd2a-3dde-4a8f-9dc7-187b1239aac2",
  "account_id": "<DatabricksアカウントID>",
  "vpc_endpoint_name": "scc-relay",
  "aws_vpc_endpoint_id": "vpce-0499045ba03fa9c95",
  "aws_endpoint_service_id": "vpce-svc-02aa633bda3edbec0",
  "use_case": "DATAPLANE_RELAY_ACCESS",
  "region": "ap-northeast-1",
  "aws_account_id": "814153277231",
  "state": "pending"
}
```

上の`vpc_endpoint_id`をメモしておきます。

これですべてのエンドポイントが使用可能になります。
![Screen Shot 2021-11-01 at 21.02.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3ee9ecdb-c6ba-88c8-2b78-bda311c03d03.png)

## VPCエンドポイントのプライベートDNS名を有効化する

VPCエンドポイントサービス(Workspace VPC endpoint service)、VPCエンドポイントサービス(Back-end SCC relay service)が「使用可能」になったら、これらのプライベートDNS名を有効にします。

エンドポイントを選択し、アクションから**プライベートDNS名の変更**を選択します。**プライベート DNS 名を有効にする**の**このエンドポイントで有効にする**のチェックを入れて、**プライベートDNS名の変更**をクリックします。この操作をVPCエンドポイントサービス(Workspace VPC endpoint service)、VPCエンドポイントサービス(Back-end SCC relay service)両方に対して行います。
![Screen Shot 2021-11-01 at 21.07.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/141b9ac5-93f4-9b3a-8aba-c796728ecf73.png)

ステータスが「保留中」になりますが、少し待てば「使用可能」になります。

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

以下を実行してプライベートアクセス設定オブジェクトを作成します。`public_access_enabled`はアクセス経路を決定する重要なパラメーターとなります。[こちら](https://qiita.com/taka_yayoi/items/c6bdbb6452f6a0895961#%E3%82%B9%E3%83%86%E3%83%83%E3%83%975-databricks-account-api%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E8%A8%AD%E5%AE%9A%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)を一読ください。以下の様にtrueと設定している場合には、ワークスペースはVPCエンドポイントに加えて、公衆ネットワークからもアクセスできます。完全にロックダウンしたい場合には、PrivateLinkフロントエンド接続も有効化した上で、このパラメーターをfalseに設定します。

```bash
curl -X POST -u <アカウントオーナーのメールアドレス>:<アカウントオーナーのパスワード> \
'https://accounts.cloud.databricks.com/api/2.0/accounts/<DatabricksアカウントID>/private-access-settings' \
-d '{
"private_access_settings_name": "private_access_settings2 for ap-northeast-1",
"region": "ap-northeast-1",
"public_access_enabled": true
}' | jq
```

結果

```
{
  "private_access_settings_id": "1d0c1cd7-2b24-499b-b71c-e7f3936549a8",
  "account_id": "<DatabricksアカウントID>",
  "private_access_settings_name": "private_access_settings2 for ap-northeast-1",
  "region": "ap-northeast-1",
  "public_access_enabled": true,
  "private_access_level": "ANY"
}
```

上の`private_access_settings_id`をメモしておきます。

## ネットワークオブジェクトの作成

これまでに準備した設定を用いて、PrivateLink用のネットワークオブジェクトを作成します。

```bash
curl -X POST -u <アカウントオーナーのメールアドレス>:<アカウントオーナーのパスワード> \
'https://accounts.cloud.databricks.com/api/2.0/accounts/<DatabricksアカウントID>/networks' \
-d '{
"network_name": "databricks-privatelink",
"vpc_id": "<VPC privatelink-testのid>",
"subnet_ids": [
"<サブネットdatabricks-ws-1のid>",
"<サブネットdatabricks-ws-2のid>"
],
"security_group_ids": [
"<セキュリティグループpl-sg-1のid>"
],
"vpc_endpoints": {
"dataplane_relay": [
"<Back-end SCC relay serviceの登録時に取得したvpc_endpoint_id>"
],
"rest_api": [
"<Workspace VPC endpoint serviceの登録時に取得したvpc_endpoint_id>"
]
}
}' | jq
```

結果

```
{
  "network_id": "5f58cf31-cb33-4d65-ae43-41856cbe8e72",
  "account_id": "<DatabricksアカウントID>",
  "vpc_id": "<VPC privatelink-testのid>",
  "subnet_ids": [
    "<サブネットdatabricks-ws-1のid>",
    "<サブネットdatabricks-ws-2のid>"
  ],
  "security_group_ids": [
    "sg-079cbd8733ab82c30"
  ],
  "vpc_status": "UNATTACHED",
  "network_name": "databricks-privatelink",
  "creation_time": 1635769375362,
  "vpc_endpoints": {
    "rest_api": [
      "<Workspace VPC endpoint serviceの登録時に取得したvpc_endpoint_id>"
    ],
    "dataplane_relay": [
      "<Back-end SCC relay serviceの登録時に取得したvpc_endpoint_id>"
    ]
  }
}
```

上の`network_id`をメモしておきます。

## ワークスペースの配備

以下を実行して、ワークスペースをデプロイします。

```bash
curl -X POST -u <アカウントオーナーのメールアドレス>:<アカウントオーナーのパスワード> \
'https://accounts.cloud.databricks.com/api/2.0/accounts/<DatabricksアカウントID>/workspaces' \
-d '{
"workspace_name": "ワークスペース名",
"deployment_name": "デプロイメント名",
"aws_region": "<デプロイするリージョン>",
"credentials_id": "<事前準備で取得したcredentials_id>",
"storage_configuration_id": "<事前準備で取得したstorage_configuration_id>",
"network_id": "<上で取得したnetwork_id>",
"private_access_settings_id": "<上で取得したprivate_access_settings_id>"
}' | jq
```

結果

```
{
  "workspace_id": 3180937440650220,
  "workspace_name": "privatelink-test",
  "aws_region": "ap-northeast-1",
  "creation_time": 1635769961845,
  "deployment_name": "tydatabricks-privatelink-test",
  "workspace_status": "PROVISIONING",
  "account_id": "<DatabricksアカウントID>",
  "credentials_id": "<事前準備で取得したcredentials_id>",
  "storage_configuration_id": "<事前準備で取得したstorage_configuration_id>",
  "workspace_status_message": "Workspace resources are being set up.",
  "network_id": "<上で取得したnetwork_id>",
  "pricing_tier": "ENTERPRISE",
  "private_access_settings_id": "<上で取得したprivate_access_settings_id>"
}

```

## メタストアの設定

アウトバウンド接続をサポートしないように、ワークスペースVPCをロックダウンした場合、AWSがRDSに対するJDBCトラフィックのPrivateLinkをサポートしていないため、ワークスペースからDatabricks管理のメタストア(RDSベースのHiveメタストア)にはアクセスできなくなります。一つの選択肢としては、リージョンごとにDatabricksが提供するメタストアのFQDNあるいはIPを、イグレスファイアウォール、インターネットゲートウェイに対するパブリックルートテーブル、NATゲートウェイをホスティングするパブリックサブネットに対するネットワークACLのいずれかに対して設定するというものです。この場合、Databricksが提供するメタストアへのトラフィックは、パブリックネットワークを経由することになります。しかし、Databricks管理のメタストアにパブリックネットワーク経由でアクセスしたくない場合には、以下のいずれかの選択肢となります。

- お使いのVPCに外部メタストアをデプロイします。詳細は[External Apache Hive metastore](https://docs.databricks.com/data/metastores/external-hive-metastore.html)を参照ください。
- メタストアとしてAWS Glueを使用できます。GlueはPrivateLinkをサポートしています。[Use AWS Glue Data Catalog as the metastore for Databricks Runtime](https://docs.databricks.com/data/metastores/aws-glue-metastore.html)を参照ください。

以下では、メタストアとしてAWS Glueを使用する際の手順を説明します。なお、DatabricksをデプロイしているAWSアカウントとGlueが動作するAWSアカウントは同一であると想定しています。

### Glueカタログエンドポイントの作成

外部メタストア、あるいはGlueに接続するためのエンドポイントを作成します。

**サービスカテゴリ**でAWS サービスを選択し、glueで検索します。結果からInterfaceタイプの「com.amazonaws.ap-northeast-1.glue(東京リージョンの場合)」を選択します。**VPC**には上で作成したVPCを選択します。**サブネット**には**databricks-ws-1**と**databricks-ws-2**を選択します。
![Screen Shot 2021-11-02 at 6.36.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b0088317-68d9-c3c2-3d71-76e64d6543f5.png)

**セキュリティグループ**には、ワークスペース用の**pl-sg-1**を選択します。
![Screen Shot 2021-11-02 at 6.37.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/68f3a9d7-0854-f7b4-8c3c-313888377dcd.png)

### Glueカタログにアクセスするためのインスタンスプロファイルの作成

1. AWSコンソールでIAMサービスにアクセスします。
1. サイドバーからロールを選択します。
1. **ロールを作成**をクリックします。
1. **信頼されたエンティティの種類を選択**では**AWSサービス**、**ユースケースの選択**では**EC2**を選択します。**次のステップ:アクセス権限**をクリックします。
1. **次のステップ:タグ**、**次のステップ:確認**をクリックします。
1. ロール名を入力して、**ロールの作成**をクリックします。
![Screen Shot 2021-11-02 at 7.24.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d1ab0f63-b2de-9bac-8c2a-3b7317a57058.png)
1. ロールの一覧で先ほど作成したロールを検索してクリックします。**インラインポリシーの追加**をクリックします。
![Screen Shot 2021-11-02 at 7.26.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5b824d5c-12a3-bc51-6364-2f03fc2349a9.png)
1. JSONタブをクリックします。
![Screen Shot 2021-11-02 at 7.27.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7efa9147-882d-036c-dcaa-c809bedf82c4.png)
1. 以下の内容を貼り付けます。

    ```json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "GrantCatalogAccessToGlue",
          "Effect": "Allow",
          "Action": [
            "glue:BatchCreatePartition",
            "glue:BatchDeletePartition",
            "glue:BatchGetPartition",
            "glue:CreateDatabase",
            "glue:CreateTable",
            "glue:CreateUserDefinedFunction",
            "glue:DeleteDatabase",
            "glue:DeletePartition",
            "glue:DeleteTable",
            "glue:DeleteUserDefinedFunction",
            "glue:GetDatabase",
            "glue:GetDatabases",
            "glue:GetPartition",
            "glue:GetPartitions",
            "glue:GetTable",
            "glue:GetTables",
            "glue:GetUserDefinedFunction",
            "glue:GetUserDefinedFunctions",
            "glue:UpdateDatabase",
            "glue:UpdatePartition",
            "glue:UpdateTable",
            "glue:UpdateUserDefinedFunction"
          ],
          "Resource": [
            "*"
          ]
        }
      ]
    }
    ```

1. **ポリシーの確認**、ポリシーの名前を入力して**ポリシーの作成**をクリックします。

![Screen Shot 2021-11-02 at 7.29.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6d53a1de-6a29-f45c-7d0e-84c020eec9f4.png)

### Databricksデプロイメントに使用したIAMロールの設定

1. Account Consoleから当該ワークスペースをクリックすることで表示される画面の**Credentials**の**Role ARN**で確認できます。
![Screen Shot 2021-11-02 at 7.32.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4a66ca19-c551-7a8f-41c7-80a4b371f7b7.png)

    上の例では`databricks-role`となります。IAMロール一覧で、こちらのロールを検索しクリックします。

1. アクセス権限タブで表示されるポリシー名をクリックし、**ポリシーの編集**をクリックします。
![Screen Shot 2021-11-02 at 7.35.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/27fd7547-9ca3-5429-418f-6b98f153b479.png)
1. [Glueにアクセスするためのインスタンスプロファイルの作成](#glueカタログにアクセスするためのインスタンスプロファイルの作成)で作成したインスタンスプロファイルを、SparkクラスターのEC2インスタンスに引き渡すことを許可する様にポリシーを変更します。以下の`<aws-account-id-databricks>`をDatabricksをデプロイする際にお使いのAWSアカウントID、`<iam-role-for-glue-access>`を[Glueにアクセスするためのインスタンスプロファイルの作成](#glueカタログにアクセスするためのインスタンスプロファイルの作成)で作成したロールで置き換えてください。その後で変更を保存してください。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1403287045000",
      "Effect": "Allow",
      "Action": [
        "ec2:AssociateDhcpOptions",
        "ec2:AssociateIamInstanceProfile",
        "ec2:AssociateRouteTable",
        "ec2:AttachInternetGateway",
        "ec2:AttachVolume",
        "ec2:AuthorizeSecurityGroupEgress",
        "ec2:AuthorizeSecurityGroupIngress",
        "ec2:CancelSpotInstanceRequests",
        "ec2:CreateDhcpOptions",
        "ec2:CreateInternetGateway",
        "ec2:CreatePlacementGroup",
        "ec2:CreateRoute",
        "ec2:CreateSecurityGroup",
        "ec2:CreateSubnet",
        "ec2:CreateTags",
        "ec2:CreateVolume",
        "ec2:CreateVpc",
        "ec2:CreateVpcPeeringConnection",
        "ec2:DeleteInternetGateway",
        "ec2:DeletePlacementGroup",
        "ec2:DeleteRoute",
        "ec2:DeleteRouteTable",
        "ec2:DeleteSecurityGroup",
        "ec2:DeleteSubnet",
        "ec2:DeleteTags",
        "ec2:DeleteVolume",
        "ec2:DeleteVpc",
        "ec2:DescribeAvailabilityZones",
        "ec2:DescribeIamInstanceProfileAssociations",
        "ec2:DescribeInstanceStatus",
        "ec2:DescribeInstances",
        "ec2:DescribePlacementGroups",
        "ec2:DescribePrefixLists",
        "ec2:DescribeReservedInstancesOfferings",
        "ec2:DescribeRouteTables",
        "ec2:DescribeSecurityGroups",
        "ec2:DescribeSpotInstanceRequests",
        "ec2:DescribeSpotPriceHistory",
        "ec2:DescribeSubnets",
        "ec2:DescribeVolumes",
        "ec2:DescribeVpcs",
        "ec2:DetachInternetGateway",
        "ec2:DisassociateIamInstanceProfile",
        "ec2:ModifyVpcAttribute",
        "ec2:ReplaceIamInstanceProfileAssociation",
        "ec2:RequestSpotInstances",
        "ec2:RevokeSecurityGroupEgress",
        "ec2:RevokeSecurityGroupIngress",
        "ec2:RunInstances",
        "ec2:TerminateInstances"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "arn:aws:iam::<aws-account-id-databricks>:role/<iam-role-for-glue-access>"
    }
  ]
}
```

### DatabricksワークスペースでGlueカタログインスタンスプロファイルを設定

1. Adminコンソールに移動します。
1. **Instance Profiles**タブに移動します。
1. **Add Instance Profile**ボタンをクリックするとダイアログが表示されます。
1. [Glueにアクセスするためのインスタンスプロファイルの作成](#glueにアクセスするためのインスタンスプロファイルの作成)で作成した**インスタンスプロファイルARN**を貼り付けます。
1. **Add**をクリックします。

### Glueカタログのインスタンスプロファイルを設定してクラスターを起動

1. Databricksクラスターを作成します。
1. クラスター作成ページの**Instances**タブをクリックします。
1. **Instance Profiles**で、先ほど作成したインスタンスプロファイルを選択します。
![Screen Shot 2021-11-02 at 7.56.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/feec68ab-ae6b-c377-85f7-a8bb2b24eb0e.png)
1. **Spark**タブの**Spark Config**で`spark.databricks.hive.metastore.glueCatalog.enabled true`を追加します。
![Screen Shot 2021-11-02 at 7.59.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4d4cbfa4-a07c-98ca-66e2-e335506c0980.png)
1. クラスターを起動します。
1. ノートブックで以下のコマンドを実行し、メタストアが稼働していることを確認します。
![Screen Shot 2021-11-02 at 8.03.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ceb6112d-f69b-06f3-6f4e-916a61bff3f4.png)

## Databricks SQLの設定

上記外部メタストアにアクセスするように、Databricks SQLの設定を行います。詳細は[Data access configuration](https://docs.databricks.com/sql/admin/data-access-configuration.html)をご覧ください。

1. ペルソナが**SQL**の状態のサイドメニューから、**Settings** > **SQL Admin Console**にアクセスします。
1. SQL Endpoint Settingsで以下の設定を行います。
    1. **Instance Profile**で[Glueにアクセスするためのインスタンスプロファイルの作成](https://qiita.com/drafts/1ca54463469df05dd3ee/edit#glue%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90)で作成したインスタンスプロファイルを選択します。
    1. **Data Access Configuration**に`spark.databricks.hive.metastore.glueCatalog.enabled true`を入力します。
![Screen Shot 2021-11-05 at 9.06.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a6915996-3375-902f-2bec-6138e525c358.png)
    1. **Save**をクリックします。
1. SQLエンドポイントを起動し、Glueに対するクエリーが成功することを確認します。
![Screen Shot 2021-11-05 at 9.14.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5be477b1-68ae-e245-6362-d9cf4b9ddc9c.png)


## 外部リポジトリに対するアクセスの検討

pypi(python)やCRAN(R)などの公開ライブラリリポジトリにアクセスしたいと考えるかもしれません。これらにアクセスするには、完全なアウトバウンドロックダウンモードでのデプロイモードを再考するか、自身のアーキテクチャで必要なリポジトリにアクセスできるようにイグレスファイアウォールを使用してください。ご自身のデプロイメントの全体アーキテクチャは、ご自身の要件に依存します。質問がある場合には、Databricks担当にお問い合わせください。

> **注意**
外部にアクセスさせないロックダウン構成では、MLflowのモデルサービングは動作しません。

# 動作確認

デプロイメントに成功するとアカウントオーナーにワークスペースのURLが記載されたメールが届きます。あるいは、Account Consoleにワークスペースのリンクが表示されます。
![Screen Shot 2021-11-01 at 21.38.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b1a0b529-639e-58ce-44aa-806ba623e268.png)

- ワークスペースにアクセスし、アカウントオーナーでログインします。
- サイドメニュー**Compute**にアクセスし、最小構成のクラスターを作成して起動します。
- クラスターが起動すれば、設定は成功です。
![Screen Shot 2021-11-01 at 21.42.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8a4855f3-24d2-137f-7d29-d3574fb6bc2e.png)

- 以下の様な処理を実行して、外部に接続できないことを確認することもできます。
![Screen Shot 2021-11-01 at 21.47.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/67cfdee5-2841-0966-8ebe-3785c31ac65d.png)

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

- [Databricksワークスペース\(E2\)作成時のトラブルシューティング](https://qiita.com/taka_yayoi/items/483f3392a7b40b89c152)
- [Databricks PrivateLink構成における設定確認](https://qiita.com/taka_yayoi/items/7a856ba770eb932fac70)

### Databricks 無料トライアル

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