この記事では、 外部の場所の一覧表示、表示、更新、アクセス許可の付与、ファイル イベントの有効化、および削除を行う方法について説明します。
注
Databricks は、ボリュームを使用してファイルアクセスを統制することを推奨しています。 「Unity Catalog ボリュームとは」を参照してください。
外部の場所を記述する
外部ロケーションのプロパティ (アクセス許可やワークスペース アクセスを含む) を確認するには、Catalog Explorer または SQL コマンドを使用できます。
Catalog Explorer
- サイドバーで、[データ] アイコンをクリック
カタログ。
- [クイック アクセス] ページで [外部のデータ] > ボタンをクリックすると、[外部ロケーション] タブに移動します。
- 外部ロケーションの名前をクリックすると、そのプロパティが表示されます。
SQL
ノートブックまたは Databricks SQL エディターで次のコマンドを実行します。 <___location-name>
を外部の場所の名前で置き換えます。
DESCRIBE EXTERNAL LOCATION <___location-name>;
外部ロケーションに対する許可を表示する
外部の場所に対する許可を表示するには、次のようなコマンドを使用します。 必要に応じて結果をフィルター処理して、指定したプリンシパルの許可のみを表示することもできます。
SHOW GRANTS [<principal>] ON EXTERNAL LOCATION <___location-name>;
次のプレースホルダー値を置き換えます。
<___location-name>
: クラウド テナント内のストレージ コンテナーまたはバケットの読み取りと書き込みを承認する外部の場所の名前。-
<principal>
: アカウント レベルのユーザーのメール アドレス、またはアカウント レベルのグループの名前。
注
グループまたはユーザー名にスペースまたは @
記号が含まれている場合は、アポストロフィではなく、その周囲にバックティック (` `
) を使用します。
外部ロケーションに対するアクセス許可を付与する
このセクションでは、Catalog Explorer とノートブックまたは SQL クエリでの SQL コマンドを使用して、外部ロケーションに対するアクセス許可を付与する・取り消す方法について説明します。 Databricks CLI や Terraform の使用方法については、Databricks Terraform のドキュメントおよび「Databricks CLI とは」を参照してください。
外部ロケーションに対する次のアクセス許可を付与できます。
CREATE EXTERNAL TABLE
CREATE EXTERNAL VOLUME
CREATE MANAGED STORAGE
アクセス許可が必要な: メタストアと外部の場所で参照されているストレージ資格情報の両方に対する CREATE EXTERNAL LOCATION
特権、または外部の場所に対する MANAGE
特権。 メタストア管理者には既定でメタストアに対する CREATE EXTERNAL LOCATION
権限があります。
外部ロケーションを使用するアクセス許可を付与するには:
Catalog Explorer
- サイドバーで、[データ] アイコンをクリック
カタログ。
- [クイック アクセス] ページで [外部のデータ] > ボタンをクリックすると、[外部ロケーション] タブに移動します。
- 外部の場所の名前をクリックすると、そのプロパティが開きます。
- [アクセス許可] をクリックします。
- ユーザーまたはグループにアクセス許可を付与するには、各 ID を選択し、[許可] をクリックします。
- ユーザーまたはグループからアクセス許可を取り消すには、それぞれの ID を選択して、[取り消し] をクリックします。
SQL
ノートブックまたは SQL クエリ エディターで次の SQL コマンドを実行します。 次の例では、外部ロケーションを参照する外部テーブルを作成する権限を付与しています。
GRANT CREATE EXTERNAL TABLE ON EXTERNAL LOCATION <___location-name> TO <principal>;
次のプレースホルダー値を置き換えます。
<___location-name>
: クラウド テナント内のストレージ コンテナーまたはバケットの読み取りと書き込みを承認する外部の場所の名前。-
<principal>
: アカウント レベルのユーザーのメール アドレス、またはアカウント レベルのグループの名前。
注
グループ名またはユーザー名にスペースや @
記号が含まれている場合は、アポストロフィではなくバッククォートで囲んでください。 たとえば、
finance team
の場合です。
外部の場所の所有者を変更する
外部の場所の作成者がその初期所有者です。 所有者を別のアカウント レベルのユーザーまたはグループに変更するには、ノートブックまたは Databricks SQL エディターで次のコマンドを実行するか、Catalog Explorer を使用します。
アクセス許可が必要な: 外部の場所の所有者または MANAGE
権限を持つユーザー。
次のプレースホルダー値を置き換えます。
-
<___location-name>
: 資格情報の名前。 -
<principal>
: アカウント レベルのユーザーのメール アドレス、またはアカウント レベルのグループの名前。
ALTER EXTERNAL LOCATION <___location-name> OWNER TO <principal>
外部ロケーションを読み取り専用に設定する
ユーザーに外部ロケーションへの読み取り専用アクセスを許可する場合は、Catalog Explorer を使用してそのロケーションを読み取り専用に設定できます。
外部ロケーションを読み取り専用にする:
- ストレージ資格情報の Azure マネージド ID によって付与された書き込みアクセス許可や、その外部ロケーションに付与された Unity Catalog アクセス許可に関係なく、ユーザーはその外部ロケーションのファイルに書き込むことができなくなります。
- ユーザーは、その外部ロケーション内にマネージド テーブルやボリュームを作成できなくなります。
- 外部ロケーションの作成時に、システムがそのロケーションを正しく検証できるようになります。
外部ロケーションの作成時に、読み取り専用として設定することができます。
外部ロケーション作成後に、Catalog Explorer を使用して読み取り専用ステータスを変更することもできます。
- サイドバーで、[データ] アイコンをクリック
カタログ。
- [クイック アクセス] ページで [外部のデータ] > ボタンをクリックすると、[外部ロケーション] タブに移動します。
- 外部の場所を選択し、[
をクリックします。[ テスト接続 ] ボタンの横にあるメニューをクリックし、[ 編集] を選択します。
- 編集ダイアログで [詳細オプション] をクリックし、[読み取り専用使用に制限] オプションを選択します。
- [更新] をクリックします。
外部の場所で暗号化アルゴリズムを構成する (AWS S3 のみ)
AWS では、S3 のデータを保護するために、Amazon S3 マネージド キー (SSE-S3) または AWS KMS キー (SSE-KMS) を使用したサーバー側暗号化 (SSE) がサポートされています。 S3 バケットで SSE 暗号化が必要な場合は、外部の場所で暗号化アルゴリズムを構成して、Unity カタログの外部テーブルとボリュームが S3 バケット内のデータにアクセスできるようにすることができます。 Delta Sharing を使用して共有される外部テーブルでは、SSE はサポートされていません。 詳細については、「 KMS を使用した S3 の暗号化の構成」を参照してください。
サイドバーで、[データ] アイコンをクリック
カタログ。
[カタログ] ウィンドウの上部にある
をクリックします。歯車アイコンをクリックし、[外部の場所] を選択します。
外部の場所を選択します。 外部の場所では、ストレージ資格情報に IAM ロールを使用する必要があります。
をクリックします。[テスト接続] ボタンの横にある kebab メニューをクリックし、[編集] を選択します。
[編集] ダイアログで、[ 詳細オプション] をクリックします。
[暗号化アルゴリズム] で、暗号化キーに応じて SSE-SE または SSE-KMS を選択します。
SSE-KMS の場合、暗号化 KMS キー arn の下に、S3 の場所にアクセスするときにクライアントによって参照される KMS キーの ARN を貼り付けます。
[更新] をクリックします。
(推奨)外部の場所のファイル イベントを有効にする
クラウド プロバイダーによってプッシュされた変更通知を取り込む場合、外部の場所に対してファイル イベントを有効にすると、次のような利点があります。
- 自動ローダーのファイル通知を簡単に設定できます。 具体的には、
cloudFiles.useManagedFileEvents
をtrue
に設定することで、自動ローダーで通知のようなパフォーマンスで増分ファイル検出を有効にします。 ファイル通知モードでの自動ローダー ストリームの構成を参照してください。 - ジョブのファイル到着トリガーの効率と容量が向上します。 「新しいファイルが到着したときにジョブをトリガーする」を参照してください。
開始する前に
Azure Databricks で Azure Data Lake Storage キューまたは SQS キューを自分の代わりに構成する場合は、外部の場所で、それを行う適切なアクセス許可を付与するストレージ資格情報を参照する必要があります。 手順については、次の手順を参照してください。
独自の Azure Data Lake ストレージ キューを作成する場合、ストレージ資格情報によって表される ID には、それらの Azure Data Lake ストレージ キューに対する次のアクセス許可が必要です。
- ストレージ キュー データ共同作成者
独自の SQS キューを作成する場合、ストレージ資格情報で表される ID には、それらの SQS キューに対する次のアクセス許可が必要です。
sqs:ReceiveMessage
sqs:DeleteMessage
sqs:PurgeQueue
手順 1: Azure Databricks が Azure Data Lake Storage または AWS S3 のファイル イベントにアクセスできるかどうかを確認する
外部の場所のセキュリティ保護可能なオブジェクトに対してファイル イベントを有効にする前に、Azure Data Lake Storage または AWS S3 アカウントが、出力するファイル イベントへのアクセス権を Azure Databricks に付与するように構成されている必要があります。 Azure Databricks で Azure Data Lake Storage または AWS S3 でファイル イベントを構成する場合は、Azure Databricks に適切なアクセス権があることを確認する必要もあります。
このアクセス権の割り当ては、ストレージ資格情報を構成するときに推奨される手順です。
Azure Data Lake Storage コンテナーの場合
外部の場所へのアクセスを許可するマネージド ID が正しく構成されていることを確認するには、
Azure マネージド ID を取得します。
サイドバーで、[データ] アイコンをクリック
カタログ。
[クイック アクセス] ページで [外部のデータ] > ボタンをクリックすると、[外部ロケーション] タブに移動します。
外部の場所を選択します。
[ 概要 ] タブで、[ 資格情報 名] をクリックします。
[ストレージ資格情報の 概要 ] タブで、 コネクタ ID または ユーザー割り当てマネージド ID をコピーします。
これは次の手順で使用します。
Azure Data Lake Storage アカウントにログインします。
アクセス制御 (IAM) に移動し、[アクセスの確認] ボタンをクリックします。
マネージド ID で、マネージド ID の種類に応じて、Azure Databricks のユーザー割り当てマネージド ID または Access Connector のいずれかを選択します。
手順 1 でコピーしたマネージド ID を検索します。
マネージド ID に次のロールがあることを確認します。
- ストレージ BLOB データ共同作成者
- EventGrid EventSubscription 共同作成者
- ストレージ キュー データ共同作成者: Azure Databricks で Azure Data Lake Storage にサブスクリプションとイベントを作成する場合にのみ必要です。 このロールを有効にしない場合は、自分で Azure ストレージ キュー を作成する必要があります)。
これらのロールのいずれかが見つからない場合は、[ 有資格の割り当て ] タブに移動して追加します。
これらのロールの割り当ての詳細については、「 手順 3: マネージド ID にファイル イベントへのアクセス権を付与する 」および 「手順 4: Azure Databricks にユーザーに代わってファイル イベントを構成するアクセス権を付与する」を参照してください。
S3 バケットの場合
Databricks がバケットのイベント通知を構成してサブスクライブできることを確認するには、
IAM ロールを取得する
サイドバーで、[データ] アイコンをクリック
カタログ。
[クイック アクセス] ページで [外部のデータ] > ボタンをクリックすると、[外部ロケーション] タブに移動します。
外部の場所を選択します。
[ 概要 ] タブで、[ 資格情報 名] をクリックします。
[ストレージ資格情報の 概要 ] タブで、 IAM ロール (ARN) をコピーします。
これは次の手順で使用します。
AWS アカウントにログインします。
IAM に移動し、手順 1 でコピーしたロールを検索します。
[権限ポリシー] で、対象の IAM ロールに関連付けられている IAM ポリシーを見つけて開きます。
ポリシーまたはポリシーを開き、次のプロパティを含むポリシーがあることを確認します。
このポリシーにより、Azure Databricks アカウントは、バケットのイベント通知構成の更新、SNS トピックの作成、SQS キューの作成、SQS キューの SNS トピックへのサブスクライブを行えます。
<BUCKET>
を S3 バケットの名前に置き換えます。{ "Version": "2012-10-17", "Statement": [ { "Sid": "ManagedFileEventsSetupStatement", "Effect": "Allow", "Action": [ "s3:GetBucketNotification", "s3:PutBucketNotification", "sns:ListSubscriptionsByTopic", "sns:GetTopicAttributes", "sns:SetTopicAttributes", "sns:CreateTopic", "sns:TagResource", "sns:Publish", "sns:Subscribe", "sqs:CreateQueue", "sqs:DeleteMessage", "sqs:ReceiveMessage", "sqs:SendMessage", "sqs:GetQueueUrl", "sqs:GetQueueAttributes", "sqs:SetQueueAttributes", "sqs:TagQueue", "sqs:ChangeMessageVisibility", "sqs:PurgeQueue" ], "Resource": ["arn:aws:s3:::<BUCKET>", "arn:aws:sqs:*:*:csms-*", "arn:aws:sns:*:*:csms-*"] }, { "Sid": "ManagedFileEventsListStatement", "Effect": "Allow", "Action": ["sqs:ListQueues", "sqs:ListQueueTags", "sns:ListTopics"], "Resource": ["arn:aws:sqs:*:*:csms-*", "arn:aws:sns:*:*:csms-*"] }, { "Sid": "ManagedFileEventsTeardownStatement", "Effect": "Allow", "Action": ["sns:Unsubscribe", "sns:DeleteTopic", "sqs:DeleteQueue"], "Resource": ["arn:aws:sqs:*:*:csms-*", "arn:aws:sns:*:*:csms-*"] } ] }
「手順 1: IAM ロールを作成する」も参照してください。
このポリシーがない場合は、IAM ロールに追加します。
手順 2: カタログ エクスプローラーを使用して外部の場所のファイル イベントを有効にする
ファイル イベントを有効にするには:
サイドバーで、[データ] アイコンをクリック
カタログ。
[クイック アクセス] ページで [外部のデータ] > ボタンをクリックすると、[外部ロケーション] タブに移動します。
外部の場所を選択します。
をクリックします。[テスト接続] ボタンの横にある kebab メニューをクリックし、[編集] を選択します。
[編集] ダイアログで、[ 詳細オプション] をクリックします。
[ ファイル イベントを有効にする] を選択します。
[ファイル] イベントの種類を選択します。
自動: (推奨) Azure Databricks でサブスクリプションとイベントを自動的に設定する場合は、これを選択します。
指定: Azure ストレージ キュー または SQS キュー を自分で既に構成している場合は、これを選択します。
[指定されたファイル] イベントの種類を選択した場合は、既存のストレージ キューのキュー URL を入力します。
Azure ストレージ キュー:
https://<storage account>.queue.core.windows.net/<queue>
AWS SQS キュー:
https://sqs.<region>.amazonaws.com/<account-ID>/<queue-name>
[更新] をクリックします。
数秒待ってから、メインの外部の場所の編集ページで [ 接続のテスト ] をクリックして、ファイル イベントが正常に有効になっていることを確認します。
ファイル イベントの制限事項
外部の場所のファイル イベントには、次の制限があります。
イベントのスループットは、1 秒あたり最大 2,000 ファイルに制限されています。
resourceTags
オプションを使用してクラウド リソースにタグを付けることはできません。 代わりに、自動ローダー サービスによってキューとサブスクリプションのリソースが作成された後、クラウド コンソールを使用してリソースにタグを付けます。そのストレージの場所に対して外部の場所が定義されていない場合、Unity カタログのメタストア ルート ストレージの場所のファイル イベントを設定することはできません。
Unity カタログで外部の場所オブジェクトが定義されていないストレージの場所にファイル イベントを設定することはできません。 Unity カタログの一部の実装には、外部の場所に関連付けられていないメタストア ルート ストレージの場所が含まれます。 これがメタストア ルート ストレージの場所に当てはまるかどうかを判断するには、次の手順を実行します。
アカウント管理者として、アカウント コンソールにログインします。
[
カタログ。
メタストアの名前をクリックします。
[構成] タブに移動します。
ADLS Gen 2 パス値がある場合、メタストア ルートには外部の場所オブジェクトが定義されていません。
外部の場所を使用するようにメタストア ルート ストレージを更新するには、[ 削除 ] ボタンをクリックします。 外部ロケーションが作成されます。 詳細については、 メタストア レベルのストレージの削除に関するページを参照してください。
- Azure Blob Storage はサポートされていません。
外部の場所を変更する
外部の場所の所有者または MANAGE
特権を持つユーザーは、名前の変更、URI の変更、および外部の場所のストレージ資格情報の変更を行うことができます。
外部の場所の名前を変更するには、次の操作を行います。
ノートブックまたは Databricks SQL エディターで次のコマンドを実行します。 次のプレースホルダー値を置き換えます。
-
<___location-name>
: サーブされるロケーションの名前。 -
<new-___location-name>
: ロケーションの新しい名前。
ALTER EXTERNAL LOCATION <___location-name> RENAME TO <new-___location-name>;
クラウド テナントで外部の場所が指す URI を変更するには、次の操作を行います。
ノートブックまたは Databricks SQL エディターで次のコマンドを実行します。 次のプレースホルダー値を置き換えます。
-
<___location-name>
: 外部ロケーションの名前。 -
<url>
: そのロケーションに対するアクセスを承認するクラウド テナント内の新しいストレージ URL。
ALTER EXTERNAL LOCATION location_name SET URL '<url>' [FORCE];
外部テーブルが外部の場所に依存している場合でも、FORCE
オプションによって URL が変更されます。
外部の場所で使用するストレージ資格情報を変更するには、次の操作を行います。
ノートブックまたは Databricks SQL エディターで次のコマンドを実行します。 次のプレースホルダー値を置き換えます。
-
<___location-name>
: 外部ロケーションの名前。 <credential-name>
: クラウド テナント内の場所の URL へのアクセスを許可するストレージ資格情報の名前。
ALTER EXTERNAL LOCATION <___location-name> SET STORAGE CREDENTIAL <credential-name>;
外部の場所を削除する
外部の場所を削除 (削除) するには、その所有者であるか、外部の場所に対する MANAGE
特権を持っている必要があります。 外部の場所を削除するには、次の操作を行います。
ノートブックまたは Databricks SQL エディターで次のコマンドを実行します。 角かっこ内の項目は省略可能です。 <___location-name>
を外部の場所の名前で置き換えます。
DROP EXTERNAL LOCATION [IF EXISTS] <___location-name>;