Databricksクラスターポリシーの管理

[Manage cluster policies \| Databricks on AWS](https://docs.databricks.com/administration-guide/clusters/policies.html) [2022/3/2時点]の翻訳です。

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

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

クラスターポリシーは、ルールセットに基づいて[クラスターの設定](https://qiita.com/taka_yayoi/items/8d951b660cd87c6c5f18)を行う能力を制限します。ポリシールールはクラスター作成で利用できる属性や属性値を制限します。クラスターポリシーには利用を特定のユーザーやグループに制限するACLがあります。

クラスタポリシーを用いることで以下のことが可能となります。

- ユーザーによるクラスターの作成を事前に定義された設定に限定する。
- (いくつかの値を固定値にし非表示にすることで)ユーザーインタフェースをシンプルにし、より多くのユーザーが自身のクラスターを作成できるようにする。
- (時間あたりの価格に影響する属性値に制限をかけることで)クラスターあたりの最大コストを制限することによるコストコントロール

クラスターポリシーの紹介と推奨設定に関しては、以下のDatabricksクラシターポリシーの動画をご覧ください。
<iframe width="560" height="315" src="https://www.youtube.com/embed/-eIz1lhDvJo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

クラスターポリシーのアクセス権によって、ユーザーがクラスターを作成する際の**ポリシー**ドロップダウンで、どのポリシーを選択できるのかを制限することができます。

- [クラスターの作成権限](https://docs.databricks.com/administration-guide/access-control/cluster-acl.html#cluster-create-permission)を持つユーザーは、[**制限なし**](https://qiita.com/taka_yayoi/items/8d951b660cd87c6c5f18#%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC)ポリシーを選択でき、完全に設定可能なクラスターを作成することができます。
- クラスター作成権限を持ちクラスターポリシーにアクセスできるユーザーは**制限なし**ポリシーとアクセス権があるポリシーを選択することができます。
- クラスターポリシーにのみアクセスできるユーザーは、アクセス権があるポリシーを選択することができます。

:::note info
**注意**
[ワークスペースでポリシーが作成](#クラスターポリシーの作成)されていない場合、ポリシーのドロップダウンは表示されません。
:::

管理者ユーザーのみが、ポリシーを作成、編集、削除することができます。また、管理者ユーザーは全てのポリシーにアクセスできます。

本書では、UIによるポリシーの管理にフォーカスします。ポリシーを管理するために[Cluster Policies API 2\.0](https://docs.databricks.com/dev-tools/api/latest/policies.html)を活用することもできます。

# 要件

クラスターポリシーを使うには、[プレミアムプラン以上](https://databricks.com/jp/product/aws-pricing)が必要です。

# 強制ルール

ポリシールールでは以下のタイプの制約を表現することができます。

- 無効化された制御要素に対する固定値
- UIで非表示にされた制御要素に対する固定値(JSONビューでは値は見えます)
- 値のセットに限定された属性値(許可リストあるいはブロックリスト)
- 指定された正規表現に合致する属性値
- 特定のレンジに限定された数値属性
- 有効化された制御要素においてUIで使用されるデフォルト値

# 管理できるクラスター属性

クラスターポリシーは[Clusters API 2\.0](https://docs.databricks.com/dev-tools/api/latest/clusters.html)で制御される全ての[クラスター属性](#クラスターポリシー属性パス)をサポートしています。(タイプとクラスターのフォームのUI要素との関係に基づいて)サポートされる特定のタイプの制約は、フィールドごとに異なる場合があります。

さらに、クラスターポリシーでは以下の[合成属性](#クラスターポリシー仮想属性パス)をサポートしています。

- 時間単位でクラスターが使用できる最大DBUである"max DBU-hour"メトリック。このメトリックは個々のクラスターレベルでのコストを直接コントロールする方法となります。
- クラスターを作成するソースの制限: ジョブサービス(jobクラスター)、クラスターUI、クラスターREST API(all-purposeクラスター)。

# 管理できないクラスター属性

以下のクラスター属性をクラスターポリシーで制限することはできません。

- [Libraries API 2\.0](https://docs.databricks.com/dev-tools/api/latest/libraries.html)で管理されるライブラリ。ワークアラウンドは[カスタムコンテナ](https://docs.databricks.com/clusters/custom-containers.html#containers)か[initスクリプト](https://qiita.com/taka_yayoi/items/88cb46be00a175085f87)を使うというものです。
- ユーザーあたり作成できるクラスターの数(合計も同時に存在する数も)。ポリシーのスコープは単一のクラスターであり、ユーザーによって作成されたクラスターを知ることができません。
- 別のAPIで管理されるクラスターのアクセス権(ACL)

# クラスターポリシーの定義

クラスターポリシーを作成する際に追加する、[JSONのポリシー定義](#クラスターポリシーの定義)でクラスターポリシーを定義します。

# クラスターポリシーの作成

クラスターポリシーのUIあるいは[Cluster Policies API 2\.0](https://docs.databricks.com/dev-tools/api/latest/policies.html)を用いてクラスターポリシーを作成します。UIでクラスターポリシーを作成するには以下の手順を踏みます。

1. サイドバーの![](https://docs.databricks.com/_images/clusters-icon.png)**クラスター**をクリックします。
1. **クラスターポリシー**タブをクリックします。
![](https://docs.databricks.com/_images/cluster-policy-create.png)
1. **クラスターポリシーを作成**ボタンをクリックします。
![](https://docs.databricks.com/_images/cluster-policy.png)
1. ポリシーに名前をつけます。ポリシー名は大文字小文字を区別します。
1. **定義**タブに[ポリシー定義](#クラスターポリシーの定義)を貼り付けます。
1. **作成**をクリックします。

# 既存クラスターポリシーのクローン

既存のポリシーをクローンすることでクラスターポリシーを作成することができます。UIでクラスターポリシーをクローンするには以下のステップを踏みます。

1. サイドバーの![](https://docs.databricks.com/_images/clusters-icon.png)**クラスター**をクリックします。
1. **クラスターポリシー**タブをクリックします。
1. クローンしたいポリシー名をクリックします。
1. **クローン作成**をクリックします。
1. 次のページでは、既存のポリシーの値を用いて全てのフィールドが埋められています。変更したい箇所の値を変更し、**作成**をクリックします。

# クラスターポリシーのアクセス権の管理

定義上、管理者は全てのポリシーへのアクセス権を持っています。クラスターポリシーのUIあるいは[Cluster Policy Permissions API](https://docs.databricks.com/dev-tools/api/latest/policies.html#cluster-policy-permissions-api)を用いてクラスターポリシーのアクセス権を管理することができます。

## クラスターポリシーのアクセス権の追加

UIを用いてクラスターポリシーのアクセス権を追加するには以下の手順を踏みます。

1. サイドバーの![](https://docs.databricks.com/_images/clusters-icon.png)**クラスター**をクリックします。
1. **クラスターポリシー**タブをクリックします。
1. **権限**タブをクリックします。
1. **Name**カラムでプリンシパルを選択します。
![](https://docs.databricks.com/_images/policy-permission-principal.png)
1. **Permission**カラムで[アクセス権](https://docs.databricks.com/dev-tools/api/latest/policies.html#permissionlevel)を選択します。
1. **追加**をクリックします。

## クラスターポリシーのアクセス権の削除

UIを用いてクラスターポリシーのアクセス権を削除するには以下の手順を踏みます。

1. サイドバーの![](https://docs.databricks.com/_images/clusters-icon.png)**クラスター**をクリックします。
1. **クラスターポリシー**タブをクリックします。
1. **権限**タブをクリックします。
1. アクセス権の行の![](https://docs.databricks.com/_images/delete-icon.png)アイコンをクリックします。

# UIを用いたクラスターポリシーの編集

クラスターポリシーUIあるいは[Cluster Policies API 2\.0](https://docs.databricks.com/dev-tools/api/latest/policies.html)を用いてクラスターポリシーを編集します。UIを用いてクラスターポリシーを編集するには以下の手順を踏みます。

1. サイドバーの![](https://docs.databricks.com/_images/clusters-icon.png)**クラスター**をクリックします。
1. **クラスターポリシー**タブをクリックします。
![](https://docs.databricks.com/_images/cluster-policy-create.png)
1. ポリシー名をクリックします。
1. **編集**をクリックします。
1. 定義タブでポリシー定義を編集します。
1. **更新**をクリックします。

# UIを用いたクラスターポリシーの削除

クラスターポリシーUIあるいは[Cluster Policies API 2\.0](https://docs.databricks.com/dev-tools/api/latest/policies.html)を用いてクラスターポリシーを削除します。UIを用いてクラスターポリシーを削除するには以下の手順を踏みます。

1. サイドバーの![](https://docs.databricks.com/_images/clusters-icon.png)**クラスター**をクリックします。
1. **クラスターポリシー**タブをクリックします。
![](https://docs.databricks.com/_images/cluster-policy-create.png)
1. ポリシー名をクリックします。
1. **削除**をクリックします。
1. 確認して**削除**をクリックします。

# クラスターポリシーの定義

*クラスターポリシー定義*はJSONで表現される個々のポリシー定義のコレクションです。

- [ポリシー定義](#ポリシー定義)
- [ポリシー要素](#ポリシー要素)
- [クラスターポリシー属性パス](#クラスターポリシー属性パス)
- [クラスターポリシー仮想属性パス](#クラスターポリシー属性パス)
- [配列属性](#配列属性)
- [クラスターポリシーのサンプル](#クラスターポリシーのサンプル)

## ポリシー定義

*ポリシー定義*は*属性を定義するパス文字列*と*制限タイプ*のマッピングです。属性ごとに一つの制限のみが存在し得ます。パスはリソースタイプ固有で、リソース作成APIの属性名を反映しています。リソース作成でネストされた属性を使用している場合、パスはドットを使ってネストされた属性を結合します。ポリシー定義で定義されていない属性は、ポリシーを用いてクラスターを作成す際に制限を受けません。

```
interface Policy {
  [path: string]: PolicyElement
}
```

## ポリシー要素

*ポリシー要素*は指定された属性でサポートされている制限タイプの一つとオプションでデフォルト値を指定します。ポリシーの属性に制限を定義することなしに、デフォルト値を指定することができます。

```
type PolicyElement = FixedPolicy | ForbiddenPolicy | (LimitingPolicyBase & LimitingPolicy);
type LimitingPolicy = AllowlistPolicy | BlocklistPolicy | RegexPolicy | RangePolicy | UnlimitedPolicy;
```

このセクションではポリシーのタイプを説明します。

- [固定ポリシー](#固定ポリシー)
- [禁止ポリシー](#禁止ポリシー)
- [制限ポリシー：共通フィールド](#制限ポリシー共通フィールド)
- [許可リストポリシー](#許可リストポリシー)
- [ブロックリストポリシー](#ブロックリストポリシー)
- [正規表現ポリシー](#正規表現ポリシー)
- [レンジポリシー](#レンジポリシー)
- [無制限ポリシー](#無制限ポリシー)

### 固定ポリシー

値と指定されたものに限定します。数値、ブール値以外の属性値においては、属性の値は文字列あるいは文字列に変換可能なものである必要があります。オプションで`hidden`フラグを`true`に設定することで、属性をUI上で非表示にすることができます。固定ポリシーではデフォルト値を指定することはできません。

```
interface FixedPolicy {
    type: "fixed";
    value: string | number | boolean;
    hidden?: boolean;
}
```

**サンプル**

```json:JSON
{
  "spark_version": { "type": "fixed", "value": "7.3.x-scala2.12", "hidden": true }
}
```

### 禁止ポリシー

選択可能な属性に対して、属性の使用を禁止します。


```
interface ForbiddenPolicy {
    type: "forbidden";
}
```

**サンプル**

このポリシーはクラスターのワーカーノード用のプールへのアタッチを禁止します。また、`driver_instance_pool_id`はポリシーを継承するので、ドライバーノードに対してもプールが禁止されます。

```json:JSON
{
  "instance_pool_id": { "type": "forbidden" }
}
```

### 制限ポリシー：共通フィールド

制限ポリシーでは2つの追加フィールドを指定することができます。

- `defaultValue` - UIでクラスター作成時のフォームを埋める値
- `isOptional` - 属性を必須にする制限ポリシー。属性をオプションにするには、`isOptional`を`true`に設定します。

```
interface LimitedPolicyBase {
    defaultValue?: string | number | boolean;
    isOptional?: boolean;
}
```

**サンプル**

```json:JSON
{
  "instance_pool_id": { "type": "unlimited", "isOptional": true, "defaultValue": "id1" }
}
```

このサンプルポリシーは、ワーカーノード用プールに対してデフォルト値`id1`を指定しますが、値はオプションとなります。クラスターを作成する際、違うプールを選択したり、プールを使用しないことも可能です。ポリシーで`driver_instance_pool_id`が指定されていない場合、クラスターを作成する際にはワーカーノードとドライバーノードで同じプールが使用されます。

### 許可リストポリシー

許可される値のリストです。

```
interface AllowlistPolicy {
  type: "allowlist";
  values: (string | number | boolean)[];
}
```

**サンプル**

```json:JSON
{
  "spark_version":  { "type": "allowlist", "values": [ "7.2.x-scala2.12", "7.3.x-scala2.12" ] }
}
```

### ブロックリストポリシー

許可しない値のリストです。値は完全一致なので、値をどのように表現するのかに関して寛大な属性(例えば、先頭、末尾の空白を許可)においては、期待した通りにポリシーが動作しない場合があります。

```
interface BlocklistPolicy {
  type: "blocklist";
  values: (string | number | boolean)[];
}
```

**サンプル**

```json:JSON
{
  "spark_version":  { "type": "blocklist", "values": [ "4.0.x-scala2.11" ] }
}
```

### 正規表現ポリシー

正規表現にマッチする値に限定します。念の為、正規表現でマッチングする際には、常に文字列の値の先頭と末尾に合致するようにしてください。

```
interface RegexPolicy {
  type: "regex";
  pattern: string;
}
```

**サンプル**

```json:JSON
{
  "spark_version":  { "type": "regex", "value": "5\\.[3456].*" }
}
```

### レンジポリシー

`minValue`と`maxValue`属性で指定されるレンジの値に限定します。値は整数値でなくてはなりません。数値の制限はdoubleの浮動小数点で表現可能なものではなくてはなりません。特定の制限がないことを示すために、`minValue`、`maxValue`を省略することができます。

```
interface RangePolicy {
  type: "range";
  minValue?: number;
  maxValue?: number;
}
```

**サンプル**

```json:JSON
{
  "num_workers":  { "type": "range", "maxValue": 10 }
}
```

### 無制限ポリシー

値の制限を定義しません。UIで属性を必須にするかデフォルト値に設定するためにこのポリシータイプを使用できます。

```
interface UnlimitedPolicy {
  type: "unlimited";
}
```

`COST_BUCKET`タグの追加を要求するには以下のポリシーを用います。

**サンプル**

```json:JSON
{
  "custom_tags.COST_BUCKET":  { "type": "unlimited" }
}
```

Spark設定の変数に対するデフォルト値を設定し、省略(削除)を許可するには以下のポリシーを用います。

```json:JSON
{
  "spark_conf.spark.my.conf":  { "type": "unlimited", "isOptional": true, "defaultValue": "my_value" }
}
```

## クラスターポリシー属性パス

以下のテーブルでは、サポートされているクラスターポリシー属性パスを一覧しています。

| 属性パス | 型 | 説明 |
|:--|:--|:--|
| `autoscale.max_workers`  |数値、オプション   |非表示の場合、UIから最大ワーカー数のフィールドは削除されます。   |
| `autoscale.min_workers`  |数値、オプション   |非表示の場合、UIから最小ワーカー数のフィールドは削除されます。   |
| `autotermination_minutes`  | 数値  | 値0は自動停止しないことを意味します。非表示の場合、UIから自動停止のチェックボックスと入力フォームは削除されます。  |
| `aws_attributes.availability`  | 文字列  | AWSインスタンスの可用性(`SPOT`, `ON_DEMAND`, `SPOT_WITH_FALLBACK`)を指定します。  |
| `aws_attributes.ebs_volume_count`  | 数値  | AWS EBSボリュームの数  |
| `aws_attributes.ebs_volume_size`  | 数値  | AWS EBSボリュームのサイズ(GB)  |
| `aws_attributes.ebs_volume_type`  | 文字列  | AWS EBSボリュームのタイプ  |
| `aws_attributes.first_on_demand`  |  数値 | オンデマンドインスタンスにするノード数をコントロール  |
| `aws_attributes.instance_profile_arn`  | 文字列  | AWSインスタンスプロファイルをコントロール  |
| `aws_attributes.spot_bid_price_percent`  |  数値 | AWSスポットインスタンスに対する最大価格をコントロール  |
| `aws_attributes.zone_id`  |  文字列 | AWSゾーンIDをコントロール  |
| `cluster_log_conf.path` | 文字列  | ログファイルの送信先URL  |
| `cluster_log_conf.region`  | 文字列  |  S3ロケーションのリージョン |
| `cluster_log_conf.type`  |S3, DBFS, NONE   | ログ送信先のタイプ  |
| `cluster_name`  |  文字列 | クラスター名  |
| `custom_tags.*`  |  文字列 | 例えば、`custom_tags.<mytag>`のように、タグ名を追加することで特定のタグの値をコントロール  |
| `docker_image.basic_auth.password`  |文字列   |Databricks Container Servicesイメージのbasic認証のパスワード   |
| `docker_image.basic_auth.username`  |文字列   | Databricks Container Servicesイメージのbasic認証のユーザー名  |
| `docker_image.url`  |文字列   | Databricks Container ServicesイメージのURLをコントロール。非表示にした場合、UIからDatabricks Container Servicesのセクションは削除されます。  |
| `driver_node_type_id`  | 文字列、オプション  | 非表示にした場合、UIからドライバーノードタイプのセクションは削除されます。  |
| `enable_elastic_disk`  | ブール  |  非表示にした場合、UIから**Enable autoscaling local storage**のチェックボックスは削除されます。 |
| `enable_local_disk_encryption`  | ブール  |  クラスターローカルにアタッチされるディスクの暗号化を有効化するには`true`を設定し、無効化するには`false`を設定します(APIでの指定と同様です)。 |
| `init_scripts.*.s3.destination`<br>`init_scripts.*.dbfs.destination`<br>`init_scripts.*.file.destination`<br>`init_scripts.*.s3.region`  | 文字列  | `*`は属性配列におけるinitスクリプトのインデックスを参照します。[配列属性](#配列属性)を参照ください。  |
| `instance_pool_id`  |  文字列 | `driver_instance_pool_id`も定義されている場合はワーカーノードで使用されるプールをコントロールします。そうでない場合はすべてのクラスターノードのプールをコントロールします。ワーカーノードに対してプールを使用している場合、ドライバーノードに対してもプールを使用する必要があります。非表示の場合、UIからプールの選択機能が削除されます。  |
|  `driver_instance_pool_id` |  文字列 | 指定されている場合、ドライバーノードではワーカーノードとは別のプールを使用します。指定されない場合、`instance_pool_id`を継承します。ワーカーノードに対してプールを使用している場合、ドライバーノードに対してもプールを使用する必要があります。非表示の場合、UIからドライバー向けプールの選択機能が削除されます。  |
|  `node_type_id` | 文字列  | 非表示の場合、UIからノードタイプの選択機能が削除されます。  |
|  `num_workers` | 数値、オプション  | 非表示の場合、UIでワーカー数の指定はできません。  |
|  `single_user_name` |  文字列 | シングルユーザーアクセスのクレディンシャルパススルーのユーザー名  |
| `spark_conf.*`  | 文字列、オプション  | 設定キーの名前を追加することで特定の設定値コントロールします。例えば`spark_conf.spark.executor.memory`  |
|  `spark_env_vars.*` | 文字列、オプション  | 環境変数を追加することで特定のSpark環境変数をコントロールします。例えば`spark_env_vars.<environment variable name>`  |
|  `spark_version` | 文字列  | Sparkのイメージバージョン名(APIでの指定と同じです)  |
| `ssh_public_keys.*`  | 文字列  | `*`は属性配列の公開キーのインデックスを参照します。[配列属性](#配列属性)を参照ください。  |



## クラスターポリシー仮想属性パス

| 属性パス | 型 | 説明 |
|:--|:--|:--|
| `dbus_per_hour`  | 数値  |ドライバーノードを含むクラスターのDBUコスト(オートスケーリングクラスターの場合は最大値)を表現する計算される属性。レンジ制限で使用。   |
| `cluster_type`  | 文字列  | 作成できるクラスターのタイプを表現。<ul><li>`all-purpose` Databricks all-purposeクラスター<li>`job` ジョブスケジューラによって作成されるjobクラスター<li>`dlt` Delta Live Tablesパイプラインで作成されるクラスター</ul>ポリシーから許可、ブロックするタイプのクラスターを指定します。`all-purpose`の値が許可されない場合、all-purposeクラスターの作成フォームにはこのポリシーは表示されません。`job`の値が許可されない場合、新規ジョブクラスターフォームにはこのポリシーは表示されません。  |


## 配列属性

2つの方法で配列属性のポリシーを指定することができます。

- 全ての配列要素に対して一般的な制限をかけます。これらの制限では、ポリシーパスに`*`ワイルドカード記号を使用します。
- 特定のインデックスにある配列要素に対して固有の制限をかけます。これらの制限では、パスで番号を使用します。

例えば、配列属性`ssh_public_keys`に対しては、一般的なパスは`ssh_public_keys.*`となり、特定のパスは`ssh_public_keys.<n>`の形態をとり、`<n>`は配列の整数インデックス(0スタート)となります。一般的な制限と固有の制限を組み合わせることができ、この場合、固有の制限が適用されていない配列要素のそれぞれに一般的な制限が適用されます。それぞれのケースでは、1つのみポリシーが適用されます。

配列ポリシーの典型的なユースケースは以下のようなものとなります。

- 以下のように包含されているもの固有のエントリー。

    ```json:JSON
    {
      "ssh_public_keys.0": {
        "type": "fixed",
        "value": "<required-key-1>"
      },
      "ssh_public_keys.1": {
        "type": "fixed",
        "value": "<required-key-2>"
      }
    }
   ```

    順序を指定することなしに固有のキーを要求することはできません。

    - 以下のようにリスト全体固有値を要求する。

        ```json:JSON
        {
          "ssh_public_keys.0": {
            "type": "fixed",
            "value": "<required-key-1>"
          },
          "ssh_public_keys.*": {
            "type": "forbidden"
          }
        }
        ```

    - 完全に利用を禁止する。

        ```json:JSON
        {
          "ssh_public_keys.*": {
            "type": "forbidden"
          }
        }
        ```

- 任意のエントリーの数を許可するが、以下のように固有の制限意思違うことを強制する。

    ```json:JSON
    {
      "ssh_public_keys.*": {
        "type": "regex",
        "pattern": ".*<required-content>.*"
      }
    }
    ```

`init_scripts`パスの場合、配列にはユースケースに応じて取り扱われる必要がある全ての要素に対する構造が含まれます。例えば、特定のinitスクリプトのセットを要求する場合、以下のパターンを使うことができます。

```json:JSON
{
  "init_scripts.0.s3.destination": {
    "type": "fixed",
    "value": "s3://<s3-path>"
  },
  "init_scripts.0.s3.region": {
    "type": "fixed",
    "value": "<s3-region>"
  },
  "init_scripts.1.dbfs.destination": {
    "type": "fixed",
    "value": "dbfs://<dbfs-path>"
  },
  "init_scripts.*.s3.destination": {
    "type": "forbidden"
  },
  "init_scripts.*.dbfs.destination": {
    "type": "forbidden"
  },
  "init_scripts.*.file.destination": {
    "type": "forbidden"
  },
}
```

## クラスターポリシーのサンプル

- [一般的なクラスターポリシー](#一般的なクラスターポリシー)
- [シンプルな中サイズのポリシー](#シンプルな中サイズのポリシー)
- [ジョブオンリーのポリシー](#ジョブオンリーのポリシー)
- [シングルノードのポリシー](#シングルノードのポリシー)
- [ハイコンカレンシーパススルーのポリシー](#ハイコンカレンシーパススルーのポリシー)
- [外部メタストアのポリシー](#外部メタストアのポリシー)

### 一般的なクラスターポリシー

タグを要求し、インスタンスの最大数を制限し、タイムアウトを強制することで、ユーザーをガイドし、いくつかの機能を制限することを意図した一般的な目的のクラスターポリシーです。

```json:JSON
{
  "spark_conf.spark.databricks.cluster.profile": {
    "type": "fixed",
    "value": "serverless",
    "hidden": true
  },
  "instance_pool_id": {
    "type": "forbidden",
    "hidden": true
  },
  "spark_version": {
    "type": "regex",
    "pattern": "7\\.[0-9]+\\.x-scala.*"
  },
  "node_type_id": {
    "type": "allowlist",
    "values": [
      "i3.xlarge",
      "i3.2xlarge",
      "i3.4xlarge"
    ],
    "defaultValue": "i3.2xlarge"
  },
  "driver_node_type_id": {
    "type": "fixed",
    "value": "i3.2xlarge",
    "hidden": true
  },
  "autoscale.min_workers": {
    "type": "fixed",
    "value": 1,
    "hidden": true
  },
  "autoscale.max_workers": {
    "type": "range",
    "maxValue": 25,
    "defaultValue": 5
  },
  "enable_elastic_disk": {
    "type": "fixed",
    "value": true,
    "hidden": true
  },
  "autotermination_minutes": {
    "type": "fixed",
    "value": 30,
    "hidden": true
  },
  "custom_tags.team": {
    "type": "fixed",
    "value": "product"
  }
}
```

### シンプルな中サイズのポリシー

最低限の設定で中サイズのクラスターを作成できるポリシーです。作成時に必要なフィールドはクラスター名のみです。他の設定は固定で非表示となります。

```json:JSON
{
  "instance_pool_id": {
    "type": "forbidden",
    "hidden": true
  },
  "spark_conf.spark.databricks.cluster.profile": {
    "type": "forbidden",
    "hidden": true
  },
  "autoscale.min_workers": {
    "type": "fixed",
    "value": 1,
    "hidden": true
  },
  "autoscale.max_workers": {
    "type": "fixed",
    "value": 10,
    "hidden": true
  },
  "autotermination_minutes": {
    "type": "fixed",
    "value": 60,
    "hidden": true
  },
  "node_type_id": {
    "type": "fixed",
    "value": "i3.xlarge",
    "hidden": true
  },
  "driver_node_type_id": {
    "type": "fixed",
    "value": "i3.xlarge",
    "hidden": true
  },
  "spark_version": {
    "type": "fixed",
    "value": "7.3.x-scala2.12",
    "hidden": true
  },
  "enable_elastic_disk": {
    "type": "fixed",
    "value": false,
    "hidden": true
  },
  "custom_tags.team": {
    "type": "fixed",
    "value": "product"
  }
}
```

### ジョブオンリーのポリシー

クラスターを用いてジョブクラスターを作成し、ジョブを実行することを許可します。このポリシーでは、ユーザーはall-purposeクラスターを作成することはできません。

```json:JSON
{
  "cluster_type": {
    "type": "fixed",
    "value": "job"
  },
  "dbus_per_hour": {
    "type": "range",
    "maxValue": 100
  },
  "instance_pool_id": {
    "type": "forbidden",
    "hidden": true
  },
  "num_workers": {
    "type": "range",
    "minValue": 1
  },
  "node_type_id": {
    "type": "regex",
    "pattern": "[rmci][3-5][rnad]*.[0-8]{0,1}xlarge"
  },
  "driver_node_type_id": {
    "type": "regex",
    "pattern": "[rmci][3-5][rnad]*.[0-8]{0,1}xlarge"
  },
  "spark_version": {
    "type": "regex",
    "pattern": "7\\.[0-9]+\\.x-scala.*"
  },
  "custom_tags.team": {
    "type": "fixed",
    "value": "product"
  }
}
```

### シングルノードのポリシー

ローカルモードで有効化されたSparkが動作する、ワーカーノードなしのシングルノードクラスターの作成を許可します。サンプルポリシーに関しては、[シングルノードクラスターポリシー](https://qiita.com/taka_yayoi/items/6e7c6cc14a5017ef6d15#%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%8E%E3%83%BC%E3%83%89%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%AE%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC)を参照ください。

### ハイコンカレンシーパススルーのポリシー

デフォルトでパススルーが有効化されたハイコンカレンシークラスターの作成を許可します。このようにすることで、ユーザーは手動で適切なSparkパラメーターを設定する必要がなくなります。

```json:JSON
{
  "spark_conf.spark.databricks.passthrough.enabled": {
    "type": "fixed",
    "value": "true"
  },
  "spark_conf.spark.databricks.repl.allowedLanguages": {
    "type": "fixed",
    "value": "python,sql"
  },
  "spark_conf.spark.databricks.cluster.profile": {
    "type": "fixed",
    "value": "serverless"
  },
  "spark_conf.spark.databricks.pyspark.enableProcessIsolation": {
    "type": "fixed",
    "value": "true"
  },
  "custom_tags.ResourceClass": {
    "type": "fixed",
    "value": "Serverless"
  }
}
```

### 外部メタストアのポリシー

管理者が定義済みのメタストアがすでにアタッチされた状態でクラスターの作成を許可します。これは、追加の設定なしにユーザーが自身でクラスターを作成できるので有用です。

```json:JSON
{
  "spark_conf.spark.hadoop.javax.jdo.option.ConnectionURL": {
      "type": "fixed",
      "value": "jdbc:sqlserver://<jdbc-url>"
  },
  "spark_conf.spark.hadoop.javax.jdo.option.ConnectionDriverName": {
      "type": "fixed",
      "value": "com.microsoft.sqlserver.jdbc.SQLServerDriver"
  },
  "spark_conf.spark.databricks.delta.preview.enabled": {
      "type": "fixed",
      "value": "true"
  },
  "spark_conf.spark.hadoop.javax.jdo.option.ConnectionUserName": {
      "type": "fixed",
      "value": "<metastore-user>"
  },
  "spark_conf.spark.hadoop.javax.jdo.option.ConnectionPassword": {
      "type": "fixed",
      "value": "<metastore-password>"
  }
}
```

### Databricks 無料トライアル

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