Databricksのシークレット

> [Databricksにおけるシークレットの管理](https://qiita.com/taka_yayoi/items/338ef0c5394fe4eb87c0)のコンテンツです。

[Secrets \| Databricks on AWS](https://docs.databricks.com/security/secrets/secrets.html) [2021/4/12時点]の翻訳です。

シークレットは機密情報を格納するキーバリュー形式の情報です。キーの名前は[シークレットスコープ](https://qiita.com/taka_yayoi/items/b9c046e7a9106f46873a)において一意である必要があります。一つのスコープには1,000のシークレットを格納できます。シークレットの最大サイズは128KBです。

# シークレットの作成

シークレットの名前は大文字小文字を区別しません。

[Databricks CLI](https://docs.databricks.com/dev-tools/cli/index.html)(バージョン0.7.1以降)を使用して、Databricks管理のシークレットを作成するには以下を実行します。

```bash
databricks secrets put --scope <scope-name> --key <key-name>
```

エディターが開き、以下の内容が表示されます。

```bash
# ----------------------------------------------------------------------
# Do not edit the above line. Everything that follows it will be ignored.
# Please input your secret value above the line. Text will be stored in
# UTF-8 (MB4) form and any trailing new line will be stripped.
# Exit without saving will abort writing secret.
```

横線の上にシークレットの値を貼り付け、保存後エディターを終了します。スコープ内にキーとバリューのセットとして保存されます。

すでにキーが存在するものに対して書き込みを行うと、新たな値で更新されます。

ファイルやコマンドラインからシークレットを指定することも可能です。詳細は[Secrets CLI](https://docs.databricks.com/dev-tools/cli/secrets-cli.html)を参照ください。

# シークレットの一覧

特定のスコープのシークレットを表示するには以下を実行します。

```bash
databricks secrets list --scope <scope-name>
```

結果には、シークレットのキーや最終更新のタイムスタンプなどのシークレットのメタデータ情報が表示されます。ノートブックやジョブでシークレットを読み込むには[Secrets utilities](https://docs.databricks.com/dev-tools/databricks-utils.html#dbutils-secrets)を使用します。

```bash
databricks secrets list --scope jdbc
```

```bash
Key name    Last updated
----------  --------------
password    1531968449039
username    1531968408097
```

# シークレットの読み込み

シークレットはREST APIやCLIで作成できますが、ノートブックやジョブからシークレットを読み込むためには[Secrets utilities](https://docs.databricks.com/dev-tools/databricks-utils.html#dbutils-secrets)を使用します。

## Spark設定と環境変数におけるシークレットのパス

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

> **注意**
Databricksランタイム6.1以降で利用できます。

Sparkの設定や環境変数にシークレットへのパスを含めることができます。取得されたシークレットはノートブックの出力やSparkドライバー、エグゼキューターのログからは削除されます。

> **重要!**
シークレットはstdout、stderrからは削除されません。ワークアラウンドとしては、Sparkの設定で`spark.databricks.acl.needAdminPermissionToViewLogs true`を指定することで、stdoutページを`MANAGE`権限を持つユーザーのみが参照できるようにするというものです。

### 要件及び制限

- クラスターの作成者はシークレットスコープに対する`Read`権限を持つ必要があります。
- クラスターの作成者のみが、Spark設定や環境変数にシークレットのパスを指定することができ、既存のスコープ名を編集することができます。[Put secret](https://docs.databricks.com/dev-tools/api/latest/secrets.html#secretsecretserviceputsecret) APIを用いてシークレットを変更します。その後、クラスターを再起動してシークレットを再取得する必要があります。
- クラスターに対する`Can Manage`権限を持つユーザーは、シークレットや環境変数を削除することができます。

### パスの値

Spark設定や環境変数におけるパスの値は、`{{secrets/<scope-name>/<secret-name>}}`の書式で指定される必要があります。

値は、`{{secrets/`で始まり、`}}`で終わる必要があります。設定および環境変数における変数値は以下の通りとなります。

- `<secret-prop-name>`: Spark設定におけるシークレットのプロパティ
- `<scope-name>`: シークレットが関連づけられているスコープ名
- `<secret-name>`: スコープに含まれるシークレット名

> **注意**

> - `{}`の間にスペースを含めることはできません。スペースが含まれている場合、スコープやシークレット名の一部として取り扱われます。
- 書式が正しくない場合、例えば、`{{`や`}}`で閉じられていない場合、値はSpark設定や環境変数として取り扱われます。

### Spark設定にシークレットへのパスを含める

[AWS configurations](https://docs.databricks.com/clusters/configure.html#spark-config)で、以下の書式でシークレットパスを指定することができます。

```ini
spark.<secret-prop-name> <path-value>
```

`spark.<secret-prop-name>`は、シークレットのパスにマッピングされるSpark設定のプロパティ名となります。シークレットのプロパティ名が一意である限り、複数のシークレットをSpark設定に含めることができます。

**例**

```ini
spark.password {{secrets/testScope/testKey1}}
```

ノートブックでシークレットを参照するには、`spark.conf.get("spark.<secret-name>")`を実行します。

```python
spark.conf.get("spark.password")
```

### 環境変数にシークレットへのパスを含める

シークレットのパスを[environment variable](https://docs.databricks.com/clusters/configure.html#environment-variables)に含め、[cluster\-scoped init script](https://docs.databricks.com/clusters/init-scripts.html#environment-variables)で使用することが可能です。Sparkで実行されているプログラムから環境変数に*アクセスすることはできません*。

```ini
SPARKPASSWORD=<path-value>
```

init scriptでシークレットにアクセするには、`$SPARKPASSWORD`で参照します。

```bash
if [[ $SPARKPASSWORD ]]; then
  use $SPARKPASSWORD
fi
```

# シークレットの削除

スコープからシークレットを削除するには以下を実行します。

```bash
databricks secrets delete --scope <scope-name> --key <key-name>
```

シークレットが削除された後に、[Databricks Utilities](https://docs.databricks.com/dev-tools/databricks-utils.html)によって当該のキーに対するリクエストがあった場合には、処理は失敗します。

### Databricks 無料トライアル

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