Manage cluster policies | Databricks on AWS [2022/3/2時点]の翻訳です。
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
プレビュー
本機能はパブリックプレビューです。
クラスターポリシーは、ルールセットに基づいてクラスターの設定を行う能力を制限します。ポリシールールはクラスター作成で利用できる属性や属性値を制限します。クラスターポリシーには利用を特定のユーザーやグループに制限するACLがあります。
クラスタポリシーを用いることで以下のことが可能となります。
- ユーザーによるクラスターの作成を事前に定義された設定に限定する。
- (いくつかの値を固定値にし非表示にすることで)ユーザーインタフェースをシンプルにし、より多くのユーザーが自身のクラスターを作成できるようにする。
- (時間あたりの価格に影響する属性値に制限をかけることで)クラスターあたりの最大コストを制限することによるコストコントロール
クラスターポリシーの紹介と推奨設定に関しては、以下のDatabricksクラシターポリシーの動画をご覧ください。
クラスターポリシーのアクセス権によって、ユーザーがクラスターを作成する際のポリシードロップダウンで、どのポリシーを選択できるのかを制限することができます。
- クラスターの作成権限を持つユーザーは、制限なしポリシーを選択でき、完全に設定可能なクラスターを作成することができます。
- クラスター作成権限を持ちクラスターポリシーにアクセスできるユーザーは制限なしポリシーとアクセス権があるポリシーを選択することができます。
- クラスターポリシーにのみアクセスできるユーザーは、アクセス権があるポリシーを選択することができます。
注意
ワークスペースでポリシーが作成されていない場合、ポリシーのドロップダウンは表示されません。
管理者ユーザーのみが、ポリシーを作成、編集、削除することができます。また、管理者ユーザーは全てのポリシーにアクセスできます。
本書では、UIによるポリシーの管理にフォーカスします。ポリシーを管理するためにCluster Policies API 2.0を活用することもできます。
要件
クラスターポリシーを使うには、プレミアムプラン以上が必要です。
強制ルール
ポリシールールでは以下のタイプの制約を表現することができます。
- 無効化された制御要素に対する固定値
- UIで非表示にされた制御要素に対する固定値(JSONビューでは値は見えます)
- 値のセットに限定された属性値(許可リストあるいはブロックリスト)
- 指定された正規表現に合致する属性値
- 特定のレンジに限定された数値属性
- 有効化された制御要素においてUIで使用されるデフォルト値
管理できるクラスター属性
クラスターポリシーはClusters API 2.0で制御される全てのクラスター属性をサポートしています。(タイプとクラスターのフォームのUI要素との関係に基づいて)サポートされる特定のタイプの制約は、フィールドごとに異なる場合があります。
さらに、クラスターポリシーでは以下の合成属性をサポートしています。
- 時間単位でクラスターが使用できる最大DBUである"max DBU-hour"メトリック。このメトリックは個々のクラスターレベルでのコストを直接コントロールする方法となります。
- クラスターを作成するソースの制限: ジョブサービス(jobクラスター)、クラスターUI、クラスターREST API(all-purposeクラスター)。
管理できないクラスター属性
以下のクラスター属性をクラスターポリシーで制限することはできません。
- Libraries API 2.0で管理されるライブラリ。ワークアラウンドはカスタムコンテナかinitスクリプトを使うというものです。
- ユーザーあたり作成できるクラスターの数(合計も同時に存在する数も)。ポリシーのスコープは単一のクラスターであり、ユーザーによって作成されたクラスターを知ることができません。
- 別のAPIで管理されるクラスターのアクセス権(ACL)
クラスターポリシーの定義
クラスターポリシーを作成する際に追加する、JSONのポリシー定義でクラスターポリシーを定義します。
クラスターポリシーの作成
クラスターポリシーのUIあるいはCluster Policies API 2.0を用いてクラスターポリシーを作成します。UIでクラスターポリシーを作成するには以下の手順を踏みます。
- サイドバーのクラスターをクリックします。
-
クラスターポリシータブをクリックします。
-
クラスターポリシーを作成ボタンをクリックします。
- ポリシーに名前をつけます。ポリシー名は大文字小文字を区別します。
- 定義タブにポリシー定義を貼り付けます。
- 作成をクリックします。
既存クラスターポリシーのクローン
既存のポリシーをクローンすることでクラスターポリシーを作成することができます。UIでクラスターポリシーをクローンするには以下のステップを踏みます。
- サイドバーのクラスターをクリックします。
- クラスターポリシータブをクリックします。
- クローンしたいポリシー名をクリックします。
- クローン作成をクリックします。
- 次のページでは、既存のポリシーの値を用いて全てのフィールドが埋められています。変更したい箇所の値を変更し、作成をクリックします。
クラスターポリシーのアクセス権の管理
定義上、管理者は全てのポリシーへのアクセス権を持っています。クラスターポリシーのUIあるいはCluster Policy Permissions APIを用いてクラスターポリシーのアクセス権を管理することができます。
クラスターポリシーのアクセス権の追加
UIを用いてクラスターポリシーのアクセス権を追加するには以下の手順を踏みます。
- サイドバーのクラスターをクリックします。
- クラスターポリシータブをクリックします。
- 権限タブをクリックします。
-
Nameカラムでプリンシパルを選択します。
- Permissionカラムでアクセス権を選択します。
- 追加をクリックします。
クラスターポリシーのアクセス権の削除
UIを用いてクラスターポリシーのアクセス権を削除するには以下の手順を踏みます。
UIを用いたクラスターポリシーの編集
クラスターポリシーUIあるいはCluster Policies API 2.0を用いてクラスターポリシーを編集します。UIを用いてクラスターポリシーを編集するには以下の手順を踏みます。
UIを用いたクラスターポリシーの削除
クラスターポリシーUIあるいはCluster Policies API 2.0を用いてクラスターポリシーを削除します。UIを用いてクラスターポリシーを削除するには以下の手順を踏みます。
クラスターポリシーの定義
クラスターポリシー定義は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;
}
サンプル
{
"spark_version": { "type": "fixed", "value": "7.3.x-scala2.12", "hidden": true }
}
禁止ポリシー
選択可能な属性に対して、属性の使用を禁止します。
interface ForbiddenPolicy {
type: "forbidden";
}
サンプル
このポリシーはクラスターのワーカーノード用のプールへのアタッチを禁止します。また、driver_instance_pool_id
はポリシーを継承するので、ドライバーノードに対してもプールが禁止されます。
{
"instance_pool_id": { "type": "forbidden" }
}
制限ポリシー:共通フィールド
制限ポリシーでは2つの追加フィールドを指定することができます。
-
defaultValue
- UIでクラスター作成時のフォームを埋める値 -
isOptional
- 属性を必須にする制限ポリシー。属性をオプションにするには、isOptional
をtrue
に設定します。
interface LimitedPolicyBase {
defaultValue?: string | number | boolean;
isOptional?: boolean;
}
サンプル
{
"instance_pool_id": { "type": "unlimited", "isOptional": true, "defaultValue": "id1" }
}
このサンプルポリシーは、ワーカーノード用プールに対してデフォルト値id1
を指定しますが、値はオプションとなります。クラスターを作成する際、違うプールを選択したり、プールを使用しないことも可能です。ポリシーでdriver_instance_pool_id
が指定されていない場合、クラスターを作成する際にはワーカーノードとドライバーノードで同じプールが使用されます。
許可リストポリシー
許可される値のリストです。
interface AllowlistPolicy {
type: "allowlist";
values: (string | number | boolean)[];
}
サンプル
{
"spark_version": { "type": "allowlist", "values": [ "7.2.x-scala2.12", "7.3.x-scala2.12" ] }
}
ブロックリストポリシー
許可しない値のリストです。値は完全一致なので、値をどのように表現するのかに関して寛大な属性(例えば、先頭、末尾の空白を許可)においては、期待した通りにポリシーが動作しない場合があります。
interface BlocklistPolicy {
type: "blocklist";
values: (string | number | boolean)[];
}
サンプル
{
"spark_version": { "type": "blocklist", "values": [ "4.0.x-scala2.11" ] }
}
正規表現ポリシー
正規表現にマッチする値に限定します。念の為、正規表現でマッチングする際には、常に文字列の値の先頭と末尾に合致するようにしてください。
interface RegexPolicy {
type: "regex";
pattern: string;
}
サンプル
{
"spark_version": { "type": "regex", "value": "5\\.[3456].*" }
}
レンジポリシー
minValue
とmaxValue
属性で指定されるレンジの値に限定します。値は整数値でなくてはなりません。数値の制限はdoubleの浮動小数点で表現可能なものではなくてはなりません。特定の制限がないことを示すために、minValue
、maxValue
を省略することができます。
interface RangePolicy {
type: "range";
minValue?: number;
maxValue?: number;
}
サンプル
{
"num_workers": { "type": "range", "maxValue": 10 }
}
無制限ポリシー
値の制限を定義しません。UIで属性を必須にするかデフォルト値に設定するためにこのポリシータイプを使用できます。
interface UnlimitedPolicy {
type: "unlimited";
}
COST_BUCKET
タグの追加を要求するには以下のポリシーを用います。
サンプル
{
"custom_tags.COST_BUCKET": { "type": "unlimited" }
}
Spark設定の変数に対するデフォルト値を設定し、省略(削除)を許可するには以下のポリシーを用います。
{
"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 init_scripts.*.dbfs.destination init_scripts.*.file.destination 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 |
文字列 | 作成できるクラスターのタイプを表現。
all-purpose の値が許可されない場合、all-purposeクラスターの作成フォームにはこのポリシーは表示されません。job の値が許可されない場合、新規ジョブクラスターフォームにはこのポリシーは表示されません。 |
配列属性
2つの方法で配列属性のポリシーを指定することができます。
- 全ての配列要素に対して一般的な制限をかけます。これらの制限では、ポリシーパスに
*
ワイルドカード記号を使用します。 - 特定のインデックスにある配列要素に対して固有の制限をかけます。これらの制限では、パスで番号を使用します。
例えば、配列属性ssh_public_keys
に対しては、一般的なパスはssh_public_keys.*
となり、特定のパスはssh_public_keys.<n>
の形態をとり、<n>
は配列の整数インデックス(0スタート)となります。一般的な制限と固有の制限を組み合わせることができ、この場合、固有の制限が適用されていない配列要素のそれぞれに一般的な制限が適用されます。それぞれのケースでは、1つのみポリシーが適用されます。
配列ポリシーの典型的なユースケースは以下のようなものとなります。
-
以下のように包含されているもの固有のエントリー。
JSON{ "ssh_public_keys.0": { "type": "fixed", "value": "<required-key-1>" }, "ssh_public_keys.1": { "type": "fixed", "value": "<required-key-2>" } }
順序を指定することなしに固有のキーを要求することはできません。
-
以下のようにリスト全体固有値を要求する。
JSON{ "ssh_public_keys.0": { "type": "fixed", "value": "<required-key-1>" }, "ssh_public_keys.*": { "type": "forbidden" } }
-
完全に利用を禁止する。
JSON{ "ssh_public_keys.*": { "type": "forbidden" } }
-
-
任意のエントリーの数を許可するが、以下のように固有の制限意思違うことを強制する。
JSON{ "ssh_public_keys.*": { "type": "regex", "pattern": ".*<required-content>.*" } }
init_scripts
パスの場合、配列にはユースケースに応じて取り扱われる必要がある全ての要素に対する構造が含まれます。例えば、特定のinitスクリプトのセットを要求する場合、以下のパターンを使うことができます。
{
"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"
},
}
クラスターポリシーのサンプル
一般的なクラスターポリシー
タグを要求し、インスタンスの最大数を制限し、タイムアウトを強制することで、ユーザーをガイドし、いくつかの機能を制限することを意図した一般的な目的のクラスターポリシーです。
{
"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"
}
}
シンプルな中サイズのポリシー
最低限の設定で中サイズのクラスターを作成できるポリシーです。作成時に必要なフィールドはクラスター名のみです。他の設定は固定で非表示となります。
{
"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クラスターを作成することはできません。
{
"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が動作する、ワーカーノードなしのシングルノードクラスターの作成を許可します。サンプルポリシーに関しては、シングルノードクラスターポリシーを参照ください。
ハイコンカレンシーパススルーのポリシー
デフォルトでパススルーが有効化されたハイコンカレンシークラスターの作成を許可します。このようにすることで、ユーザーは手動で適切なSparkパラメーターを設定する必要がなくなります。
{
"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"
}
}
外部メタストアのポリシー
管理者が定義済みのメタストアがすでにアタッチされた状態でクラスターの作成を許可します。これは、追加の設定なしにユーザーが自身でクラスターを作成できるので有用です。
{
"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>"
}
}