DatabricksにおけるAWS PrivateLinkの有効化

[Enable AWS PrivateLink \| Databricks on AWS](https://docs.databricks.com/administration-guide/cloud-configurations/aws/privatelink.html) [2022/8/22時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

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

:::note
**プレビュー**
この機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

この記事では、ユーザーとお使いのDatabricksワークスペース間、Databricksワークスペースのインフラストラクチャにおけるデータプレーンのクラスターとコントロールプレーンのコアサービス間で、プライベート接続を有効化するために、どのようにAWS PrivateLinkを活用するのかを説明します。

具体的な設定手順に関しては、以下を参照ください。

- [DatabricksにおけるAWS PrivateLinkのフロントエンド接続の設定\(実践編\)](https://qiita.com/taka_yayoi/items/4f08a48e431c38b8bca5)
- [\[2024年版\] DatabricksにおけるAWS PrivateLinkのバックエンド接続の設定\(実践編\)](https://qiita.com/taka_yayoi/items/cf0afda292404bc03412)

:::note warn
**重要!**
この記事では、Databricksプラットフォームにおけるコンピュートレイヤーである*データプレーン*という単語に言及します。この記事の文脈においてデータプレーンは、お使いのAWSアカウントににおけるクラシックなデータプレーンを指します。一方、[サーバーレスSQLウェアハウス(パブリックプレビュー)](https://docs.databricks.com/sql/admin/serverless.html)をサポートするサーバーレスデータプレーンは、DatabricksのAWSアカウントで動作します。詳細は、[サーバーレスコンピュート](https://docs.databricks.com/serverless-compute/index.html)を参照ください。
:::

# 概要

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と[セキュアクラスター接続](https://qiita.com/taka_yayoi/items/f2db6631b264b0956413)のリレーです。このタイプのPrivateLinkでは、二つの異なるサービスを使用するため、二つの異なるVPCインタフェースエンドポイントが必要となります。

フロントエンド、バックエンドPrivateLink接続の両方を実装することもできますし、どちらか一方のみを実装することもできます。この記事では、どちらか一方、あるいは両方のPrivateLink接続タイプの設定方法を説明します。フロントエンドとバックエンドの接続に対してPrivateLinkの両方を実装した場合には、任意でワークスペースへのプライベート接続を強制することができ、この場合にはDatabricksは公衆ネットワーク経由の接続を拒否します。どちらかの接続タイプを実装しない場合には、この要件を強制することはできません。

PrivateLink接続を有効化するには、Databricks設定オブジェクトを作成し、既存の設定オブジェクトに新たなフィールドを追加する必要があります。

設定オブジェクトを作成し、ワークスペースを作成(更新)するために、本書では[アカウントコンソール](#アカウントコンソールを使用)や[Account APIの使用方法](#account-apiを使用)を説明します。

既存ワークスペースのPrivateLink構成へのアップデートはサポートされていますが、新規のプライベートアクセス設定オブジェクトでワークスペースをアップデートするために、アカウントコンソールやAccount APIを使用することはできません。既存ワークスペースに対してPrivateLink構成をセットアップするには、ネットワーク設定オブジェクトとプライベートアクセス設定オブジェクトを作成し、新たなネットワーク設定オブジェクトとプライベートアクセス設定オブジェクトを用いてワークスペースをアップデートするようにDatabricks担当にコンタクトしてください。

このプレビューリリースでは、PrivateLink構成でのUnity Catalogの利用はサポートされていません。

以下の表では、重要な用語を説明しています。

| 用語 | 説明 |
|:--|:--|
|AWS PrivateLink   |公衆ネットワークを経由せずに、AWS VPCやオンプレミスネットワークからAWSサービスにプライベート接続するためのAWSテクノロジーです。   |
|フロントエンドPrivateLink   |ユーザーからDatabricksウェブアプリケーション、REST API、Databricks Connect APIに接続するためのPrivateLink接続です。|
|バックエンドPrivateLink   |お使いのAWSアカウントの[データプレーン](https://qiita.com/taka_yayoi/items/7d209bc8d32bc5f2dba4)からDatabricks[コントロールプレーン](https://qiita.com/taka_yayoi/items/7d209bc8d32bc5f2dba4)に接続するためのPrivateLink接続です。|
|AWS VPCエンドポイントサービス   |AWS VPCエンドポイントサービスは、PrivateLinkによって提供されるサービスです。それぞれのDatabricksのコントロールプレーン(多くの場合リージョンあたり一つ)はPrivateLinkのために2つのAWS VPCエンドポイントを公開しています。ワークスペースVPCエンドポイントサービスは、DatabricksフロントエンドPrivateLink接続、REST APIに対するDatabricksバックエンドPrivateLink接続の両方に適用されます。また、[セキュアクラスター接続](https://docs.databricks.com/security/secure-cluster-connectivity.html)のリレーのために別のVPCエンドポイントサービスを公開します。   |
|AWS VPCエンドポイント   |[AWS VPCインタフェースエンドポイント](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html)によって、お使いのVPCとAWS PrivateLinkによって提供されるVPCエンドポイント間のプライベート接続が可能となります。AWS VPCインタフェースエンドポイントを作成し、[Account API](https://docs.databricks.com/dev-tools/api/latest/account.html)を用いてDatabricksに登録する必要があります。VPCエンドポイントを登録することで、VPCエンドポイントを参照するDatabricks固有のオブジェクトを作成します。   |
|Databricksネットワーク設定   |[顧客管理VPC](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe)に関する重要な情報を記述するDatabricksオブジェクトです。PrivateLink接続(フロントエンド、あるいはバックエンド)を実装した際には、お使いのワークスペースでは顧客管理VPCを使用する必要があります。バックエンドのみをサポートするPrivateLinkにおいては、バックエンド接続のためのVPCエンドポイントを識別するための追加のプロパティが必要となります。   |
|Databricksプライベートアクセス設定オブジェクト   |ワークスペースのPrivateLink接続を記述するDatabricksオブジェクトです。ワークスペースの作成を行う際に、フロントエンド、バックエンド、あるいは両方を用いる際に、プライベートアクセス設定オブジェクトをワークスペースにアタッチする必要があります。これは、ワークスペースにおけるAWS PrivateLinkの使用法を表現します。公衆ネットワークのアクセスにおけるフロントエンドのAWS PrivateLinkのユースケースの設定をコントロールします。お使いのワークスペースにどのVPCエンドポイントの接続を許可するのかをコントロールします。  |
|Databricksワークスペース設定オブジェクト   |ワークスペースを記述するDatabricksオブジェクトです。PrivateLinkを有効化するためには、このオブジェクトがDatabricksプライベートアクセス設定オブジェクトを参照する必要があります。バックエンドPrivateLinkにおいては、どの登録VPCエンドポイントを使用するのかを指定する2つの追加フィールドを持つDatabricksネットワーク設定オブジェクトを指定する必要があります。1つはコントロールプレーンのセキュアクラスター接続リレーのためのものであり、もう一つはREST APIにアクセスするためにワークスペースに接続するためのものです。   |

以下の図では、典型的な実装におけるネットワークフローを示しています。
![](https://docs.databricks.com/_images/privatelink-network.png)

# 前提条件

**Databricksアカウント:**

- DatabricksアカウントはE2バージョンプラットフォームである必要があります。
- Databricksアカウントは[Enterprise pricing tier](https://databricks.com/product/aws-pricing)である必要があります。
- DatabricksアカウントIDが必要です。アカウントIDは[アカウントコンソール](https://docs.databricks.com/administration-guide/account-settings-e2/account-console-e2.html)で確認できます。

**Databricksワークスペース:**

- お使いのワークスペースは、[E2バージョンのプラットフォームをサポートしているAWSリージョン](https://docs.databricks.com/administration-guide/cloud-configurations/aws/regions.html)にある必要があります。しかし、`us-west-1`リージョンではE2バージョンのプラットフォームであってもPrivateLinkをサポートしていません。
- (フロントエンド接続であったとしても)Databricksワークスペースでは、PrivateLink接続を追加するために[顧客管理VPC](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe)を使用する必要があります。Databricks管理のVPCにある既存ワークスペースをアップデートすることはできず、顧客管理VPCに切り替える必要があることに注意してください。
- バックエンドのPrivateLink接続を実装する際には、Databricksワークスペースは[セキュアクラスター接続](https://qiita.com/taka_yayoi/items/f2db6631b264b0956413)を使用している必要がありますが、これはE2バージョンのプラットフォームで作成された新規ワークスペースではデフォルトとなっています。しかし、セキュアクラスター接続を使用していない既存ワークスペースにバックエンドPrivateLinkを追加する際には、Databricks担当にコンタクトいただきガイドを受けてください。

**AWSアカウント権限:**

- あなたがPrivateLinkを設定するのであれば、Databricksワークスペースを配備し、ワークスペースのための新規VPCエンドポイントを配備するのに必要なAWS権限を持っている必要があります。

**ネットワークアーキテクチャ:**

- オンプレミスのネットワークからワークスペースに対して、フロントエンドのPrivateLinkを実装する際には、PrivateLinkを設定する前に、Direct ConnectあるいはVPNを用いて当該ネットワークからAWSネットワークに対してプライベート接続を追加する必要があります。
- 他のネットワークオブジェクトのガイドに関しては、[ステップ1: AWSネットワークオブジェクトを設定する](#ステップ1-awsネットワークオブジェクトを設定する)をご覧ください。


# ステップ1: AWSネットワークオブジェクトを設定する

これらのオブジェクトを作成するためにAWSマネジメントコンソールを使用するか、[Terraform provider for networks](https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/mws_networks)のようなツールを用いてプロセスを自動化することができます。

VPC、サブネット、セキュリティグループを設定するには、以下の手順をふみます。

1. すでにお持ちでなければ、ワークスペース用のVPCをセットアップします。別のワークスペースのVPCを再利用することができますが、ワークスペースごとに別のサブネットを作成する必要があります。それぞれのワークスペースには少なくとも2つのプライベートサブネットが必要となります。
    1. VPCの作成方法に関しては、[顧客管理VPC](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe)をご覧ください。新規ワークスペースを作成するのではなく既存のワークスペースをPrivateLinkにアップデートする際には、対象のワークスペースが顧客管理VPCを使用していることを確認してください。
    1. お使いのVPCで、**DNSホスト名**と**DNS解決**が有効になっていることを確認してください。
    1. サブネットのネットワークACLには以下のポートで`0.0.0.0/0`への**双方向の**(アウトバウンドとインバウンドの)TCPアクセスを許可するルールが設定されれていることを確認してください。
        - 443: Databricksのインフラストラクチャ、クラウドデータソース、ライブラリリポジトリ向け
        - 3306: メタストア向け
        - 6666: PrivateLink向け
        - 2443: コンプライアンスセキュリティプロファイルを使用している場合のみ

       :::note warn
       **重要！**
       ワークスペースで[compliance security profile](https://docs.databricks.com/security/security-profile.html)を使用している場合は、セキュアクラスター接続リレー用のFIPSエンドポイントをサポートするように、ポート2443に対する**双方向の**(アウトバウンドとインバウンドの)アクセスを許可する必要があります。
       :::
1. バックエンドPrivateLinkにおいて、
    1. 追加のVPCサブネットを作成し設定します(オプション)：
        - バックエンドPrivateLink VPCエンドポイントや[他のAWSサービスに対するオプションのVPCエンドポイント](#他のawsサービス向けのvpcエンドポイントを追加する推奨ですがオプションです)などお使いのVPCエンドポイントに対して、VPCエンドポイントにネットワークが疎通する限り、任意のワークスペースのサブネットの中にVPCエンドポイントを作成することができます。
        - ワークスペースのサブネットにアタッチされるルートテーブルとは別のルートテーブルをVPCエンドポイントのサブネットのアタッチします。VPCエンドポイントのサブネットのルートテーブルにはローカルVPCへのデフォルトルートのみが必要となります。
    1. 追加のセキュリティグループを作成し設定します(必須)：
        - 通常のワークスペースに必要となるセキュリティグループの設定に加えて、ワークスペースのサブネット、作成している場合には別のVPCエンドポイントのサブネットから`HTTPS/443`と`TCP/6666`のアウトバウンドアクセスのみを許可します。この設定によって、ワークスペースによるREST API(ポート443)へのアクセスとセキュアクラスター接続(ポート6666)のアクセスを許可します。これによって、両方の目的においてセキュリティグループの共有が容易になります。

       :::note warn
       **重要！**
       ワークスペースで[compliance security profile](https://docs.databricks.com/security/security-profile.html)を使用している場合は、セキュアクラスター接続リレー用のFIPSエンドポイントをサポートするように、ポート2443に対する**双方向の**(アウトバウンドとインバウンドの)アクセスを許可する必要があります。
       :::
1. フロントエンドPrivateLinkにおいて、
    - トランジットVPCとサブネットに関しては、ユーザー環境から到達可能なAWS VPCとサブネットを使用してください。お使いのAWS Direct ConnectあるいはVPNゲートウェイ接続をターミネートするトランジットVPC、あるいはお使いのトランジットVPCからルーティング可能なものを作成してください。
    
        フロントエンドPrivateLinkとバックエンドPrivateLinkの両方を有効化した場合、ワークスペースのサブネットからVPCエンドポイントにネットワーク到達可能な場合、フロントエンドワークスペース(Webアプリケーション)VPCエンドポイントをバックエンドワークスペース(REST API)VPCエンドポイントと共有することができます。

    - エンドポイントに対して新たにセキュリティグループを作成してください。このセキュリティグループでは、ソースネットワークとエンドポイントサブネット両方に対して、外向きのHTTPS(443ポート)を許可する必要があります。

# ステップ2: VPCエンドポイントを作成する

## バックエンドVPCエンドポイント

バックエンドPrivateLinkにおいては、二つのVPCエンドポイントを作成します。一つが[セキュアクラスター接続](https://qiita.com/taka_yayoi/items/f2db6631b264b0956413)リレー向けのものです。もう一つが、データプレーンからDatabricks REST APIを呼び出せるようにするためのワークスペース向けのものです。AWSマネジメントコンソールによるVPCエンドポイントの管理に関する一般的なドキュメントについては、[Create VPC endpoints in the AWS Management Console](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html)をご覧ください。AWSマネジメントコンソールページでVPCエンドポイントを作成する際、**Enable DNS name**という**追加の設定**でフィールドを設定することが重要となります。用語が示すように、VPCエンドポイントを参照、編集する際に表示される**Enable Private DNS**や**Enable Private DNS on this endpoint**と同じフィールドとなります。

VPCエンドポイントの作成、管理を自動化するためのツールに関しては、AWSのドキュメント[CloudFormation: Creating VPC Endpoint](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html)と[AWS CLI: create\-vpc\-endpoint](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-vpc-endpoint.html)を参照ください。

バックエンドVPCエンドポイントを、同じ顧客管理VPCを使用している複数のワークスペースで共有することができます。バックエンドVPCエンドポイントを共有するかどうかは、お客様の組織におけるAWSアーキテクチャのベストプラクティス、全てのワークロードにおけるスループット要件に依存します。

- ワークスペースで共有することを決定した場合、すべてのワークスペースのサブネットからルーティング可能な別のサブネットにバックエンドVPCエンドポイントを作成する必要があります。ガイドに関しては、Databricks担当にお問合せください。
- また、ワークスペースが同じ顧客管理VPCを利用している限り、複数のDatabricksアカウントのワークスペースでVPCエンドポイントを共有することができます。この場合、VPCエンドポイントをそれぞれのDatabricksアカウントに登録する必要があります。

以下の手順ではAWSマネジメントコンソールを使用します。[Terraform provider for VPC endpoints](https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/mws_vpc_endpoint)を用いることで、このステップを自動化することも可能です。

AWSマネジメントコンソールでバックエンドVPCエンドポイントを作成するには：

1. AWSマネジメントコンソールの[VPCエンドポイント](https://console.aws.amazon.com/vpc/home#Endpoints:)セクションに移動します。
1. アカウント名ピッカーの隣にある右上のリージョンピッカーを用いて、ワークスペースで使用しているリージョンとマッチしていることを確認してください。必要に応じて、リージョンピッカーでリージョンを変更してください。
1. VPCエンドポイントを作成します。
    1. **Create Endpoint**をクリックします。
    1. リージョンとVPCエンドポイント目的を表現するようなエンドポイント名を指定します。`databricks-us-west-2-workspace-vpce`のようにリージョンと`workspace`という単語を含めることをお勧めします。
    1. **Service Category**で**Other endpoint services**を選択します。
    1. サービス名フィールドにサービス名を貼り付けます。お使いのリージョンにおける2つのリージョナルサービス名を取得するには[リージョナルエンドポイントのリファレンス](#リージョナルエンドポイントのリファレンス)を使用してください。
    
        最初に作成するVPCエンドポイントのために、ワークスペース(REST API)用のリージョナルサービス名をコピーしておきます。
    1. **Verify service**をクリックします。ページで**Service name verified**という緑のボックスが表示されることを確認します。「Service name could not be verified」というエラーに遭遇した場合には、お使いのVPC、サブネット、新規のVPCエンドポイントのリージョンが揃っていることを確認してください。
    1. **VPC**フィールドであなたのVPCを選択します。お使いのワークスペースのVPCを選択します。
    1. **Subnets**セクションでは、お使いのDatabricksワークスペースのサブネットを正確に選択します。関連する内容に関しては、[ステップ1: AWSネットワークオブジェクトを設定する](#ステップ1-awsネットワークオブジェクトを設定する)をご覧ください。
    1. **Security groups**セクションでは、[ステップ1: AWSネットワークオブジェクトを設定する](#ステップ1-awsネットワークオブジェクトを設定する)で作成したバックエンドコネクション用に作成したセキュリティグループを選択します。
    1. **Additional settings**セクションをクリックして展開します。
    1. エンドポイントの**Enable DNS name**フィールドが有効化されていることを確認します。用語が示すように、VPCエンドポイントを参照、編集する際に表示される**Enable Private DNS**や**Enable Private DNS on this endpoint**と同じフィールドとなります。
    1. **Create endpoint**をクリックします。

セキュアクラスター接続リレーに対するリージョナルサービス名を[リージョナルエンドポイントのリファレンス](#リージョナルエンドポイントのリファレンス)から取得し、上の手順を繰り返します。リージョンとVPCエンドポイント目的を表現するようなエンドポイント名を指定します。`databricks-us-west-2-scc-vpce`のようにリージョンと`scc`という単語を含めることをお勧めします。

## フロントエンドVPCエンドポイント

フロントエンドエンドポイントは通常、ユーザーがWebアプリケーションアクセスする際のソースとなるトランジットVPCからスタートし、多くの場合トランジットVPCはオンプレミスのネットワークに接続されています。これは通常はワークスペースのデータプレーンVPCとは別のVPCとなります。Databricks VPCエンドポイントサービスは、フォロンとエンド接続とバックエンドREST API接続に対して同じ共有サービスですが、通常の実装においては、2つの異なるVPCから接続されるので、それぞれのVPCから接続される別のAWS VPCエンドポイントが必要となります。

複数のDatabricksアカウントをお持ちの場合、Databricksアカウント横断でフロントエンドVPCエンドポイントを共有することができます。それぞれの適切なDatabricksアカウントにエンドポイントを登録してください。

以下の手順ではAWSマネジメントコンソールを使用します。[Terraform provider for VPC endpoints](https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/mws_vpc_endpoint)を用いることで、このステップを自動化することも可能です。

AWSマネジメントコンソールでフロントエンドVPCエンドポイントを作成するには：

1. AWSマネジメントコンソールの[VPCエンドポイント](https://console.aws.amazon.com/vpc/home#Endpoints:)セクションに移動します。
1. アカウント名ピッカーの隣にある右上のリージョンピッカーを用いて、**トランジットVPCリージョン**とマッチしていることを確認してください。場合によってはワークスペースのリージョンと異なることがあります。必要に応じて、リージョンピッカーでリージョンを変更してください。
1. VPCエンドポイントを作成します。
    1. **Create Endpoint**をクリックします。
    1. リージョンとVPCエンドポイント目的を表現するようなエンドポイント名を指定します。`databricks-us-west-2-workspace-vpce`のようにリージョンと`workspace`という単語を含めることをお勧めします。
    1. **Service Category**で**Other endpoint services**を選択します。
    1. サービス名フィールドにサービス名を貼り付けます。お使いのリージョンにおける2つのリージョナルサービス名を取得するには[リージョナルエンドポイントのリファレンス](#リージョナルエンドポイントのリファレンス)を使用してください。**Workspace (including REST API)** とラベル付けされているものをコピーしてください。
    1. **Verify service**をクリックします。ページで**Service name verified**という緑のボックスが表示されることを確認します。「Service name could not be verified」というエラーに遭遇した場合には、お使いのVPC、サブネット、新規のVPCエンドポイントのリージョンが揃っていることを確認してください。
    1. **VPC**フィールドでトランジットVPCを選択します。
    1. **Subnets**セクションではサブネットを選択します。関連する内容に関しては、[ステップ1: AWSネットワークオブジェクトを設定する](#ステップ1-awsネットワークオブジェクトを設定する)をご覧ください。
    1. **Security groups**セクションでは、[ステップ1: AWSネットワークオブジェクトを設定する](#ステップ1-awsネットワークオブジェクトを設定する)で作成したフロントエンドコネクション用に作成したセキュリティグループを選択します。
    1. **Create endpoint**をクリックします。

## リージョナルエンドポイントのリファレンス

お使いのリージョンのVPCエンドポイントサービスのドメインを決定するために、以下の表をお使いください。当該リージョンの任意のアベイラビリティゾーンを使用することができます。

リージョンごとの行において、**Workspace (including REST API)** とあるエンドポイントサービスは、フロントエンド接続(webアプリケーション、REST APIのためのユーザー、ワークスペース間の接続)とバックエンド接続(REST APIに対する接続)の両方で使われます。フロントエンドとバックエンド接続の両方を実装する際には、両方のユースケースで同じワークスペースVPCエンドポイントサービスを使用します。

:::note
**注意**
- ネットワーク設定を作成する際にアカウントコンソールを使用している場合には、UIではREST API向けVPCエンドポイントとしてワークスペースのVPCエンドポイントを参照してください。
- 全てのリージョンに関しては[原文](https://docs.databricks.com/administration-guide/cloud-configurations/aws/privatelink.html#regional-endpoint-reference)を参照ください。
:::

| リージョン | これらのVPCエンドポイントサービスに対してVPCエンドポイントを作成します |
|:--|:--|
| ap-northeast-1  | Workspace (including REST API): **com.amazonaws.vpce.ap-northeast-1.vpce-svc-02691fd610d24fd64**<br><br>Secure cluster connectivity relay: **com.amazonaws.vpce.ap-northeast-1.vpce-svc-02aa633bda3edbec0**  |

# ステップ3: PrivateLinkオブジェクトを登録し、ワークスペースにアタッチする

このステップを実行するには2つの方法があります。

- [アカウントコンソールを使用する](#アカウントコンソールを使用)
- [Account APIを使用する](#account-apiを使用)
- [Terraformを使用する](#terraformを使用)

## アカウントコンソールを使用

VPCエンドポイントを登録し、その他必要なワークスペースのリソースを作成、登録し、最後にPrivateLink構成のワークスペースを作成するために[アカウントコンソール](https://docs.databricks.com/administration-guide/account-settings-e2/account-console-e2.html)を使用することができます。

アカウントコンソールでは、PrivateLink構成に必要な幾つかのタイプのオブジェクトが必要となります。

- **VPCエンドポイントの登録(フロントエンド、バックエンド、両方で必要)**: AWSマネジメントコンソールでVPCエンドポイントを作成した後([以前のステップ](#リージョナルエンドポイントのリファレンス)をご覧ください)に、DatabricksでVPCエンドポイント登録を作成するためにこれらを登録します。[VPCエンドポイント向けのアカウントコンソールページ](https://accounts.cloud.databricks.com/cloud-resources/network/vpc-endpoints)を参照ください。
- **ネットワーク設定(バックエンドVPCエンドポイントで必要)**: ネットワーク設定は、顧客管理VPCに関する情報を表現します、。また、2つのバックエンドPrivateLinkの設定フィールドが含まれています。これら2つのフィールドをネットワーク設定オブジェクトに追加します。これらは、AWSで作成した2つのバックエンドVPCエンドポイントをを参照する必要があります。[ネットワーク設定向けのアカウントコンソールページ](https://accounts.cloud.databricks.com/cloud-resources/network/network-configurations)を参照ください。既存のネットワーク設定があり、PrivateLinkのフィールドを追加したい場合は、新規にネットワーク設定を作成する必要があります。
- **プライベートアクセス設定(フロントエンド、バックエンド、両方で必要)**: ワークスペースのプライベートアクセス設定オブジェクトは、AWS PrivateLinkに関する幾つかの設定をカプセル化します。一つのワークスペース向けに新規にプライベートアクセス設定オブジェクトを作成するか、同じAWSリージョンにある複数のワークスペースで共有します。このオブジェクトにはいくつかの目的があります。これは、ワークスペースでどのようにAWS PrivateLinkを使用するのかを表現します。また、AWS PrivateLinkのフロントエンドのユースケースにおける公衆ネットワークアクセスの設定も行います。さらに、ワークスペースに対してどのVPCエンドポイントのアクセスを許可するのかも制御します。

ワークスペース向けのクラウドリソースを定義するために、アカウントコンソールを活用するには二つの方法があります。

- **事前にリソースを作成する**: ワークスペースを作成する前に、[アカウントコンソールのクラウドリソースエリア](https://accounts.cloud.databricks.com/cloud-resources)で必要なクラウドリソースを作成することができます。一度にすべてのステップを実行できない場合や別のチームがネットワークのセットアップやワークスペースの作成を行う際は有用です。
- **ワークスペース作成ページで必要な設定を追加する**: ワークスペースを作成(あるいはアップデート)するページで、別のクラウドリソースを選択するピッカーが表示されます。多くの場合、ポップアップビューですぐにリソースを作成することができるようになっています。例えば、ネットワーク設定のピッカーでは、**Add a new network configuration**というオプションがあります。

本書では、事前にリソースをどのように作成して参照するのかを説明します。必要に応じて他のアプローチを取ることもできます。[VPCエンドポイント](https://docs.databricks.com/administration-guide/account-settings-e2/vpc-endpoints.html)、[ネットワーク設定](https://docs.databricks.com/administration-guide/account-settings-e2/networks.html)、[プライベートアクセス設定](https://docs.databricks.com/administration-guide/account-settings-e2/private-access-settings.html)のエディタをご覧ください。

### ステップ3a: VPCエンドポイント(フロントエンド、バックエンド、両方)を登録する

[Databricksにおけるアカウントコンソールを用いたVPCエンドポイント登録の管理\(E2\)](https://qiita.com/taka_yayoi/items/2b3d7ded7aa8734e8c99)の手順に従ってください。

- バックエンドPrivateLinkでは、作成したバックエンドVPCエンドポイントを登録し、目的に応じて設定名をつけます。例えば、セキュアクラスター接続には`-scc`、ワークスペース(REST APU)VPCエンドポイントの登録には`-workspace`をつけます。バックエンドVPCエンドポイントにおいては、リージョンフィールドは登録しようとしているAWS VPCエンドポイントのリージョンとワークススペースのリージョンで一致する必要があります。しかし、Databricksではワークスペース作成時(あるいはPrivateLink構成にワークスペースをアップデートする際)にのみ検証するので、このステップ注意深くリージョンを設定することが重要です。
- フロントエンドPrivateLinkでは、トランジットVPCに作成したフロントエンドVPCエンドポイントを登録します。フロントエンドPrivateLinkでは、トランジットVPCのリージョンと、フロントエンド接続のためのワークスペースのAWS VPCエンドポイントのリージョンが一致する必要があります。

### ステップ3b: ネットワーク設定を作成する(バックエンド)

[Manage network configurations using the account console \(E2\)](https://docs.databricks.com/administration-guide/account-settings-e2/networks.html)の手順に従ってください。顧客管理VPC、関連するサブネット、セキュリティグループの詳細な要件に関しては、[顧客管理VPC](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe)をご覧ください。PrivateLinkで最も重要なフィールドは**Back-end private connectivity**というタイトルの部分です。以前のステップで作成したバックエンドVPCエンドポイントの登録で選択する2つのフィールドが存在します。最初のものに関しては、*secure cluster connectivity relay*向けのVPCエンドポイント登録を選択し、もう一方では*workspace (REST APIs)* 向けのVPCエンドポイント登録を選択します。

### ステップ3c: PASオブジェクトを作成する(フロントエンド、バックエンド、両方)

プライベートアクセス設定(PAS)オブジェクトを作成することは、PrivateLink設定における重要なステップとなります。[Manage private access settings using the account console \(E2\)](https://docs.databricks.com/administration-guide/account-settings-e2/private-access-settings.html)の手順に従ってください。

- リージョンに関しては、すぐには検証されませんがマッチしていない場合ワークスペースのデプロイメントが失敗するので、ワークスペースのリージョンとマッチしていることを確認してください。
- ワークスペースへのフロントエンド接続(WebアプリケーションとREST API)における公衆ネットワークアクセスをコントロールする**Public access enabled**フィールドを設定します。
    - **False**(デフォルト)に設定すると、PrivateLink接続を用いてのみフロントエンドにアクセスできるようになり、公衆インターネットからはアクセスできなくなります。この場合、公衆ネットワークからのアクセスは許可されていないのでワークスペースにおける[IPアクセスリスト](https://docs.databricks.com/security/network/ip-access-list.html)機能はサポートされません。
    - **True**に設定すると、PrivateLink接続と公衆インターネットからフロントエンドにアクセスできるようになります。オプションとして公衆インターネット(PrivateLinkコネクションではありません)からWebアプリケーションとREST APIにアクセスできるソースネットワークを制限するためにIPアクセスリストを設定することができます。
- どのVPICエンドポイントにワークスペースへのアクセスを許可するのかを指定するために**Private Access Level**を設定します。
    - お使いのDatabricksアカウントに登録されているVPCエンドポイントの接続に限定するためには、**Account**を設定します。
    - 表示されるフィールドに入力することで、明示的に指定したVPCエンドポイントに接続を限定するには**Endpoint**を設定します。これによって、すでに作成した登録VPCエンドポイントを選択することができます。*フロントエンド*VPCエンドポイントを登録している場合には、これを含めるようにしてください。

### ステップ3d: ワークスペースを作成、アップデートする(フロントエンド、バックエンド、両方)

:::note info
**注意**
稼働中のワークスペースでPrivateLinkを有効化することができますが、アカウントコンソールではプライベートアクセス設定オブジェクトの変更をサポートしていません。このステップを実行するにはDatabricksの担当にコンタクトして下さい。ワークスペースで使用したいネットワーク設定名とプライベートアクセス設定オブジェクトを連絡する準備をしてください。ワークスペースではすでに顧客管理VPCを使用しており、セキュアクラスター接続が有効化されている(多くのE2ワークスペースでは有効化されています)必要があります。
:::

以下の手順では、[アカウントコンソールのワークスペースページ](https://accounts.cloud.databricks.com/workspaces)を用いてワークスペースを作成する方法を説明します。

1. ワークスペースを作成するための[ワークスペース作成手順](https://docs.databricks.com/administration-guide/account-settings-e2/workspaces.html#create)に従ってください。ワークスペースURL、リージョン、Unity Catalog、認証設定、ストレージ設定のようなワークスペースのフィールドのガイドに関してはこちらのドキュメントをご覧ください。まだ、**Save**ボタンは押さないでください。
1. 追加フィールドを参照するために**Advanced configurations**をクリックしてください。
1. バックエンドPrivateLinkの場合、ネットワーク設定を選択します。**Virtual Private Cloud**の下のメニューで、作成したDatabricksネットワークを選択します。
1. いかなるPrivateLinkの利用においてもプライベートアクセス設定オブジェクトを選択します。下にある**Private Link**の見出しを参照します。メニューをクリックし、作成したプライベートアクセス設定オブジェクトの名前を選択します。
1. **Save**をクリックします。
1. ワークスペースを作成(アップデート)した後は、利用できるまで、あるいはクラスターを作成できるまで待ちます。ワークスペースのステータスが`RUNNING`になれば、VPCの変更は即座に反映されます。しかし、クラスターを利用、作成できるようになるまでにはさらに20分待つ必要があります。この時間が経過する前にクラスターを作成、利用しようとするとクラスターは起動に成功せず、エラーが発生するか予期しない挙動を示します。
1. [ステップ4: ユーザーリクエストをWebアプリケーションにリダイレクトするように内部DNSを設定する(フロントエンド)](#ステップ4-ユーザーリクエストをwebアプリケーションにリダイレクトするように内部dnsを設定するフロントエンド)に進みます。

## Account APIを使用

### ステップ3a: VPCエンドポイント(フロントエンド、バックエンド、両方)を登録する

[Account API 2\.0](https://docs.databricks.com/dev-tools/api/latest/account.html)を用いて、バックエンドVPCエンドポイントのVPCエンドポイントIDを登録します。それぞれに対して、Databricks VPCエンドポイント登録を作成します。

バックエンドVPCエンドポイントにおいては、同じリージョンで同じ顧客管理VPCを共有している複数のワークスペースがある場合、同じAWS VPCエンドポイントを共有することが可能です。また、複数のDatabricksアカウントでこれらのVPCエンドポイントを共有することも可能で、この場合、それぞれのDatabricksアカウントでAWS VPCエンドポイントを登録します。

フロントエンドVPCエンドポイントにおいて、複数のDatabricksアカウントをお持ちの場合、DatabricksアカウントにまたがってフロントエンドVPCエンドポイントを共有することができます。それぞれの適切なDatabrickaアカウントにエンドポイントを登録します。

DatabricksでVPCエンドポイントを登録するには、`/accounts/<account-id>/vpc-endpoints` REST APIエンドポイントにPOSTリクエストを行い、リクエストボディに以下のフィールドを指定します。

- `vpc_endpoint_name`: Databricksに登録するVPCエンドポイントの名称
- `region`: AWSリージョン名
- `aws_vpc_endpoint_id`: AWSにおけるVPCエンドポイントのID。プレフィックス`vpce-`で始まる文字列です。

以下に例を示します。

```bash:Bash
curl -X POST -n \
  'https://accounts.cloud.databricks.com/api/2.0/accounts/<account-id>/vpc-endpoints' \
  -d '{
  "vpc_endpoint_name": "Databricks front-end endpoint",
  "region": "us-west-2",
  "aws_vpc_endpoint_id": "<vpce-id>"
}'
```

レスポンスのJSONには`vpc_endpoint_id`フィールドが含まれます。バックエンドPrivateLink接続を追加するす際にはこの値を保存しておきます。このIDは、Databricksにおける本設定固有のものとなります。以降のステップ([ステップ3b: ネットワーク設定を作成する(バックエンド)](#ステップ3b-ネットワーク設定を作成するバックエンド))でネットワーク設定を作成する際にこのIDが必要となります。

関連するAccount APIのオペレーションには、以下のようなものがあります。

- [VPCエンドポイントのステータスをチェックする](https://docs.databricks.com/dev-tools/api/latest/account.html#operation/get-vpc-endpoint-config) - レスポンスのJSONの`state`フィールドにはAWSのステータスが含まれます。
- [お使いのアカウントの全てのVPCエンドポイントを取得する](https://docs.databricks.com/dev-tools/api/latest/account.html#operation/get-vpc-endpoints)
- [VPCエンドポイントの登録を解除する](https://docs.databricks.com/dev-tools/api/latest/account.html#operation/delete-vpc-endpoint)

### ステップ3b: ネットワーク設定を作成する(バックエンド)

:::note info
**注意**
フロントエンド接続のみを実装する場合はこのステップをスキップしてください。顧客管理VPCが必要なのでネットワーク設定を作成する必要がありますで、フロントエンドPrivateLink接続のみを実装する場合は、このオブジェクトに対するPrivateLinkの変更はありません。
:::

どちらのPrivateLinkサポートにおいても、[顧客管理VPC](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe)が必要となります。この機能では、VPC、サブネット、セキュリティグループのIDをカプセル化するネットワーク設定オブジェクトの作成が必要となります。

バックエンドPrivateLinkのサポートにおいては、お使いのネットワーク設定には、PrivateLink固有の追加フィールドを含める必要があります。ネットワーク設定の`vpc_endpoints`フィールドは、登録したVPCエンドポイントから返却されるDatabricks固有のVPCエンドポイントIDを参照する必要があります。[ステップ3a: VPCエンドポイント(フロントエンド、バックエンド、両方)を登録する](#ステップ3a-vpcエンドポイントフロントエンドバックエンド両方を登録する)をご覧ください。

このオブジェクトには以下のフィールドの両方を追加します。

- `rest_api`: [ステップ3a: VPCエンドポイント(フロントエンド、バックエンド、両方)を登録する](#ステップ3a-vpcエンドポイントフロントエンドバックエンド両方を登録する)で登録したバックエンドREST API VPCエンドポイントのDatabricks固有のIDを確実に含む一要素のJSON配列を設定します。

    :::note warn
    **重要！**
    [リージョナルエンドポイントのリファレンス](#リージョナルエンドポイントのリファレンス)の表にあるリージョナルエンドポイントを登録した際に生成されるDatabricks固有のIDの使用には注意してください。このフィールドに間違ったIDを指定してエラーになるケースが多々あります。
    :::

- `dataplane_relay`: ステップ3a: VPCエンドポイント(フロントエンド、バックエンド、両方)を登録する](#ステップ3a-vpcエンドポイントフロントエンドバックエンド両方を登録する)で登録したバックエンドSCC VPCエンドポイントのDatabricks固有のIDを確実に含む一要素のJSON配列を設定します。

    :::note warn
    **重要！**
    [リージョナルエンドポイントのリファレンス](#リージョナルエンドポイントのリファレンス)の表にあるリージョナルエンドポイントを登録した際に生成されるDatabricks固有のIDの使用には注意してください。このフィールドに間違ったIDを指定してエラーになるケースが多々あります。
    :::

[ステップ3a: VPCエンドポイント(フロントエンド、バックエンド、両方)を登録する](#ステップ3a-vpcエンドポイントフロントエンドバックエンド両方を登録する)で行うリクエストに対するJSONレスポンスの`vpc_endpoint_id`フィールドからこれらのDatabricks固有のVPCエンドポイントIDを取得することができます。

以下の例では、VPCエンドポイントIDを参照する新たなネットワーク設定を作成しています。`<databricks-vpce-id-for-scc>`をセキュアクラスター接続リレーのDatabricks固有VPCエンドポイントIDで置き換え、`<databricks-vpce-id-for-rest-apis>`をREST API向けのDatabricks固有VPCエンドポイントIDで置き換えてください。

```bash:Bash
curl -X POST -n \
  'https://accounts.cloud.databricks.com/api/2.0/accounts/<account-id>/networks' \
  -d '{
    "network_name": "Provide name for the Network configuration",
    "vpc_id": "<aws-vpc-id>",
    "subnet_ids": [
        "<aws-subnet-1-id>",
        "<aws-subnet-2-id>"
    ],
    "security_group_ids": [
        "<aws-sg-id>"
    ],
    "vpc_endpoints": {
        "dataplane_relay": [
            "<databricks-vpce-id-for-scc>"
        ],
        "rest_api": [
            "<databricks-vpce-id-for-rest-apis>"
        ]
    }
}'
```

### ステップ3c: PASオブジェクトを作成する(フロントエンド、バックエンド、両方)

プライベートアクセス設定(PAS)オブジェクトを作成、アタッチするために[Account API 2\.0](https://docs.databricks.com/dev-tools/api/latest/account.html)を使用します。

プライベートアクセス設定オブジェクトでは以下のシナリオをサポートしています。

- フロントエンドVPCエンドポイントのみを実装
- バックエンドVPCエンドポイントのみを実装
- フロントエンド、バックエンドVPCエンドポイントの両方を実装

これらのPrivateLink接続シナリオのいずれかをサポートするワークスペースにおいては、ワークスペースに*プライベートアクセス設定オブジェクト*を作成しアタッチする必要があります。特定のワークスペースのみでの使用を目的とした新規のプライベートアクセス設定オブジェクトを作成することもできますし、同じAWSリージョンにある複数のワークスペースで既存のプライベートアクセス設定オブジェクトを再利用することもできます。

このオブジェクトには2つの目的があります。

- ワークスペースでのAWS PrivateLinkの利用目的を表現します。フロントエンドあるいはバックエンドのPrivateLinkを用いてワークスペースに接続する際には、ワークスペース作成時にこれらのオブジェクトの一つをワークスペースにアタッチする必要があります。
- AWS PrivateLinkのフロントエンドのユースケースにおける設定を制御します。バックエンドPrivateLinkのみでの接続を行いたい場合には、オブジェクトの`public_access_enabled`フィールドを`true`に設定します。

プライベートアクセス設定オブジェクトの定義において、`public_access_enabled`はワークスペースのフロントエンド接続(WebアプリケーションとREST API)に対する公衆ネットワークアクセスをコントロールします。

- `false`(デフォルト)に設定すると、PrivateLink接続を用いてのみフロントエンドにアクセスできるようになり、公衆インターネットからはアクセスできなくなります。この場合、公衆ネットワークからのアクセスは許可されていないのでワークスペースにおける[IPアクセスリスト](https://docs.databricks.com/security/network/ip-access-list.html)機能はサポートされません。
- `true`に設定すると、PrivateLink接続と公衆インターネットからフロントエンドにアクセスできるようになります。オプションとして公衆インターネット(PrivateLinkコネクションではありません)からWebアプリケーションとREST APIにアクセスできるソースネットワークを制限するためにIPアクセスリストを設定することができます。

プライベートアクセス設定オブジェクトを作成するには、REST APIエンドポイント`/accounts/<account-id>/private-access-settings`に`POST`リクエストを行います。リクエストボディには以下のプロパティを含めます。

- `private_access_settings_name`: 人間が理解できるプライベートアクセス設定オブジェクトの名称。
- `region`: AWSリージョン名。
- `public_access_enabled`: フロントエンド接続への公衆アクセスを許可するかどうかを指定します。`true`の場合、フロントエンド接続に対して、PrivateLink接続に加えて公衆アクセスが可能です。上の説明をご覧ください。
- `private_access_level`: このワークスペースにどのVPCエンドポイントが接続できるのかを指定します:
    - `ACCOUNT (デフォルト)`: お使いのDatabricksアカウントに登録されたVPCエンドポイントに接続を限定します。
    - `ENDPOINT`: 明示的に指定したVPCエンドポイントに接続を限定します。関連するプロパティ`allowed_vpc_endpoint_ids`をご確認ください。

    :::note info
    **注意**
    プライベートアクセスレベル`ANY`は非推奨になりました。新規あるいは既存のアクセス設定オブジェクトでこのレベルを指定することはできません。
    :::

- `allowed_vpc_endpoint_ids`: `private_access_level`が`ENDPOINT`に設定されている場合にのみ使用します。このプロパティは、このワークスペースに接続できるVPCエンドポイントを指定します。VPCエンドポイントIDのJSON配列として指定します。AWS IDではなく[エンドポイント登録時](#ステップ3a-vpcエンドポイントフロントエンドバックエンド両方を登録する)に返却されるDatabricksのIDを使用します。

```bash:Bash
curl -X POST -n \
  'https://accounts.cloud.databricks.com/api/2.0/accounts/<account-id>/private-access-settings' \
  -d '{
  "private_access_settings_name": "Default PAS for us-west-2",
  "region": "us-west-2",
  "public_access_enabled": true
}'
```

レスポンスのJSONには`private_access_settings_id`フィールドが含まれています。このIDはDatabricks内においてこの設定固有のものとなります。ワークスペースを作成する際に、このフィールドが必要となりますので保存しておいてください。

関連APIには以下のようなものがあります。

- [ID指定でのプライベートアクセス設定オブジェクトの取得](https://docs.databricks.com/dev-tools/api/latest/account.html#operation/get-private-access-settings-object)
- [すべてのプライベートアクセス設定オブジェクトの取得](https://docs.databricks.com/dev-tools/api/latest/account.html#operation/get-private-access-settings-objects)
- [プライベートアクセス設定オブジェクトのアップデート](https://docs.databricks.com/dev-tools/api/latest/account.html#operation/replace-private-access-settings)([パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html))
- [プライベートアクセス設定オブジェクトの削除](https://docs.databricks.com/dev-tools/api/latest/account.html#operation/get-private-access-settings-object)

### ステップ3d: ワークスペースを作成、アップデートする(フロントエンド、バックエンド、両方)

:::note
**注意**
稼働中のワークスペースでPrivateLinkを有効化することができますが、アカウントコンソールではプライベートアクセス設定オブジェクトの変更をサポートしていません。このステップを実行するにはDatabricksの担当にコンタクトして下さい。ワークスペースで使用したいネットワーク設定名とプライベートアクセス設定オブジェクトを連絡する準備をしてください。ワークスペースではすでに顧客管理VPCを使用しており、セキュアクラスター接続が有効化されている(多くのE2ワークスペースでは有効化されています)必要があります。
:::

PrivateLink接続のワークスペースを作成する際に重要となるフィールドは`private_access_settings_id`(新規に作成したプライベートアクセス設定オブジェクトのID)と`network_id`(新規に作成したネットワーク設定のID)です。

PrivateLink接続のワークスペースを作成するには:

1. Account APIにおける新規ワークスペースに関するすべてのフィールドのガイドについて、Databricks [Account API 2\.0](https://docs.databricks.com/dev-tools/api/latest/account.html)の指示を読みます。ストレージ設定、認証設定、顧客管理キーのようなすべてのフィールドに対する完全な手順に関しては、[Create a new workspace using the Account API](https://docs.databricks.com/administration-guide/account-api/new-workspace.html)をご覧ください。
1. [Create a new workspace API](https://docs.databricks.com/dev-tools/api/latest/account.html#operation/create-workspace)(`POST /accounts/{account_id}/workspaces`)を呼び出し、以下のように`private_access_settings_id`と`network_id`を含めます。

    ```bash:Bash
    curl -X POST -n \
      'https://accounts.cloud.databricks.com/api/2.0/accounts/<databricks-account-id>/workspaces' \
      -d '{
      "workspace_name": "my-company-example",
      "deployment_name": "my-company-example",
      "aws_region": "us-west-2",
      "credentials_id": "<aws-credentials-id>",
      "storage_configuration_id": "<databricks-storage-config-id>",
      "network_id": "<databricks-network-config-id>",
      "managed_services_customer_managed_key_id": "<aws-kms-managed-services-key-id>",
      "storage_customer_managed_key_id": "<aws-kms-notebook-workspace-storage-config-id>",
      "private_access_settings_id": "<private-access-settings-id>"
    }'
    ```

1.  ワークスペースを作成(アップデート)した後は、利用できるまで、あるいはクラスターを作成できるまで待ちます。ワークスペースのステータスが`RUNNING`になれば、VPCの変更は即座に反映されます。しかし、クラスターを利用、作成できるようになるまでにはさらに20分待つ必要があります。この時間が経過する前にクラスターを作成、利用しようとするとクラスターは起動に成功せず、エラーが発生するか予期しない挙動を示します。

## Terraformを使用

必要なAWSネットワークオブジェクトと関連するDatabricks PrivateLinkオブジェクトを作成するためにTerraformを使用するには、以下のTerraformプロバイダーを確認してください。

- [VPCエンドポイントを登録するTerraformプロバイダー](https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/mws_vpc_endpoint)。このリソースを使用する前には、必要なAWS VPCエンドポイントを作成しておく必要があります。
- [AWS VPCとDatabrickeネットワーク設定を作成するTerraformプロバイダー](https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/mws_networks)
- [Databricksプライベートアクセス設定オブジェクトを作成するTerraformプロバイダー](https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/mws_private_access_settings)

ワークスペースをデプロイするためにTerraformを使うには以下を参照ください。

- [ワークスペース用Terraformプロバイダー](https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/mws_workspaces)

# ステップ4: ユーザーリクエストをWebアプリケーションにリダイレクトするように内部DNSを設定する(フロントエンド)

フロントエンドPrivateLink接続を使うためには、ユーザーのリクエストをWebアプリケーションにリダイレクトする必要があります。ユーザーが利用しているあるいは接続するネットワークに対してプライベートDNSを変更する必要があります。ユーザーがお使いの内部、カスタムDNSのスコープにあるオンプレミスネットワークからDatabricksワークスペースにアクセスする場合、お使いのワークスペースURLがワークスペースVPCエンドポイント用のVPCエンドポイントプライベートIPにマッピングされるように、ワークスペースの作成・更新後に以下の設定を行う必要があります。

WebアプリケーションのワークスペースURLをフロントエンドVPCエンドポイントにマッピングするように内部DNSを設定します。

お使いのワークスペースがデプロイされているドメイン名のDNS解決をテストするには`nslookup`コマンドラインツールを使用します。

```bash:Bash
nslookup my-workspace-name-here.cloud.databricks.com
```

サンプルのレスポンスは以下のようになります。

```
Non-authoritative answer:

my-workspace-name-here.cloud.databricks.com     canonical name = oregon.cloud.databricks.com.

oregon.cloud.databricks.com     canonical name = a89b3c627d423471389d6ada5c3311b4-f09b129745548506.elb.us-west-2.amazonaws.com.

Name:   a89b3c627d423471389d6ada5c3311b4-f09b129745548506.elb.us-west-2.amazonaws.com

Address: 44.234.192.47
```

AWSリージョン`us-east-1`におけるフロントエンドVPCエンドポイントとワークスペースをマッピングするサンプルのDNSマッピングは以下のようになります。

- デフォルトではDNSのマッピングは
    - `myworkspace.cloud.databricks.com`は`nvirginia.privatelink.cloud.databricks.com`にマッピングされます。この場合、`nvirginia`は当該リージョンのコントロールプレーンの短縮名です。
    - `nvirginia.privatelink.cloud.databricks.com`は`nvirginia.cloud.databricks.com`にマッピングされます。
    - `nvirginia.cloud.databricks.com`はAWSのパブリックIPにマッピングされます。
- DNS変更後は、(フロントエンドVPCエンドポイントが存在する)お使いのトランジットVPCからのDNSマッピングは以下のようになります。 
    - `myworkspace.cloud.databricks.com`は`nvirginia.privatelink.cloud.databricks.com`にマッピングされます。
    - `nvirginia.privatelink.cloud.databricks.com`はVPCエンドポイントのプライベートIPにマッピングされます。

オンプレミスのネットワークからワークスペースのURLをVPCエンドポイントのプライベートIPにマッピングするには、

- [AmazonDNS](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html#AmazonDNS)を使うためにワークスペースURLに対する条件付きフォワーディングを設定します。
- VPCエンドポイントのプライベートIPにマッピングを行うオンプレミスあるいはDNSでワークスペースURLのAレコードを作成します。
- その他類似のPrivateLink有効かサービスに対してアクセスを有効化するために同じステップを行います。

DNSマッピングが以下のようになるように内部DNSでAレコードを作成することで、ワークスペースURLを直接フロントエンド(ワークスペース)VPCエンドポイントのプライベートIPにマッピングすることもできます。

- `myworkspace.cloud.databricks.com`をVPCエンドポイントプライベートIPにマッピング。

内部DNS設定に変更を行った後は、お使いのトランジットVPCからDatabricksワークスペースのWebアプリケーションやREST APIにアクセスすることで設定をテストしてください。設定をテストするために必要であればトランジットVPC内にVPCを作成してください。

ご自身のネットワークアーキテクチャにどのように適用したらいいのかに関して質問がある場合には、Databricks担当にお問合せください。

# ステップ5: 他のAWSサービス向けのVPCエンドポイントを追加する(推奨ですがオプションです)

PrivateLinkバックエンド接続を実装するのに必要な[セキュアクラスター接続](https://docs.databricks.com/security/secure-cluster-connectivity.html)を使用しているのであれば、任意でお使いのデータプレーンVPCに他のVPCエンドポイントを追加でき、Databricksが使用するAWSのネイティブサービス(S3、STS、Kinesis)、お使いのワークスペースで必要となる他のリソースにアクセスする際、クラスターがVPCエンドポイントを利用することができます。

- **S3 VPCゲートウェイエンドポイント:** ワークスペースのサブネットにアタッチされるルートテーブルにのみアタッチしてください。推奨されるバックエンドVPCエンドポイントに対する自身のルートテーブルを持つ別のサブネットを使用しているのであれば、S3 VPCエンドポイントを特定のルートテーブルにアタッチする必要はありません。
- **STS VPCインタフェースエンドポイント:** 全てのワークスペースのサブネットで作成し、ワークスペースのセキュリティグループにアタッチしてください。バックエンドVPCエンドポイントのサブネットでは作成しないでください。
- **Kinesis VPCインタフェースエンドポイント:**　STS VPCインタフェースのエンドポイントと同じように、全てのワークスペースのサブネットでKinesis VPCインタフェースエンドポイントを作成し、ワークスペースのセキュリティグループにアタッチしてください。

他のアウトバウンド接続をサポートしないように、ワークスペース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)を参照ください。

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

AWSを用いてAWS VPCエンドポイントを作成する際には、AWSのドキュメント[creating VPC endpoints in the AWS console](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html)を参照ください。

VPCエンドポイントの作成、管理の自動化に役立つツールには以下のようなものがあります。

- [Databricks Terraform provider](https://docs.databricks.com/dev-tools/terraform/index.html)に関するドキュメント
- Terraformのリソース [databricks\_mws\_vpc\_endpoint](https://registry.terraform.io/providers/databrickslabs/databricks/latest/docs/resources/mws_vpc_endpoint)と[databricks\_mws\_private\_access\_settings](https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/mws_private_access_settings)
- Terraformのガイド [Deploying prerequisite resources and enabling PrivateLink connections](https://registry.terraform.io/providers/databricks/databricks/latest/docs/guides/aws-private-link-workspace)
- AWSのドキュメント [CloudFormation: Creating VPC Endpoint](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html)
- AWSのドキュメント [AWS CLI : create\-vpc\-endpoint](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-vpc-endpoint.html)


### Databricks 無料トライアル

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