はじめに
Databricks Unity Catalogを利用すると、DefaultのS3 Bucket 以外のバケットにアクセスするために、外部ロケーションを資格情報とともに登録することができます。これによってAccess Tokenなどを指定せずにバケットに安全にアクセスすることが可能になります。
もちろん、従来通りの Access Keyベースや、Instance Profileを用いたアクセスも可能です。
外部ロケーションの登録には、こちらのマニュアルも併せてご覧ください
要件
- ストレージ資格情報を作成するには、Databricks アカウント管理者である必要があります。ストレージ資格情報を作成したアカウント管理者は、その所有権を他のユーザーまたはグループに委譲し、その権限を管理することができます。
- 外部ロケーションを作成するには、メタストア管理者またはCREATE EXTERNAL LOCATION権限を持つユーザーである必要があります。
- 外部ロケーションまたはストレージ クレデンシャルを作成または管理するには、ストレージにアクセスするUnityカタログ対応ワークスペースのワークスペース管理者である必要があります。
- ユーザーに読み取りと書き込みをさせる S3 バケットの名前には、ドット記法を使用できません(たとえば、incorrect.bucket.name.notation)バケットの命名に関する詳しいガイダンスについては、AWS バケット命名規則を参照してください。
Unity Catalogのセットアップについてはこちらをご覧ください。
S3 Bucketの作成
まずは、S3バケットを用意します。すでに作成済みの場合はスキップしてください。
今回は、以下のようなバケットを用意しました。
- バケット名:
db-uc-external (任意)
- AWS リージョン :
東京(ap-northeast-1)
- オブジェクト所有者:
ACL無効
- バケットのバージョニング :
有効にする (無効設定も可能)
- デフォルトの暗号化:
有効にする(SSE-S3)
--> 無効にすることも可能です。またSSE-KMSを利用する場合はマニュアルをご覧ください。
IAM Role & Policy の作成
次に作成したS3バケットへアクセスできる IAM Role & Policyを準備します。
1) IAM Role作成
ロール名:uc-external-role
(任意)
新規のロールを作成しTrust RelationshipにてJSONモードで以下にアップデートします。
<AWS_ACCOUNT_ID>: S3作成のAWS Account ID
<AWS_IAM_ROLE_NAME>: 先ほど作成したIAM Role
<DATABRICKS_ACCOUNT_ID> を変更。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL",
"arn:aws:iam::<AWS_ACCOUNT_ID>:role/<AWS_IAM_ROLE_NAME>"
]
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "<DATABRICKS_ACCOUNT_ID>"
}
}
}
]
}
2) IAM policyを作成し上記のロールに追加します。
<AWS_ACCOUNT_ID>: S3作成者のAWS Account ID
<AWS_IAM_ROLE_NAME>: uc-external-role
(先ほど作成したロール名)
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::<BUCKET>/*",
"arn:aws:s3:::<BUCKET>"
],
"Effect": "Allow"
},
{
"Action": [
"sts:AssumeRole"
],
"Resource": [
"arn:aws:iam::<AWS_ACCOUNT_ID>:role/<AWS_IAM_ROLE_NAME>"
],
"Effect": "Allow"
}
]
}
ストレージ資格情報の作成
ワークスペースにログインし、「データ」- [ストレージ資格情報]を選択。右上の[資格情報を作成]をクリック
先ほど作成したIAM Roleを登録します。
ストレージ資格情報名:uc-external-rol
(任意)
IAMロール(ARN): 先ほど作成したIAMロール ARN
他のユーザーに付与する場合は、資格情報の権限設定にて付与します。
ストレージロケーション(外部の格納場所)を登録
ワークスペースにログインし、「データ」- [外部の格納場所]を選択。右上の[格納場所の作成]をクリック
外部の格納場所:db-uc-external
(任意)
URL: s3://db-uc-external
ストレージ資格情報: uc-external-role
ノートブックで外部テーブル作成を実行してみよう
こちらのサンプルノートブックをインポートして、外部テーブルを作成出来るかご確認ください。
クラスター実行する際には、クラスターは DBR11.1以降
&アクセスモードはSingle User
であることを確認してください。
サンプルノートブックでは以下を実行しサンプルデータを使って、新しい外部テーブル(table1)を作成しております。
-- Create an example catalog and schema to contain the new table
CREATE CATALOG IF NOT EXISTS ext_catalog;
USE CATALOG ext_catalog;
CREATE SCHEMA IF NOT EXISTS ext_schema;
USE ext_schema;
CREATE TABLE ext_catalog.ext_schema.table1
LOCATION 's3://db-uc-external/table1'
AS SELECT * from samples.nyctaxi.trips;
以下のように、テーブルタイプが External として登録され、ストレージロケーションが外部のバケットになっていれば成功です。
さいごに
UnityCatalogセットアップについてはこちらもご覧ください。
https://qiita.com/maroon-db/items/57cee03cef202c839b94