Spark 構成プロパティまたは環境変数でシークレットを使用する
この記事では、Spark 構成プロパティまたは環境変数でシークレットを参照する方法について詳しく説明します。 取得したシークレットは、ノートブックの出力と Spark ドライバーとエグゼキューターのログから編集されます。
プレビュー
この機能は パブリック プレビュー段階です。
セキュリティに関する考慮事項
Databricksでは、クラスター上のすべてのユーザーがシークレットを利用できるようにする必要がない場合、クラスター環境変数にシークレットを保存することはお勧めしていません。 Spark構成プロパティや環境変数でシークレットを参照する場合は、以下のセキュリティへの影響に留意してください。
- 
クラスターに対する Can Attach To 権限またはノートブックに対する実行権限を持つユーザは、ノートブック内からクラスター 環境変数を読み取ることができます。 
- 
クラスター上でテーブルアクセスコントロールが有効になっていない場合、クラスター上で「接続可能」権限またはノートブック上で「実行」権限を持つユーザーは、ノートブック内からSpark構成プロパティを読み取ることができます。これには、シークレットを読み取る直接権限を持たないユーザーも含まれます。 
- 
シークレットは、Spark ドライバーのログ stdoutストリームとstderrストリームから編集されません。 機密データを保護するために、デフォルトでは、 Spark ドライバー ログは、ジョブ、専用アクセス モード、および標準アクセス モード クラスターに対する CAN MANAGE 権限を持つユーザーのみが表示できます。分離なしの共有アクセス モード クラスターでは、Spark Can Attach Toまたは アクセス許可を持つユーザーが ドライバーCAN MANAGE ログを表示できます。ログを読み取ることができるユーザーを CAN MANAGE 権限を持つユーザーのみに制限するには、 spark.databricks.acl.needAdminPermissionToViewLogsをtrueに設定します。
必要条件
Spark 構成プロパティと環境変数でのシークレットの参照には、次の要件が適用されます。
- クラスターの所有者は、シークレットスコープに対する CAN READ 権限を持っている必要があります。
- クラスターの所有者である必要があるのは、 Spark 設定プロパティまたは環境変数のシークレットを追加または編集することです。
- シークレットが更新された場合は、クラスターを再起動してシークレットを再度フェッチする必要があります。
- CAN MANAGEシークレット 構成プロパティまたは環境変数を削除するには、クラスターに対するSpark 権限が必要です。
Spark 構成プロパティを使用したシークレットの参照
シークレットへの参照は、 Spark 構成プロパティ で次の形式で指定します。
spark.<property-name> {{secrets/<scope-name>/<secret-name>}}
以下のように置き換えてください。
- <scope-name>をシークレットスコープの名前に置き換えます。
- <secret-name>は、スコープ内のシークレットの一意の名前に置き換えます。
- <property-name>を Spark 構成プロパティで
各Spark構成プロパティは1つのシークレットしか参照できませんが、複数のSparkプロパティでシークレットを参照するように構成できます。
例えば:
spark.password {{secrets/scope1/key1}}
ノートブック内のシークレットを取得して使用します。
- Python
- SQL
spark.conf.get("spark.password")
SELECT ${spark.password};
環境変数でシークレットを参照する
シークレットパスは、 環境変数 で次の形式で指定します。
<variable-name>={{secrets/<scope-name>/<secret-name>}}
シークレットを参照するときは、任意の有効な変数名を使用できます。 環境変数で参照されるシークレットへのアクセスは、クラスターを設定したユーザーのパーミッションによって決まります。 環境変数に格納されたシークレットは、すべてのクラスター ユーザーがアクセスできますが、他のシークレット参照と同様に、プレーンテキスト表示からは編集されます。
シークレットを参照する環境変数には、クラスタースコープのinitスクリプトからアクセスできます。 initスクリプトによる環境変数の設定と使用を参照してください。
例えば:
シークレットを参照する環境変数を設定します。
SPARKPASSWORD={{secrets/scope1/key1}}
initスクリプトでシークレットを取得するには、以下のパターンを使用して$SPARKPASSWORDにアクセスします。
if [ -n "$SPARKPASSWORD" ]; then
  # code to use ${SPARKPASSWORD}
fi