1
0

【Databricks】外部ロケーションを試してみた

Posted at

背景・目的

以前、こちらの記事に書いたように、Databricksでは、外部ロケーションを設定することで、UnityCatalogを介してクラウドテナント上のデータを読み書きできます。

本記事では、実際に外部ロケーション上のデータを読み書きしてみます。

まとめ

  • Unity Catalogを介してクラウド上のデータを読み書きを行うには、外部ロケーションとストレージ資格情報を設定する
  • 外部ロケーションは、下記が含まれる。
    • クラウドストレージパス
    • ストレージ資格情報
      • IAMロールを使用してクラウドに保存されているデータにアクセスするための認証と承認メカニズム
      • アカウント管理者である必要がある
    • 下記の権限が必要である。
      • メタストア管理者
      • Create External Location権限を持つユーザ

概要

外部ロケーションとストレージ資格情報とは

外部ロケーションとストレージ資格情報を使用すると、Unity Catalogはユーザーに代わってクラウドテナント上のデータを読み書きできます。これらのオブジェクトは、次の目的で使用されます。

  • Unity Catalogを介してクラウド上のデータを読み書きを行うには、外部ロケーションとストレージ資格情報を設定する

ストレージ認証情報 は、IAMロールを使用してクラウド テナントに保存されているデータにアクセスするための認証および承認メカニズムを表します。各ストレージ資格情報は、資格情報にアクセスできるユーザーとグループを制御する Unity Catalog アクセス制御ポリシーの対象となります。 ユーザーが Unity Catalogのストレージ資格情報にアクセスできない場合、要求は失敗し Unity Catalog ユーザーに代わってクラウド テナントに対する認証を試行しません。 ストレージ資格情報をread-only]としてマークして 、 ユーザーがストレージ資格情報を使用する外部ロケーションに書き込むことができないようにすることができます。

  • ストレージ資格情報とは、IAMロールを使用してクラウドに保存されているデータにアクセスするための認証と承認メカニズムを指す。
  • 各ストレージ資格情報は、資格情報にアクセスできるユーザーとグループを制御する Unity Catalog アクセス制御ポリシーの対象となる。

外部ロケーション は、クラウドストレージパスと、クラウドストレージパスへのアクセスを承認するストレージ資格情報を組み合わせたオブジェクトです。各ストレージの場所には、資格情報にアクセスできるユーザーとグループを制御する Unity Catalog アクセス制御ポリシーが適用されます。 ユーザーが Unity Catalogのストレージの場所にアクセスできない場合、要求は失敗し Unity Catalog ユーザーに代わってクラウド テナントに対する認証を試行しません。 外部ロケーションを read-only] としてマークすると、ユーザーはその場所に書き込めず、ユーザーはその場所にテーブルまたはボリューム (外部または管理対象) を作成できなくなります。

  • 外部ロケーションとは、クラウドストレージパスと、クラウドストレージパスへのアクセスを承認するストレージ資格情報の組み合わせを指す。
    • つまり、ストレージ資格情報が前提になる

要件

  • ストレージ資格情報を作成するには、Databricksアカウント管理者である必要があります。ストレージ資格情報を作成するアカウント管理者は、所有権を別のユーザーまたはグループに委任して、そのアクセス許可を管理できます。
  • 外部ロケーションを作成するには、メタストア管理者またはCREATE EXTERNAL LOCATION権限を持つユーザーである必要があります。
  • ストレージ資格情報は、アカウント管理者である必要がある
  • 外部ロケーションの作成には、下記が必要
    • メタストア管理者
    • Create External Location権限を持つユーザ

実践

ストレージ資格情報の管理

ストレージ資格情報の管理を元に試してみます。

ストレージ資格情報の作成

ストレージ認証情報を作成するには、S3 バケットパスへのアクセス (読み取りまたは読み取りと書き込み) を許可する IAMロールが必要です。 その IAMロールは、ストレージ認証情報を作成するときに参照します。

ステップ1: IAMロールを作成する

