DatabricksワークスペースへのAWS PrivateLinkとカスタムDNSの適用

[Custom DNS With AWS PrivateLink for Databricks Workspaces \- The Databricks Blog](https://databricks.com/blog/2021/04/30/custom-dns-with-aws-privatelink-for-databricks-workspaces.html)の翻訳です。

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

:::note info
2021/4時点の記事です。
:::

> この記事はAmazon Web Services(AWS)との共著です。AWSのシニアソリューションアーキテクトである[Ranjit Kalidasan](https://www.linkedin.com/in/ranjitkalidasan)、パートナーソリューションアーキテクトである[Pratik Mankad](https://www.linkedin.com/in/pratik-mankad-460a431/)に感謝の意を表します。

先週、[DatabricksワークスペースにおけるAWS PrivateLink](https://databricks.com/blog/2021/04/23/private-databricks-workspaces-with-aws-privatelink-is-in-public-preview.html)のサポートがパブリックプレビューになったことを発表でき嬉しく思っています。これによって、モダンなクラウドワークロードのガバナンス、セキュリティ要件に対応するための新たなパターンと機能を実現します。我々がよくお客様から尋ねられていたパターンの一つに、Databricksワークスペースに[顧客管理VPC](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe)を用いる際にカスタムDNSを活用できるかどうかというものがありました。AWS PrivateLinkが有効化されたDatabricksワークスペースでこの機能を提供するために、我々はスケーラブルかつ再現可能なアーキテクチャを構築できるようにAWSとパートナーシップを結びました。この記事では、このユースケースを実現するために、どのように[Amazon Route 53](https://aws.amazon.com/route53/)のリゾルバを実装したのか、そして、お使いのDatabricksワークスペースでどのようにして同じアーキテクチャを実現するのかを説明します。

# モチベーション

多くの企業においては、自身のクラウドVPCにおいて自身のDNSサーバーを使うように設定をしています。これは、外部から制御可能なDNSサーバーの利用を制限し、あるいは/加えて、クラウドアプリケーションで解決される必要があるオンプレミス、プライベートなドメインを持っていることに起因しています。通常、これはDatabricksを標準のデプロイメントで使う際には、[セキュアクラスター接続](https://qiita.com/taka_yayoi/items/f2db6631b264b0956413)(プライベートサブネット)であっても、AWSによって解決可能なドメインを使用するため問題になりません。
![](https://databricks.com/wp-content/uploads/2021/04/cust-dns-aws-blog-img-1.png)

しかし、Databricks向けAWS PrivateLinkのインタフェースでは、バックエンド、フロントエンドのインタフェースが動作するためには[プライベートDNS解決](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#vpce-private-dns)が必要となります。お客様が自身のワークスペースVPC向けに自身のDNSサーバーを設定する場合、自分でこれらのVPCエンドポイントを解決することはできず、Databricksのデータプレーンとコントロールプレーンの通信は確立しません。AWSのPrivateLinkとカスタムDNSをデプロイするために、データプレーンでこれらのプライベートDNS名を解決する目的でRoute 53を活用することができます。

# Amazon Route 53とは？

Amazon Route 53は、高可用性かつスケーラブルなクラウドドメインネームシステム(DNS)ウェブサービスです。*www.example.com*のようなドメイン名をコンピューターが互いに接続数歳に使う192.0.2.1のような数値のIPアドレスに変換することで、エンドユーザーがインターネットアプリケーションにルーティングするための、非常に信頼性とコスト効率が高い方法を提供します。Route 53は、ホステットゾーン、ポリシー、ドメインのような異なるコンポーネントから構成されています。この記事では、Route 53の[リゾルバエンドポイント](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver.html)(特にアウトバウンドエンドポイント)とアプライドエンドポイントルールにフォーカスします。

# ハイレベルのアーキテクチャ

ハイレベルでは、サービスコンシューマー側のインタフェース型Amazonバーチャルプライベートクラウド(VPC)エンドポイントに対するプライベートDNS名を作成するためのアーキテクチャは以下のようになります。
![](https://databricks.com/wp-content/uploads/2021/04/cust-dns-aws-blog-img-2-1024x583.png)

この場合、Route 53はアウトバウンドリゾルバエンドポイントを提供します。これは、基本的にはローカル、プライベートドメインをRoute 53で解決する方法を提供し、その他の未解決のドメインをカスタムDNSを使って解決します。技術的には、このアーキテクチャはDNSサーバーVPCにデプロイされたアウトバウンドリゾルバエンドポイント、サービスに対してどのように、どこでドメインを解決するのかを支持するRoute 53リゾルバルールから構成されています。AWSによってどのようにRoute 53のプライベートホステッドゾーンのエントリーが解決されるのかの詳細については、[ドキュメントとユーザーガイド](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#vpce-private-dns)を参照してください。より詳細に関しては、[Private DNS for Interface Endpoints](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#vpce-private-dns)と[Working with Private Hosted Zones](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-private.html)を参照ください。これは、DNSサーバーがオンプレミスでホスティングされている場合でも同様に動作することに注意してください。この場合、アウトバウンドリゾルバがデプロイされているVPCは、ご自身のオンプレミスデータセンターに対する[Direct Connect](https://aws.amazon.com/directconnect/)エンドポイントをホスティングしているVPCと同じである必要があります。

# ステップバイステップの手順

以下では、適切なルールとRoute 53のアウトバウンドリゾルバの設定手順をウォークスルーします。ここでは、すでにAWSのPrivateLinkが有効化されたDatabricksワークスペースがデプロイ済みで稼働中であることを前提とします。

1. Databricksの[PrivateLinkのドキュメント](https://qiita.com/taka_yayoi/items/c6bdbb6452f6a0895961)の手順に従って適切にワークスペースがデプロイされていることを確認します。カスタムDNSがすでに動作していることによってクラスターが起動しない場合には、クラスターの作成が阻害されておらず、他の問題がないことを確認するために、AWSのDNS解決を有効化してみてください。
1. 以下の情報を収集してください。
    1. DatabricksデータプレーンのVPC ID(使用している場合にはユーザー・ワークスペース間のVPCエンドポイント)
    - カスタムDNSサーバーがあるVPCのVPC ID
    - Route 53エンドポイントをデプロイするサブネット。これらはカスタムDNSサーバーと同じVPCにある必要があります(少なくとも2つのサブネットが必要であり、それぞれは異なるAZに存在する必要があります)。
    - カスタムDNSサーバーのIPアドレス
    - Route 53エンドポイントに適用されるセキュリティグループID。ここでは、データプレーンVPCからのUDPポート53のインバウンド接続を許可する必要があり、デフォルトのアウトバウンドルール(例：0.0.0.0/0を許可)を使用する必要があります。
1. 新規Route 53アウトバウンドリゾルバを作成(Services > Route53 > Outbound Endpoint > Create Outbound Endpoint)するところからスタートします。ステップ2-2で取得したVPC ID、ステップ2-3で取得したサブネットを用いてDNS VPCにエンドポイントを作成します。ステップ2-5で作成したセキュリティグループを選択します。特別な理由がない限り、IPアドレスを選択する際に「Use an IP address that is selected automatically」を選択します。
1. 新規リゾルバルールを作成します(Services > Route53 > Rules > Create Rule)。このルールは、Databricks VPCエンドポイント(これらエンドポイントは名前解決のためにプライベートホステッドゾーンを使用します)のプライベートDNS名以外のDNSのクエリーをカスタムDNSサーバーにフォワードします。“Domain Name”では、全てのドメインを意味するドット(クォートなしの“.”)を入力します。VPCに対しては、2-1で取得したお使いのデータプレーンのVPCを選択します。アウトバウンドエンドポイントはステップ3で作成したエンドポイントである必要があります。“Target IP”では、カスタムDNSサーバーのIPアドレスを指定します。注意：SCC/RESTエンドポイントとは別のVPCでユーザー・ワークスペース間のPrivateLinkエンドポイントを使用している場合には、そのVPCに対してもルールをアタッチしてください。
1. ***AWSエンドポイント(Kinesis、S3、STSエンドポイント)がデータプレーンで使用されている場合***、これらのドメイン解決リクエストをRoute 53デフォルトリゾルバにフォラードするように別のルールを追加します。このルールには"amazonaws.com"(クォートなし)のドメインを含める必要があります。VPCとエンドポイントの設定はステップ4と同一である必要があります。ターゲットIPアドレスに対しては、VPCのCIDRレンジの2番目のIPアドレスであるAWSのVPCリゾルバを使用します。例えばCIDRが10.0.0.0/16であれば、10.0.0.2を使用します。これはステップ2-2のVPCである必要があります。この例では、IPアドレスは10.100.100.2となります。
1. これでRoute 53のリゾルバがセットアップされました。DNSとデータプレーンのVPCに適切なルーティングの設定がされたことを確認します。適切なVPCと関連づけられれば、Route 53エンドポイントに対する追加のルーティングは不要です。(Route 53によって解決されるので)Databricks VPCエンドポイントに対する明示的なルーティングは不要ですが、Amazon S3など他のサービスに対するエンドポイントにおいては明示的なルーティングが必要になる場合があります。
1. ワークスペースにアクセスし、クラスターを起動します。名前解決が動作していることを検証するために、ノートブックで以下のコマンドを実行します。

    ```bash
%sh dig region.privatelink.cloud.databricks.com
    ```

    ここで、`region`はお使いのリージョンによって変わります。us-east-1であれば`nvirginia`となります。このコマンドは以下のような結果を返すはずです。


    ```
; <<>> DiG 9.11.3-1ubuntu1.13-Ubuntu <<>> nvirginia.privatelink.cloud.databricks.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34414
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;nvirginia.privatelink.cloud.databricks.com. IN A
;; ANSWER SECTION:
nvirginia.privatelink.cloud.databricks.com. 60 IN A 10.175.4.9
;; Query time: 2 msec
;; SERVER: 10.175.0.2#53(10.175.0.2)
;; WHEN: Thu Feb 25 14:55:57 UTC 2021
;; MSG SIZE  rcvd: 87
    ```

このコマンドが成功すれば、Route 53によるDNSルーティングを適切に設定できたことになります！

### Databricks 無料トライアル

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