Databricksにおける顧客管理VPC

[Customer\-managed VPC \| Databricks on AWS](https://docs.databricks.com/administration-guide/cloud-configurations/aws/customer-managed-vpc.html) [2021/6/1時点]の翻訳です。

> [Databricksクイックスタートガイド](https://qiita.com/taka_yayoi/items/125231c126a602693610)のコンテンツです。
> **重要!**
この機能は[E2バージョンのDatabricksプラットフォームで利用](https://docs.databricks.com/getting-started/overview.html#e2-architecture)できます。

# 概要

デフォルトでは、お客様のAWSアカウント上にDatabricksが単一のAWS VPC(Virtual Private Cloud)を作成します。オプションとして、お客様の組織の標準に従いながらも、Databricksの要件に応えるために、お客様の手で作成した顧客管理のVPC(customer-managed VPC)を使うこともできます。

> **重要!**
[AWS PrivateLink](https://qiita.com/taka_yayoi/items/c6bdbb6452f6a0895961)([Public Preview](https://docs.databricks.com/release-notes/release-types.html))を利用したワークスペースを設定するには、対象のワークスペースで顧客管理VPC(customer-managed VPC)を使用する必要があります。

以下のケースでは、顧客管理VPCは良いソリューションとなります：

- お客様の情報セキュリティによって、お客様のAWSアカウントではPaaSプロバイダーによるVPCを許可していない。
- 内部情報セキュリティ、クラウドエンジニアリングチームによって作成されたドキュメントで規定され、設定されるようにVPC作成の承認プロセスが存在する。

以下のメリットがあります:

- **権限レベルを低い状態に保てる：** ご自身のAWSアカウントに対するコントロールを保持できます。Databricks管理のVPCのケースでは必要なクロスアカウントIAMロールを通じたDatabricksへの権限委譲が不要になります。
- **ネットワークオペレーションの簡素化:** ネットワークの領域を有効活用できます。ワークスペースのサブネットをデフォルトのCIDR /16より小さいサイズに設定できます。他のソリューションでは必要になるかもしれない複雑なVPCピアリングの設定は不要です。
- **VPCの統合:** 複数のDatabricksワークスペースは一つのデータプレーンVPCを共有できるので、インスタンス、課金管理の観点で好ましい形にできます。
- **外向き通信の制限:** デフォルトでは、データプレーンはDatabricksランタイムのワーカーノードからの外向きの通信を制限しません。顧客管理VPCを使用するように設定されたワークスペースにおいては、特定の内外のデータソースにアクセスを制限するように、外向きのファイアウォール、プロキシーアプライアンスを使用できます。
![](https://docs.databricks.com/_images/customer-managed-vpc.png)

顧客管理VPCを活用するためには、最初にDatabricksワークスペースを作成する際にVPCを指定する必要があります。既存のDatabricks管理のワークスペースをお客様のVPCに持ち込むことはできません。しかし、お客様管理VPCにある既存のワークスペースを別のお客様管理VPCに移動することは可能です。[稼働中のワークスペースの更新](https://docs.databricks.com/administration-guide/account-settings-e2/workspaces.html#update-a-running-workspace)を参照ください。


# 顧客管理VPCを用いたワークスペースの設定

お客様管理のVPCにワークスペースをデプロイするには、以下の作業が必要となります。

1. 以下のVPCの要件に合致するVPCを作成します。
1. ワークスペース作成時に、[Account API](https://docs.databricks.com/administration-guide/account-api/new-workspace.html)を用いて、VPCのネットワーク設定をDatabricksに登録します。[Step 4: Configure customer\-managed VPC \(optional, but required if you use PrivateLink\)](https://docs.databricks.com/administration-guide/account-api/new-workspace.html#vpc)を参照ください。

    VPCをDatabricksに登録する際には、VPC ID、サブネットID、セキュリティグループIDを指定する必要があります。

> **情報**
具体的な設定例に関しては、[Databricksにおける顧客管理VPC\(実践編\)](https://qiita.com/taka_yayoi/items/9e04f78ff025f77e52a6)をご覧ください。

# VPCの要件

Databricksワークスペースをホストするためには、VPCは以下の要件を満たす必要があります。以下に構成例を図示します。
![vpc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/85a6a461-c738-8dc9-44f4-ad8b5b31df7f.png)
*VPC構成例:CIDRやワークスペース用サブネットの数はお客様要件に基づいて決定してください*


**要件:**

- [VPCのリージョン](#vpcのリージョン)
- [VPCのサイズ](#vpcのサイズ)
- [VPC IPアドレスのレンジ](#vpc-ipアドレスのレンジ)
- [DNS](#dns)
- [サブネット](#サブネット)
- [セキュリティグループ](#セキュリティグループ)
- [サブネットのネットワークACL](#サブネットのネットワークacl)
- [ファイアウォールアプライアンスインフラストラクチャ](#ファイアウォールアプライアンスインフラストラクチャ)

## VPCのリージョン

ワークスペースのデータプレーンVPCは、AWSの`ap-northeast-1`、`ap-south-1`、`ap-southeast-2`、`ca-central-1`、`eu-west-1`、`eu-west-2`、`eu-central-1`、`us-east-1`、`us-east-2`、`us-west-1`、`us-west-2`リージョンに存在する必要があります。しかし、[マネージドサービス](https://docs.databricks.com/security/keys/customer-managed-keys-managed-services-aws.html)や[ワークスペースストレージ](https://docs.databricks.com/security/keys/customer-managed-keys-storage-aws.html)をお客様管理の鍵で暗号化する場合には、`us-west-1`リージョンは利用できません。

## VPCのサイズ

単一のAWSアカウントにおいて、一つのVPCを複数のワークスペースで共有することができます。しかし、ワークスペース間でサブネットとセキュリティグループを再利用することはできません。VPCとサブネットのサイズを適切に設定するようにしてください。Databricksはノードごとに2つのIPアドレスを割り当てます。一つは管理用トラフィック、一つはApache Sparkアプリケーション用となります。それぞれのサブネットにおけるインスタンス総数は、利用可能なIPアドレスの数の半分になります。[サブネット](#サブネット)をご覧ください。

## VPC IPアドレスのレンジ

DatabricksはワークスペースVPCに対するネットマスクを制限しませんが、それぞれのサブネットは`/17`と`/26`の間のネットマスクを持つ必要があります。このことは、ワークスペースが`/26`のネットマスクの2つのサブネットを持つ場合は、ワークスペースのVPCのネットマスクは、`/25`より小さいものである必要があることを意味します。

> **重要!**
VPCにセカンダリーCIDRブロックが設定されている場合には、Databricksワークスペースに対するサブネットが、同じVPC CIDRブロックに設定されていることを確認してください。

## DNS

VPCはDNSホスト名を持ち、DNS解決が有効になっている必要があります。

## サブネット

Databricksは、少なくともそれぞれのワークスペースの二つのサブネットにアクセスする必要があり、それぞれのサブネットは異なるアベイラビリティゾーンに存在する必要があります。[Create network configuration APIの呼び出し](http://docs.databricks.com/dev-tools/api/latest/account.html#operation/create-storage-config)においては、アベイラビリティゾーンに対して、複数のDatabricksワークスペースサブネットを指定することはできません。ネットワークセットアップの際にアベイラビリティゾーンに複数のサブネットを設定できますが、Databricksワークスペースに対して、アベイラビリティゾーンごとに選択できるサブネットは一つだけです。

Databricksはノードごとに2つのIPアドレスを割り当てます。一つは管理用トラフィック、一つはApache Sparkアプリケーション用となります。それぞれのサブネットにおけるインスタンス総数は、利用可能なIPアドレスの数の半分になります。

それぞれのサブネットは`/17`と`/26`の間のネットマスクを持つ必要があります。

> **重要!**
顧客管理VPCに指定するサブネットは、1つのDatabricksワークスペースに対してのみ使用する必要があります。これらのサブネットを、他のDatabricksワークスペースを含む他のリソースと共有することはできません。

### 追加のサブネット要件

- プライベートサブネットである必要があります。
- サブネットは[NATゲートウェイ](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)と[インターネットゲートウェイ](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html)、あるいは他の同様の顧客管理アプライアンスインフラストラクチャを用いて、パブリックネットワークに対してアウトバウンドのアクセスができる必要があります。
- NATゲートウェイは[NATゲートウェイ専用のサブネット内で](https://aws.amazon.com/premiumsupport/knowledge-center/nat-gateway-vpc-private-subnet/)セットアップされる必要があり、[インターネットゲートウェイ](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html)、あるいは類似の顧客管理のアプライアンスストラクチャに対して`(0.0.0.0/0)`トラフィックをルーティングするように設定される必要があります。

> **重要!**
セキュアクラスター接続(2020/9/1からデフォルトとなっています)を使用しているワークスペースでは、VPCからパブリックネットワークに対するアウトバウンド接続が必要です。

### サブネットのルートテーブル

ワークスペースのサブネットに対するルーティングテーブルは、適切なネットワーク機器に向かう`(0.0.0.0/0)`トラフィックを含む必要があります。ワークスペースがセキュアクラスター接続(2020/9/1からデフォルトとなっています)を使用している場合には、`(0.0.0.0/0)`トラフィックはNATゲートウェイ、あるいはお客様管理のNATデバイス、プロキシーアプライアンスをターゲットにする必要があります。

> **重要!**
Databricksを利用する際、サブネットの許可リストに`0.0.0.0/0`を含める必要があります。外向きの通信を制限するには、Databricksが接続する必要があるURLへの通信のみを許可し、他の通信をブロックするために、イグレスファイアウォールかプロキシーアプライアンスを使用してください。[ファイアウォールアプライアンスインフラストラクチャ](#ファイアウォールアプライアンスインフラストラクチャ)を参照ください。

ここで説明しているのはベースラインのガイドラインです。要件はお客様によります。質問がある場合には、Databricks窓口にお尋ねください。

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

Databricksは1個から5個のAWSセキュリティグループにアクセスする必要があります。新たなセキュリティグループを作成するのではなく、既存のセキュリティグループを再利用することもできます。

セキュリティグループには以下のルールが含まれている必要があります。

**イグレス(アウトバウンド)：**

- ワークスペースのセキュリティグループに対して、すべてのTCP、UDPアクセスを許可(内部トラフィック用)
- 以下のポートにおける`0.0.0.0/0`に対するTCPアクセスを許可
    - 443: Databricksインフラストラクチャ、クラウドデータソース、ライブラリリポジトリ向け
    - 3306: メタストア向け
    - 6666: [PrivateLink](https://qiita.com/taka_yayoi/items/c6bdbb6452f6a0895961)を使用している場合にのみ必要

**イングレス(インバウンド)：**

- 通信元が同じセキュリティグループを使用している場合には全てのポートのTCP通信を許可
- 通信元が同じセキュリティグループを使用している場合には全てのポートのUDP通信を許可

## サブネットのネットワークACL

サブネットのネットワークACLは、すべての内向き、外向きのいかなる通信を拒否してはいけません。Databricksはワークスペース作成時に以下のルールを検証します。

- ソース`0.0.0.0/0`に対して`ALLOW ALL`
- イグレス(インバウンド)
    - ワークスペースVPCのCIDRの全ての通信を許可(内部トラフィック向け)
    - 以下のポートの`0.0.0.0/0`へのTCPアクセスを許可
        - 443: Databricksインフラストラクチャ、クラウドデータソース、ライブラリリポジトリ向け
        - 3306: メタストア向け
        - 6666: [PrivateLink](https://qiita.com/taka_yayoi/items/c6bdbb6452f6a0895961)を使用している場合にのみ必要

> **重要!**
アウトバウンド通信に追加の`ALLOW`、`DENY`の設定をした場合には、Databricksが要求するルールが上書きするように最も高い優先度(最も少ないルールナンバー)にしてください。

> **注意**
Databricksを使用する際、サブネットのネットワークACLの許可リストに`0.0.0.0/0`を追加する必要があります。外向きの通信を制限するには、Databricksが接続する必要があるURLへの通信のみを許可し、他の通信をブロックするために、イグレスファイアウォールかプロキシーアプライアンスを使用してください。[ファイアウォールアプライアンスインフラストラクチャ](#ファイアウォールアプライアンスインフラストラクチャ)を参照ください。

## ファイアウォールアプライアンスインフラストラクチャ

**セキュアクラスター接続**(2020/9/1からデフォルトとなっています)を使用している場合、Databricksが接続する必要があるURLへの通信のみを許可し、他の通信をブロックするために、イグレスファイアウォールかプロキシーアプライアンスを使用してください。以下の接続が行えるように設定してください。

- ファイアウォールやプロキシーアプライアンスが、DatabricksワークスペースVPCと同じVPCに存在している場合は、以下の接続を許可するように設定してください。
- 異なるVPC、あるいはオンプレミスにファイアウォール、プロキシーアプライアンスが存在する場合には、`0.0.0.0/0`を、当該VPC、ネットワークにルーティングし、その通信を許可するようにプロキシーアプライアンスを設定してください。

以下の接続を許可してください。

- **Databricksウェブアプリケーション:** 必須。あなたのワークスペースに対するREST API呼び出しにも使用されます。
- **Databricksセキュアクラスター接続(SCC)リレー:** セキュアクラスター接続を使用している場合(2020/9/1以降の[E2環境](https://docs.databricks.com/getting-started/overview.html#e2-architecture)ではデフォルトで有効)には必須。
- **AWS S3グローバルURL:** DatabricksがルートS3バケットにアクセスするために必要。
- **AWS S3リージョナルURL:** オプションですが、他のS3バケットにアクセスする際には、S3リージョナルエンドポイントへのアクセスを許可する必要があります。代わりに、AWSネットワークバックボーンのプライベートトンネルを通じて通信されるように、S3エンドポイントを作成することをお勧めします。
- **AWS STSグローバルURL:** 必須。
- **AWS STSリージョナルURL:** リージョナルエンドポイントへの切り替えが起こるので必須。
- **AWS KinesisリージョナルURL:** ソフトウェアを管理、監視するために必要となるログを記録するために、Kinesisエンドポイントが必要になります。多くのリージョンではリージョナルURLを使用してください。しかし、`us-west-1`のVPCでは現在利用できないので、Kinesis URLが`us-west-1`ではなく`us-west-2`に許可されていることを確認してください。代わりに、AWSネットワークバックボーンのプライベートトンネルを通じて通信されるように、Kinesis VPCエンドポイントを作成することをお勧めします。
- **(データプレーンリージョンにおける)テーブルメタストアRDSリージョナルURL:** お使いのワークスペースが、お使いのデータプレーンリージョンと同じリージョンに存在するデフォルトのHiveメタストアにアクセスする際には必須となります。同じ国でもコントロールプレーンと異なるリージョンになるケースはあります。デフォルトのHiveメタストアの代わりに、[ご自身でテーブルメタストアを実装](https://docs.databricks.com/data/metastores/index.html)することも可能ですが、この場合、ご自身でネットワークルーティングを設定する必要があります。

### 必要となるデータプレーンのアドレス

お使いのリージョンに合わせて、以下のアドレスからの接続を許可して下さい。 

> **注意**
以下の表は`ap-northeast-1`リージョンに限定しています。全てのデータは[原文](https://docs.databricks.com/administration-guide/cloud-configurations/aws/customer-managed-vpc.html#required-data-plane-addresses)を参照してください。

| エンドポイント | VPCリージョン | アドレス | ポート |
|:--|:--|:--|:--|
|Webapp   |ap-northeast-1   |tokyo.cloud.databricks.com   |  443 |
|SCC relay   | ap-northeast-1  |tunnel.ap-northeast-1.cloud.databricks.com   | 443   |
|ルートバケット用**S3 global**   | すべて  | s3.amazonaws.com  | 443  |
| 他のバケット用**S3 regional**: VPCエンドポイントの利用を推奨  |  すべて | 	s3.<リージョン名>.amazonaws.com  | 443  |
|**STS global**   | すべて  |sts.amazonaws.com   | 443  |
| **Kinesis**: VPCエンドポイントの利用を推奨  |ほとんどのリージョン   | kinesis.<リージョン名>.amazonaws.com  | 443  |
| **RDS**(ビルトインメタストアを利用する場合)  | ap-northeast-1  | mddx5a4bpbpm05.cfrfsun7mryq.ap-northeast-1.rds.amazonaws.com  | 3306   |
| Databricksコントロールプレーンインフラストラクチャ  |ap-northeast-1	   |35.72.28.0/28   |  443 |

# リージョナルエンドポイント

顧客管理VPC(オプション)を使用して、[セキュアクラスター接続](https://qiita.com/taka_yayoi/items/f2db6631b264b0956413)(2020/9/1以降はデフォルト)を使用している場合には、AWSグローバルエンドポイントと比較して、より直接的な接続とコスト削減の観点から、VPCがAWSサービスに対するリージョナルVPCエンドポイントのみを利用するようにしたいケースがあると思います。顧客管理VPCによるDatabricksワークスペースが接続すべきAWSサービスは4つあります。STS、S3、Kinesis、RDSです。

ご利用のVPCからRDSサービスへの接続が必要になるのは、デフォルトのDatabricksのメタストアを利用する場合のみです。RSDのVPCエンドポイントは存在しませんが、デフォルトのメタストアを利用する代わりにご自身でメタストアを設定することができます。[Hiveメタストア](https://docs.databricks.com/data/metastores/external-hive-metastore.html)と[AWS Glue](https://docs.databricks.com/data/metastores/aws-glue-metastore.html)を用いて外部メタストアを実装することができます。

他の3つのサービスに関しては、パブリックネットワークではなくセキュアなAWSバックボーンを介してクラスターからの適切なリージョン内通信が可能な、VPCゲートウェイあるいはインタフェースエンドポイントを作成することができます。

- **S3:** Databricksクラスターのサブネットから直接アクセスできる[VPCゲートウェイエンドポイント](https://aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3)を作成します。これによって、ワークスペースからリージョン内のS3バケットへの通信をエンドポイント経由にすることができます。クロスリージョンバケットへのアクセスに際しては、イグレスアプライアンスでS3グローバルURL`s3.amazonaws.com`へのアクセスを解放するか、`0.0.0.0/0`からAWSインターネットゲートウェイへの通信をルーティングします。

    リージョナルエンドポイントと[DBFS FUSE](https://docs.databricks.com/data/databricks-file-system.html#local-file-apis)を使用するには以下の設定を行います。
    - Databricksランタイム6.x以降ではクラスター設定で環境変数`AWS_REGION=<aws-region-code>`を設定する必要があります。例えば、北バージニアリージョンにワークスペースにデプロイされた場合には、`AWS_REGION=us-east-1`を設定します。全てのクラスターに設定を適用するには[クラスターポリシー](https://docs.databricks.com/administration-guide/clusters/policies.html)を使用します。
    - Databricksランタイム5.5 LTSでは、`AWS_REGION=<aws-region-code>`と`DBFS_FUSE_VERSION=2`を設定します。

- **STS:** Databricksクラスターのサブネットから直接アクセスできる[VPCインタフェースエンドポイント](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#create-interface-endpoint)を作成します。エンドポイントをワークスペースのサブネットに作成できます。これによってワークスペースからSTSへの通信がエンドポイント経由になります。
- **Kinesis:** Databricksクラスターのサブネットから直接アクセスできる[VPCインタフェースエンドポイント](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#create-interface-endpoint)を作成します。エンドポイントをワークスペースのサブネットに作成できます。ワークスペースのVPCと同じセキュリティグループを使用することをお勧めします。これによってワークスペースからKinesisへの通信がエンドポイント経由になります。ここでの唯一の例外は`us-west-1`リージョンにワークスペースが存在するケースです。この場合、Kinesisのストリームは`us-west-2`へのクロスリージョンとなります。

## リージョナルエンドポイントのトラブルシュート

期待した通りにVPCエンドポイントが動作しない場合、例えば、データソースにアクセスできない、通信がエンドポイント経由にならない場合には、以下のアプローチを試してください。

1. クラスター設定に、お使いのリージョンを示す`AWS_REGION`環境変数を追加します。全てのクラスターに適用する際には、[クラスターポリシー](https://docs.databricks.com/administration-guide/clusters/policies.html)を使用します。DBFS FUSEを使用するために設定済みの場合があります。
1. 必要なApache Spark設定を追加します。
    - **ソースとなるノートブック**

    **Scala**

    ```Scala
%scala
sc.hadoopConfiguration.set("fs.s3a.endpoint", "https://s3.<region>.amazonaws.com")
sc.hadoopConfiguration.set("fs.s3a.stsAssumeRole.stsEndpoint", "https://sts.<region>.amazonaws.com")
    ```

    **Python**

    ```python
%python
sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "https://s3.<region>.amazonaws.com")
sc._jsc.hadoopConfiguration().set("fs.s3a.stsAssumeRole.stsEndpoint", "https://sts.<region>.amazonaws.com")
    ```
    - **あるいはクラスターのApache Spark設定**

    ```
spark.hadoop.fs.s3a.endpoint https://s3.<region>.amazonaws.com
spark.hadoop.fs.s3a.stsAssumeRole.stsEndpoint https://sts.<region>.amazonaws.com
    ```

全てのクラスターに設定を適用するには、[クラスターポリシー](https://docs.databricks.com/administration-guide/clusters/policies.html)を使用してください。

# (オプション)アウトバウンドアクセスの制限

アウトバウンド通信に制限をかけたい場合には、AWS S3に対してクロスリージョンアクセスをしていないことを確認してください。

アウトバウンド通信に制限をかけるには以下の手順を踏みます。

1. 外向きのルーティングを行なっているインフラストラクチャに対して、ウェブアプリケーション、セキュアクラスター接続リレー、メタストアエンドポイントに対して明示的にアクセスを許可します。これはNATゲートウェイやインターネット接続を有するサードパーティのアプライアンスになります。[ファイアウォールアプライアンスインフラストラクチャ](#ファイアウォールアプライアンスインフラストラクチャ)を参照してください。

    > **重要!**
接続先の指定においては、IPアドレスではなくドメイン名を指定することを強くお勧めします。

1. NATゲートウェイのターゲットから`0.0.0.0/0`のディスティネーションを削除します。作成したVPCによってはディスティネーションが設定されていないかもしれません。その場合には、この手順をスキップしてください。

# (オプション)インスタンスプロファイルを用いたS3へのアクセス

[インスタンスプロファイル](https://qiita.com/taka_yayoi/items/446c7971be354f88c679)を用いてS3マウントにアクセスするには、以下のSpark設定を行ってください。

- **ソースのノートブック**

    **Scala**

    ```Scala
%scala
sc.hadoopConfiguration.set("fs.s3a.endpoint", "https://s3.<region>.amazonaws.com")
sc.hadoopConfiguration.set("fs.s3a.stsAssumeRole.stsEndpoint", "https://sts.<region>.amazonaws.com")
    ```

    **Python**

    ```python
%python
sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "https://s3.<region>.amazonaws.com")
sc._jsc.hadoopConfiguration().set("fs.s3a.stsAssumeRole.stsEndpoint", "https://sts.<region>.amazonaws.com")
    ```

- あるいは**クラスターのApache Spark設定**

    ```
spark.hadoop.fs.s3a.endpoint https://s3.<region>.amazonaws.com
spark.hadoop.fs.s3a.stsAssumeRole.stsEndpoint https://sts.<region>.amazonaws.com
    ```

全てのクラスターに設定を適用するには、[クラスターポリシー](https://docs.databricks.com/administration-guide/clusters/policies.html)を使用してください。

> **警告!**
S3サービスに関しては、ノートブック、クラスターレベルで追加のリージョナルエンドポイントを適用する際に制限があります。特に、イグレスファイアウォール、プロキシーでグローバルS3URLが許可されていたとしても、クロスリージョンのS3アクセスはブロックされます。お客様のDatabricksデプロイメントがクロスリージョンのS3アクセスを必要とする場合には、ノートブック、クラスターレベルでのSpark設定が適用されないことに注意してください。

# (オプション)S3へのアクセス制限

S3に対する読み書きの多くはデータプレーンで完結するものです。しかし、いくつかの管理オペレーションはDatabricksが管理するコントロールプレーンから起動されます。特定のIPアドレスからS3へのアクセスを限定する際には、S3バケットポリシーを作成します。バケットポリシーでは、`aws:SourceIp`リストにIPアドレスを含めます。VPCエンドポイントを使用している場合には、ポリシーの`aws:sourceVpce`にエンドポイントを追加します。

S3バケットポリシーの詳細に関しては、Amazon S3ドキュメントの[Limiting access to specific IP addresses](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html#example-bucket-policies-use-case-3)を参照してください。このトピックに関する[バケットポリシーのサンプル](#バケットポリシーのサンプル)もあります。

## バケットポリシーの要件

クラスターが適切にアクセスできるように、バケットポリシーは以下の要件を満たす必要があります。

- お使いのリージョンの[コントロールプレーンのNAT IP](#必要なipアドレスとストレージバケット)からのアクセスを許可する必要があります。
- 以下のいずれかを実施することで、データプレーンVPCからのアクセスを許可する必要があります。
    - (推奨)お使いの顧客管理VPCのゲートウェイVPCエンドポイントを設定し、バケットポリシーの`aws:sourceVpce`に追加する。あるいは、
    - `aws:SourceIp`リストにデータプレーンのNAT IPを追加。
- **[Amazon S3のエンドポイントポリシー](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-s3.html#vpc-endpoints-policies-s3)**を使っている場合は、ポリシーに以下を含める必要があります。
    - お使いのワークスペースの[ルートストレージバケット](https://docs.databricks.com/administration-guide/account-settings-e2/storage.html)
    - お使いのリージョンにおける[アーティファクト、ログ、共有データセット向けバケット](#必要なipアドレスとストレージバケット)
- **お客様の企業ネットワークからの接続を維持**するために、お客様の企業VPNのパブリックIPアドレスのように、既知かつ信頼のおけるIPアドレスからのアクセスを常に許可することをお勧めします。これはAWSコンソールにおいても拒否条件が適用されるためです。

## 必要なIPアドレスとストレージバケット

以下の表には、ワークスペースのS3バケットへのアクセスを制限するために、S3バケットポリシーとVPCエンドポイントポリシーを使用する際に必要な情報も含まれています。

> **注意**
以下の表は`ap-northeast-1`リージョンに限定しています。全てのデータは[原文](https://docs.databricks.com/administration-guide/cloud-configurations/aws/customer-managed-vpc.html#required-ips-and-storage-buckets)を参照してください。

| リージョン | コントロールプレーンのNAT IP | アーティファクトストレージバケット | ログストレージバケット |共有データセットバケット|
|:--|:--|:--|:--|:--|
|ap-northeast-1   | 18.177.16.95/32  | databricks-prod-artifacts-ap-northeast-1  | databricks-prod-storage-tokyo  |databricks-datasets-tokyo|

## バケットポリシーのサンプル

以下のサンプルでは、推奨されるIPアドレスと必要なストレージバケットを指定するためのプレースホルダーが含まれます。クラスターが適切に起動しアクセスできるように[要件](#バケットポリシーの要件)を確認してください。

### Databricksコントロールプレーン、データプレーン、信頼されたIPのみにアクセスを制限する

このS3バケットポリシーは、Deny条件を用いて、コントロールプレーンとデータプレーン、指定した企業VPNのIPにのみアクセスを許可します。環境に応じてプレースホルダーを置換してください。任意のIPをポリシーに追加できます。保護したいS3バケットごとにポリシーを作成します。

> **重要!** 
VPCエンドポイントを使っている場合には、このポリシーは不完全なものになります。[Databricksコントロールプレーン、VPCエンドポイント、信頼されたIPのみにアクセスを制限する](#databricksコントロールプレーンvpcエンドポイント信頼されたipのみにアクセスを制限する)を参照ください。

```json
{
  "Sid": "IPAllow",
  "Effect": "Deny",
  "Principal": "*",
  "Action": "s3:*",
  "Resource": [
    "arn:aws:s3:::<S3-BUCKET>",
    "arn:aws:s3:::<S3-BUCKET>/*"
  ],
  "Condition": {
    "NotIpAddress": {
      "aws:SourceIp": [
        "<CONTROL-PLANE-NAT-IP>",
        "<DATA-PLANE-NAT-IP>",
        "<CORPORATE-VPN-IP>"
      ]
    }
  }
}
```

### Databricksコントロールプレーン、VPCエンドポイント、信頼されたIPのみにアクセスを制限する

S3にアクセスするためにVPCエンドポイントを使用している際には、ポリシーに第二の条件を追加する必要があります。`aws:sourceVpce`リストにVPCエンドポイントを追加することでアクセスを許可します。

このS3バケットポリシーは、VCPエンドポイント、コントロールプレーン指定した企業VPNのIPにのみアクセスを許可します。

VPCエンドポイントを使用する際には、S3バケットポリシーの代わりにVPCエンドポイントp路シーを使用できます。VPCEポリシーは、お使いのルートS3バケットへ、お使いのリージョンにおける[アーティファクト、ログ、共有データセット向けバケット](#必要なipアドレスとストレージバケット)へのアクセスを許可する必要があります。詳細をAWSドキュメントの[VPCエンドポイントポリシーの使用](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html#vpc-endpoint-policies)で確認することができます。

環境に応じてプレースホルダーを置換してください。

```json
{
  "Sid": "IPAllow",
  "Effect": "Deny",
  "Principal": "*",
  "Action": "s3:*",
  "Resource": [
    "arn:aws:s3:::<S3-BUCKET>",
    "arn:aws:s3:::<S3-BUCKET>/*"
  ],
  "Condition": {
    "NotIpAddressIfExists": {
      "aws:SourceIp": [
        "<CONTROL-PLANE-NAT-IP>",
        "<CORPORATE-VPN-IP>"
      ]
    },
    "StringNotEqualsIfExists": {
      "aws:sourceVpce": "<VPCE-ID>"
    }
  }
}
```

### Databricks 無料トライアル

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