S3バケットへのアクセス許可するIAMロールを作成します。

  1. AWSにログインします。

  2. IAMロール作成画面で「カスタム信頼ポリシー」を選択します。
    image.png

  3. カスタム信頼ポリシーフィールドに下記のポリシーを貼り付けます。

    • <DATABRICKS-ACCOUNT-ID>は、自分のDatabricksアカウントのIDをを入力します。
    {
      "Version": "2012-10-17",
      "Statement": [{
        "Effect": "Allow",
        "Principal": {
          "AWS": [
            "arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL"
          ]
        },
        "Action": "sts:AssumeRole",
        "Condition": {
          "StringEquals": {
            "sts:ExternalId": "<DATABRICKS-ACCOUNT-ID>"
          }
        }
      }]
    }
    
  4. このまま、次へをクリックしIAMロール名を入力し保存します。

  5. 作成したIAMロールで、①「信頼関係」タブをクリックし、②「信頼ポリシーを編集」をクリックします。
    image.png

  6. 下記のARNをPrincipalに追加します。

    • IAMロールのARNに置き換えます。
    "arn:aws:iam::<YOUR-AWS-ACCOUNT-ID>:role/<THIS-ROLE-NAME>"
    
  7. インラインポリシーを追加を選択し、下記のポリシーをコピーします。

    • KMSが不要な場合は、削除します。
    • 作成したIAMロールに置き換えます。
    • S3バケットを指定します。
    {
      "Version": "2012-10-17",
      "Statement": [
          {
              "Action": [
                  "s3:GetObject",
                  "s3:PutObject",
                  "s3:DeleteObject",
                  "s3:ListBucket",
                  "s3:GetBucketLocation",
                  "s3:GetLifecycleConfiguration",
                  "s3:PutLifecycleConfiguration"
              ],
              "Resource": [
                  "arn:aws:s3:::<BUCKET>/*",
                  "arn:aws:s3:::<BUCKET>"
              ],
              "Effect": "Allow"
          },
          {
              "Action": [
                  "kms:Decrypt",
                  "kms:Encrypt",
                  "kms:GenerateDataKey*"
              ],
              "Resource": [
                  "arn:aws:kms:<KMS-KEY>"
              ],
              "Effect": "Allow"
          },
          {
              "Action": [
                  "sts:AssumeRole"
              ],
              "Resource": [
                  "arn:aws:iam::<AWS-ACCOUNT-ID>:role/<AWS-IAM-ROLE-NAME>"
              ],
              "Effect": "Allow"
          }
        ]
    }
    
  8. ポリシー名を入力し作成します。

ステップ 2:IAMロールの詳細をDatabricksに渡す

  1. ワークスペースにログインします。

  2. ナビゲーションペインで「Catalog」をクリックします。

  3. 画面右上の「+Add」、「Add a storage credential」をクリックします。

  4. ポップアップが表示されるので、下記を入力し「Create」をクリックします。

    1. Storage credential name
    2. IAM roleのARN
    3. Limit to read-only useをチェック
      image.png
  5. Catalog ExplorerでStorage Credentialsをクリックします。

  6. 登録されたCredentialが確認できました。
    image.png

外部ロケーションを管理する

外部ロケーションを管理するを元に試します。

外部ロケーションを作成する

  1. ナビゲーションペインで「SQL Editor」をクリックします。

  2. 次のクエリを実行し、外部ロケーションを作成します。

    CREATE EXTERNAL LOCATION IF NOT EXISTS ext_location
    URL 's3://<bucket-path>'
    WITH (STORAGE CREDENTIAL <storage-credential-name>)
    [COMMENT <comment-string>];
    
  3. ナビゲーションペインで「Catalog」をクリックします。

  4. External locationをクリックすすると、作成されていました。

    image.png

  5. ロケーション名をクリックし、「Test connection」をクリックします。

    image.png

  6. 下記のクエリを実行し、外部ロケーションの詳細を確認します。

    DESCRIBE EXTERNAL LOCATION ext_location
    

    image.png

  7. 下記のクエリを実行し、外部ロケーションの中身を確認します。
    image.png

外部テーブルを作成する

  1. 下記のテストデータを準備し、S3バケットにアップロードする。

    {"id":1,"value":"xxx"}
    {"id":2,"value":"yyy"}
    {"id":3,"value":"zzz"}
    
  2. ナビゲーションペインで「SQL Editor」をクリックします。

  3. SQL Editorで下記のクエリを実行します。

    SELECT * FROM json.`s3://XXXXX/test-json/`
    

    image.png

  4. ナビゲーションペインで「Catalog」をクリックします。

  5. 「Create catalog」をクリックします。

  6. 下記を入力し、「Create」をクリックします。

    • Storage locationに、外部ロケーションを指定します。
      image.png
  7. 出来ました。
    image.png

  8. SQL Editorで下記のクエリを実行します。

    CREATE TABLE ext_catalog.default.test
    

    image.png

  9. COPY INTOを使用することで、作成したテーブルに読み込ませることが出来ます。

    COPY INTO ext_catalog.default.test
    FROM (
      SELECT *
      FROM 's3://XXXX/test-json/'
    )
    FILEFORMAT = json COPY_OPTIONS ("mergeSchema" = "true");
    
    

    image.png

  10. SELECTします。読み込めました。

    SELECT * FROM ext_catalog.default.test
    

    image.png

考察

外部テーブルを使うことで、直接クラウドストレージからデータを読み込むことが出来ました。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0