この記事では、Unity カタログで外部の場所オブジェクトを構成して、Azure Databricks からのクラウド ストレージへのアクセスを制御する方法について説明します。
外部の場所の概要
外部のロケーションはストレージ資格情報をクラウドオブジェクトストレージコンテナーに関連付けます。 外部の場所は、次の定義に使用されます。
管理されたテーブルおよびボリューム向けのストレージの管理場所。 マネージド ストレージの場所は、メタストア、カタログ、またはスキーマ レベルで使用できます。 「Unity Catalog でマネージド ストレージの場所を指定する」をご覧ください。
外部テーブルと外部ボリュームの場所。
外部の場所では、Azure Data Lake Storage ストレージ コンテナー、AWS S3 バケット、または Cloudflare R2 バケット内のストレージを参照できます。
次の図は、1 つのクラウド ストレージ バケットまたはコンテナーのファイルシステム階層を示しています。1 つのストレージ資格情報を共有する 4 つの外部の場所があります。
外部の場所の作成の概要
次のいずれかのインターフェイスを使用して、外部の場所を作成できます。
-
このオプションでは、グラフィカル UI が提供されます。 カタログ エクスプローラーを使用して、Azure Data Lake Storage コンテナー、S3 バケット (読み取り専用)、Cloudflare R2 バケット、および DBFS ルート (レガシ) を参照する外部の場所を作成できます。
この記事では、オプション 1 と 2 について説明します。
注
DBFS ルート ストレージの場所にデータを格納することは従来の方法であり、Databricks ではそれを推奨していません。 ただし、ワークスペースが DBFS ルートにデータを格納している場合は、Unity カタログを使用してそのデータへのアクセスを管理する外部の場所を作成できます。 詳細については、 DBFS ルート (レガシ) でのデータの外部の場所の作成を参照してください。
外部の場所の使用方法と、ストレージ資格情報と外部の場所の関係の詳細については、「 Unity カタログを使用してクラウド オブジェクト ストレージに接続する」を参照してください。
開始する前に
必要条件:
Azure Databricks で外部の場所オブジェクトを作成する前に、外部の場所として使用する Azure Data Lake Storage ストレージ コンテナー、AWS S3 バケット、または Cloudflare R2 バケットを作成する必要があります。
- 外部の場所として使用する Azure Data Lake Storage ストレージ アカウントには、階層型名前空間が必要です。
S3 バケット名にはドット表記 (たとえば、
incorrect.bucket.name.notation
) を使用しないでください。 AWS ではバケット名にドットを使用できますが、Databricks ではドット表記の S3 バケットはサポートされていません。 ドットを含むバケットは、SSL証明書の検証エラーが原因で、Delta Sharing などの機能との互換性問題を引き起こす可能性があります。 詳細については、 AWS バケットの名前付けのベスト プラクティスを参照してください。外部の場所のパスには、標準の ASCII 文字 (文字
A–Z
、a–z
、数字の0–9
、および/
、_
、-
などの一般的な記号) のみを含める必要があります。バケットに S3 アクセス制御リストをアタッチすることはできません。
- クラウド ストレージの場所のパスへのアクセスを許可するストレージ資格情報が Azure Databricks で定義されている必要があります。 「Azure Data Lake Storage に接続するためのストレージ資格情報の作成」、Cloudflare R2 に接続するためのストレージ資格情報の作成、または AWS S3 に接続するためのストレージ資格情報の作成 (読み取り専用)に関するページを参照してください。
アクセス許可の要件:
- メタストアと、外部の場所で参照されているストレージ資格情報の両方に対する
CREATE EXTERNAL LOCATION
特権が必要です。 メタストア管理者には既定でメタストアに対するCREATE EXTERNAL LOCATION
権限があります。 - DBFS ルート ストレージの場所の外部の場所を作成する場合、システムはストレージ資格情報を作成できますが、ワークスペース管理者である必要があります。詳細については、DBFS ルート (レガシ) でのデータの外部の場所の作成を参照してください。
オプション 1: カタログ エクスプローラーを使用して外部の場所を作成する
Catalog Explorer を使って、外部の場所を手動で作成できます。
アクセス許可と前提条件: 「作業を開始する準備」を参照してください。
外部の場所を作成するには、次の手順を実行します。
メタストアにアタッチされているワークスペースにログインします。
サイドバーで、[データ] アイコンをクリック
カタログ。
クイック アクセス ページで、[外部データ]> ボタンをクリックし、[外部場所] タブに移動して、[場所の作成] をクリックします。
外部の場所の名前を入力します。
ストレージの 種類として、 Azure Data Lake Storage、 S3 (読み取り専用)、 R2、または DBFS ルートを選択します。
DBFS ルートにデータを格納することは、推奨されない旧式のプラクティスです。 詳細については、 DBFS ルート (レガシ) でのデータの外部の場所の作成を参照してください。
[URL] で、外部の場所へのパスを入力または選択します。
Azure Data Lake Storage、S3、R2 には、次のオプションがあります。
既存の DBFS マウント ポイントからコンテナー パスをコピーするには、[DBFS からコピー ] をクリックします。
既存のマウント ポイントからコピーしない場合は、 URL フィールドを使用して、外部の場所として使用するコンテナーまたはバケット パスを入力します。
たとえば、
abfss://my-container-name@my-storage-account.dfs.core.windows.net/<path>
またはr2://my-bucket@my-account-id.r2.cloudflarestorage.com/<path>
です。
DBFS ルートの場合:
- システムは、DBFS ルート ストレージの場所にサブパスを設定します。 ワークスペース管理者の場合は、ストレージ資格情報も自動的に作成されます。
DBFS ルート (レガシ) でのデータの外部の場所の作成を参照してください。
外部の場所へのアクセスを付与するストレージの資格情報を選択します。
注
外部の場所が DBFS ルート用で、ワークスペース管理者である場合、システムはストレージ資格情報を自動的に作成するため、ストレージ資格情報を選択する必要はありません。
ストレージ資格情報がない場合は、次のものを作成できます。
[ストレージ資格情報] ドロップダウン リストで、[+ 新しいストレージ資格情報の作成] を選択します。
入力する資格情報は、ストレージの種類によって異なります。
Azure Data Lake Storage の場合は、アクセス コネクタ ID と、(必要に応じて) ストレージの場所へのアクセスを許可するユーザー割り当てマネージド ID を入力します。 Azure Data Lake Storage にアクセスするストレージ資格情報の作成に関するページを参照してください
Cloudflare API トークンの場合は、Cloudflare アカウント、アクセス キー ID、シークレット アクセス キーを入力します。 Cloudflare R2 に接続するためのストレージ資格情報の作成を参照してください。
AWS S3 の場合は、ストレージの場所へのアクセスを許可する IAM ロール ARN を入力します。 AWS S3 に接続するためのストレージ資格情報の作成 (読み取り専用) を参照してください。
(省略可能) ユーザーに外部の場所への読み取り専用アクセスを許可する場合、[詳細オプション] をクリックし、[読み取り専用] を選択します。 詳細については、「外部の場所を読み取り専用としてマークする」を参照してください。
AWS S3 パスを参照する外部の場所は、本質的に読み取り専用です。
(省略可能) 外部の場所がHiveメタストアフェデレーションカタログを対象としている場合は、詳細オプション をクリックし、フォールバックモードを有効にします。
外部の場所でフォールバック モードを有効にするを参照してください。
(オプション、AWS S3 の場所のみ)S3 バケットに SSE 暗号化が必要な場合は、Unity カタログの外部テーブルとボリュームが S3 バケット内のデータにアクセスできるように暗号化アルゴリズムを構成できます。
手順については、「 外部の場所で暗号化アルゴリズムを構成する (AWS S3 のみ)」を参照してください。
(省略可能)外部の場所で変更通知をサブスクライブする機能を有効にするには、[ 詳細オプション] をクリックし、[ ファイル イベントを有効にする] を選択します。
詳細については、「 (推奨)外部の場所のファイル イベントを有効にする」を参照してください。
[作成] をクリックします。
(省略可能) 外部の場所を特定のワークスペースにバインドします。
既定では、特権ユーザーは誰でも、メタストアに接続された任意のワークスペース上の外部の場所を使用できます。 特定のワークスペースからのみのアクセスを許可する場合は、[ワークスペース] タブに移動し、ワークスペースを割り当ててください。 「(省略可能) 外部の場所を特定のワークスペースに割り当てる」を参照してください。
[アクセス許可] タブに移動して、外部の場所を使用するアクセス許可を付与します。
他のユーザーが外部の場所を使用可能にするには、アクセス許可を付与する必要があります。
外部の場所を使用して、マネージド ストレージの場所をメタストア、カタログ、またはスキーマに追加するには、
CREATE MANAGED LOCATION
特権を付与します。外部テーブルまたはボリュームを作成するには、
CREATE EXTERNAL TABLE
またはCREATE EXTERNAL VOLUME
を付与してください。
- [許可] をクリックします。
- [
<external location>
への付与] ダイアログの "プリンシパル" フィールドでユーザー、グループ、またはサービス プリンシパルを選択し、付与する特権を選択します。 - [許可] をクリックします。
オプション 2: SQL を使用して外部の場所を作成する
SQL を使用して外部の場所を作成するには、ノートブックまたは SQL クエリ エディターで次のコマンドを実行します。 次のプレースホルダー値を置き換えます。 必要なアクセス許可と前提条件については、「作業を開始する準備」を参照してください。
<location-name>
: 外部の場所の名前。location_name
にハイフン (-
) などの特殊文字が含まれている場合は、バッククォート (` `
) で囲む必要があります。 「名前」を参照してください。
<bucket-path>
: この外部の場所によってアクセスを付与するクラウド テナント内のパス。 たとえば、abfss://my-container-name@my-storage-account.dfs.core.windows.net/<path>
またはr2://my-bucket@my-account-id.r2.cloudflarestorage.com/<path>
です。<storage-credential-name>
: ストレージ コンテナーまたはバケット パスに対する読み取りと書き込みを許可するストレージ資格情報の名前。 ストレージ資格情報名にハイフン (-
) などの特殊文字が含まれている場合、バッククォート (` `
) で囲む必要があります。
CREATE EXTERNAL LOCATION [IF NOT EXISTS] `<location-name>`
URL '<bucket-path>'
WITH ([STORAGE] CREDENTIAL `<storage-credential-name>`)
[COMMENT '<comment-string>'];
アカウント内の特定のワークスペースへの外部の場所アクセスを制限する場合 (ワークスペース バインディングまたは外部の場所の分離とも呼ばれます)、「(省略可能) 特定のワークスペースに外部の場所を割り当てる」を参照してください。
(省略可能) 外部の場所を特定のワークスペースに割り当てる
既定では、外部の場所は、メタストア内のすべてのワークスペースからアクセスできます。 つまり、ユーザーがその外部の場所で特権 (READ FILES
など) を付与されている場合、メタストアに接続されたどのワークスペースからでもその特権を行使できます。 ワークスペースを使用してユーザーのデータ アクセスを分離する場合、特定のワークスペースからのみ外部の場所へのアクセスを許可できます。 この機能は、ワークスペース バインディングまたは外部の場所の分離とも呼ばれます。
外部の場所を特定のワークスペースにバインドする一般的なユース ケースは次のとおりです。
- 運用データを含む外部の場所に対する
CREATE EXTERNAL TABLE
特権を持つデータ エンジニアが、運用ワークスペース内のその場所でのみ外部テーブルを作成可能にする。 - 機密データを含む外部の場所に対する
READ FILES
特権を持つデータ エンジニアが、特定のワークスペースのみを使用してそのデータにアクセス可能にする。
ワークスペース別に他の種類のデータ アクセスを制限する方法の詳細については、「特定のワークスペースに対するカタログ アクセスの制限」を参照してください。
重要
ワークスペース バインディングは、外部の場所に対する特権が行使される時点で参照されます。 たとえば、ユーザーが CREATE TABLE myCat.mySch.myTable LOCATION 'abfss://my-container-name@storage-account-name.dfs.core.windows.net/finance'
ワークスペースからステートメント myWorkspace
を発行して外部テーブルを作成した場合、通常のユーザー特権チェックに加えて、次のワークスペース バインディング チェックが実行されます。
'abfss://my-container-name@storage-account-name.dfs.core.windows.net/finance'
をカバーする外部の場所がmyWorkspace
にバインドされているか。- カタログ
myCat
がアクセス レベルmyWorkspace
でRead & Write
にバインドされているか。
その後、外部の場所が myWorkspace
からバインド解除された場合、外部テーブルは引き続き機能します。
この機能を使用すると、中央のワークスペースからカタログにデータを入力し、カタログ バインディングを使用して他のワークスペースで使用かのうにできます。外部の場所を他のワークスペースでも使用可能にする必要はありません。
外部の場所を 1 つ以上のワークスペースにバインドする
特定のワークスペースに外部の場所を割り当てるには、Catalog Explorer または Databricks CLI を使用します。
必要なアクセス許可: メタストア管理者、外部の場所の所有者、または外部の場所に対する MANAGE
。
注
外部の場所が現在のワークスペースに割り当てられているかどうかに関係なく、メタストア管理者は Catalog Explorer を使用してメタストア内のすべての外部の場所を参照できます。また、外部の場所の所有者は、メタストア内で自分が所有しているすべての外部の場所を参照できます。 ワークスペースに割り当てられていない外部の場所は、淡色表示されます。
カタログ エクスプローラー
メタストアにリンクされているワークスペースにログインします。
サイドバーで、[データ] アイコンをクリック
カタログ。
[クイック アクセス] ページで [外部のデータ] > ボタンをクリックすると、[外部ロケーション] タブに移動します。
外部の場所を選択し、[ワークスペース] タブに移動します。
[ワークスペース] タブで、[すべてのワークスペースにアクセス権を付与する] チェックボックスをオフにします。
外部の場所が既に 1 つ以上のワークスペースにバインドされている場合、このチェックボックスは既にオフになっています。
[ワークスペースに割り当てる] をクリックし、割り当てるワークスペースを入力または検索します。
アクセスを取り消すには、[ワークスペース] タブに移動し、ワークスペースを選択して [取り消し] をクリックします。 すべてのワークスペースからのアクセスを許可するには、[すべてのワークスペースにアクセス権を付与する] チェックボックスをオンにします。
CLI
外部の場所をワークスペースに割り当てるには、2 つの Databricks CLI コマンド グループと 2 つの手順が必要です。
次の例では、<profile-name>
を Azure Databricks 認証構成プロファイルの名前に置き換えます。 これには、個人用アクセス トークンを生成したワークスペースのワークスペース インスタンス名とワークスペース ID に加えて、個人用アクセス トークンの値が含まれている必要があります。 「Azure Databricks 個人用アクセス トークン認証」を参照してください。
external-locations
コマンド グループのupdate
コマンドを使用して、外部の場所のisolation mode
をISOLATED
に設定します。databricks external-locations update <my-location> \ --isolation-mode ISOLATED \ --profile <profile-name>
既定の
isolation-mode
は、メタストアにアタッチされているすべてのワークスペースに対してOPEN
です。workspace-bindings
コマンド グループのupdate-bindings
コマンドを使用して、ワークスペースを外部の場所に割り当てます。databricks workspace-bindings update-bindings external-location <my-location> \ --json '{ "add": [{"workspace_id": <workspace-id>}...], "remove": [{"workspace_id": <workspace-id>}...] }' --profile <profile-name>
"add"
プロパティと"remove"
プロパティを使用し、ワークスペース バインディングを追加または削除します。注
読み取り専用バインディング (
BINDING_TYPE_READ_ONLY
) は、外部の場所では使用できません。 したがって、外部の場所のバインディングにbinding_type
を設定する理由はありません。
外部の場所のすべてのワークスペース割り当てを一覧表示するには、 workspace-bindings
コマンド グループの get-bindings
コマンドを使用します。
databricks workspace-bindings get-bindings external-location <my-location> \
--profile <profile-name>
REST API リファレンスの「ワークスペース バインディング」もご覧ください。
ワークスペースから外部の場所のバインドを解除する
Catalog Explorer または workspace-bindings
CLI コマンド グループを使用して外部の場所へのワークスペース アクセスを取り消す手順については、「外部の場所を 1 つ以上のワークスペースにバインドする」を参照してください。
次のステップ
- 外部の場所を使用するアクセス許可を他のユーザーに付与します。 「外部の場所を管理する」を参照してください。
- 外部の場所を使用して、マネージド ストレージの場所を定義します。 「Unity Catalog でマネージド ストレージの場所を指定する」をご覧ください。
- 外部の場所を使用して外部テーブルを定義します。 「外部テーブルの操作」を参照してください。
- 外部の場所を使用して外部ボリュームを定義します。 「Unity Catalog ボリュームとは」を参照してください。