Unity Catalog メタストアを作成する

この記事では、Unity Catalog メタストアを作成し、ワークスペースにリンクする方法について説明します。

重要

Unity Catalog に対して自動的に有効になったワークスペースの場合、この記事の手順は必要ありません。 Databricks は、2023 年 11 月 8 日に Unity Catalog の新しいワークスペースを自動的に有効にし、アカウント間で段階的にロールアウトを進めました。 この記事の手順に従う必要があるのは、ワークスペースがあり、ワークスペース リージョンにメタストアがまだない場合のみです。 メタストアがリージョンに既に存在するかどうかを確認するには、「 Unity Catalog の自動有効化」を参照してください。

メタストアは、Unity Catalog 内のデータの最上位のコンテナーです。 Unity Catalog メタストアは、セキュリティ保護可能なオブジェクト (テーブル、ボリューム、外部ロケーション、共有など) と、それらへのアクセスを制御するアクセス許可に関するメタデータを登録します。 各メタストアは、データを整理できる 3 レベルの名前空間 (catalog.schematable) を公開します。 組織が運用されているリージョンごとに 1 つのメタストアが必要です。 Unity Catalog を操作するには、ユーザーはリージョン内のメタストアにアタッチされているワークスペースにいる必要があります。

メタストアを作成するには、次の操作を行います。

  1. AWS アカウントで、必要に応じて、マネージドテーブルとボリュームのメタストアレベルのストレージ用のストレージの場所を作成します。

    メタストア レベルのストレージが必要かどうかを判断するのに役立つ情報については、「 (省略可能) メタストア レベルのストレージを作成する 」および「 ストレージ内でデータが物理的に分離されている」を参照してください。

  2. AWS アカウントで、そのストレージの場所へのアクセスを許可する IAMロールを作成します。

  3. Databricks で、メタストアを作成し、ストレージの場所をアタッチして、ワークスペースをメタストアに割り当てます。

この記事で説明されている方法に加えて、 Databricks Terraform プロバイダー、特に databricks_metastore リソースを使用してメタストアを作成することもできます。 Unity Catalog がメタストアにアクセスできるようにするには、 databricks_metastore_data_accessを使用します。ワークスペースをメタストアにリンクするには、 databricks_metastore_assignment を使用します。

始める前に

開始する前に、メタストアやマネージド ストレージなど、Unity Catalog の基本的な概念を理解しておく必要があります。 「 Unity Catalog とは」を参照してください。

また、すべてのセットアップ手順について、次の要件を満たしていることを確認する必要があります。

  • Databricksアカウント管理者である必要があります。

  • Databricksアカウントは、プレミアムプラン以上である必要があります。

  • メタストアレベルのルートストレージを設定する場合は、AWS アカウントで S3 バケット、IAMロール、IAM ポリシー、およびクロスアカウント信頼関係を作成できる必要があります。

ステップ 1 (オプション): AWS でメタストアレベルのマネージドストレージ用の S3 バケットを作成する

この手順 (省略可能) では、マネージド テーブルとボリュームのデータをメタストア レベルで格納するために Unity Catalog で必要な S3 バケットを作成します。 S3 バケットは、自分の AWS アカウントに作成します。 メタストア レベルのストレージが必要かどうかを判断するには、「 (省略可能) メタストア レベルのストレージを作成する」を参照してください。

  1. AWSで、S3バケットを作成します。

    この S3 バケットは、 Unity Catalogのマネージドテーブルと管理対象ボリュームのメタストア レベルのストレージ場所になります。 このストレージの場所は、カタログ レベルとスキーマ レベルでオーバーライドできます。 「Unity Catalog で管理されたストレージの場所を指定する」を参照してください

    要件:

    • メタストアが複数ある場合は、それぞれに専用の S3 バケットを使用する必要があります。

    • データにアクセスするワークスペースと同じリージョンでバケットを見つけます。

    • バケット名にドット表記を含めることはできません(例:incorrect.bucket.name.notation)。バケットの命名方法の詳細については、「AWSバケットの命名規則」を参照してください。

  2. s3://で始まる S3 バケットパスを書き留めます。

  3. S3バケットでKMS暗号化を有効にする場合は、KMS暗号化キーの名前を書き留めます。

ステップ 2 (オプション): ストレージの場所にアクセスするための IAMロールを作成する

この手順では、ステップ 1 を完了した場合にのみ必要になりますが、前の手順で作成した S3 バケットにアクセスするために Unity Catalog で必要な IAMロールを作成します。

ロールの作成は 2 段階のプロセスです。 まず、ロールを作成し、 一時的な 信頼関係ポリシーを追加して、後の手順で変更します。 ロールは自己仮定型である必要があるため、つまり、ロール自体を信頼するように構成する必要があるため、ロールの作成 後に 信頼ポリシーを変更する必要があります。 したがって、自己仮定ステートメントを追加する前に、ロールが存在している必要があります。 自己仮定の役割については、この Amazonブログ記事を参照してください。

  1. DatabricksアカウントIDを見つけます。

    1. Databricksアカウントコンソールにログインします。

    2. ユーザー名をクリックします。

    3. メニューから、アカウントIDの値をコピーします。

  2. AWS で、 カスタム信頼ポリシーを使用して IAMロールを作成します。

  3. [カスタム信頼ポリシー]フィールドに次のポリシーJSONを貼り付け、<DATABRICKS-ACCOUNT-ID>をステップ1で見つけたDatabricksアカウントID(AWSアカウントIDではない)に置き換えます。

    このポリシーは、Unity CatalogがDatabricksユーザーに代わってバケット内のデータにアクセスするロールを引き受けることができるように、クロスアカウントの信頼関係を確立します。これは、PrincipalセクションのARNによって指定されます。Databricksによって作成されたロールを参照する静的な値です。変更しないでください。

    {
      "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>"
          }
        }
      }]
    }
    

    AWS GovCloudを使用している場合は、以下のポリシーを使用してください。

    {
      "Version": "2012-10-17",
      "Statement": [{
        "Effect": "Allow",
        "Principal": {
          "AWS": [
        "arn:aws-us-gov:iam::044793339203:role/unity-catalog-prod-UCMasterRole-1QRFA8SGY15OJ"
          ]
        },
        "Action": "sts:AssumeRole",
        "Condition": {
          "StringEquals": {
            "sts:ExternalId": "<DATABRICKS-ACCOUNT-ID>"
          }
        }
      }]
    }
    
  4. アクセス許可ポリシーの構成をスキップします。この構成は、後のステップで追加します。

  5. IAMロールを保存します。

  6. 信頼関係ポリシーを変更して、「自己引き受け型」にします。

    1. 保存したIAMロールに戻り、[信頼関係]タブに移動します。

    2. 信頼関係ポリシーを編集し、次のARNを「Allow」ステートメントに追加します。

      <YOUR-AWS-ACCOUNT-ID><THIS-ROLE-NAME>を実際のIAMロール値に置き換えます。

      "arn:aws:iam::<YOUR-AWS-ACCOUNT-ID>:role/<THIS-ROLE-NAME>"
      

    ポリシーは次のようになります(DatabricksアカウントIDとIAMロール値を使用するように、置き換えテキストが更新されています)。

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": [
              "arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL",
              "arn:aws:iam::<YOUR-AWS-ACCOUNT-ID>:role/<THIS-ROLE-NAME>"
             ]
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringEquals": {
              "sts:ExternalId": "<DATABRICKS-ACCOUNT-ID>"
            }
          }
        }
      ]
    }
    
  7. AWSで、S3バケットと同じAWSアカウントにIAMポリシーを作成します。

    予期しない問題を回避するには、次のサンプルポリシーを使用して、次の値を置き換える必要があります。

    • <BUCKET>:前のステップで作成したS3バケットの名前。

    • <KMS-KEY>:オプション。暗号化が有効になっている場合は、S3バケットの内容を暗号化するKMSキーの名前を指定します。暗号化が無効になっている場合は、IAMポリシーのKMSセクション全体を削除します。

    • <AWS-ACCOUNT-ID>:現在のAWSアカウントのアカウントID(Databricksアカウントではありません)。

    • <AWS-IAM-ROLE-NAME>:前のステップで作成したAWS IAMロールの名前。

    {
     "Version": "2012-10-17",
     "Statement": [
         {
             "Action": [
                 "s3:GetObject",
                 "s3:PutObject",
                 "s3:DeleteObject",
                 "s3:ListBucket",
                 "s3:GetBucketLocation"
             ],
             "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"
         }
       ]
    }
    

    Unity Catalogに対してより制限の厳しいIAMポリシーが必要な場合は、Databricksの担当者にお問い合わせください。

  8. IAMポリシーをIAMロールにアタッチします。

    IAMロールの [Permissions ] タブで、作成した IAM ポリシーをアタッチします。

ステップ 3: メタストアを作成し、ワークスペースをアタッチする

各 Databricks リージョンには、独自の Unity Catalog メタストアが必要です。

メタストアは、組織が運営を行っているリージョンごとに作成します。これらの各リージョンのメタストアは、その地域の任意の数のワークスペースにリンクできます。リンクされた各ワークスペースには、メタストア内のデータの同じビューがあり、データアクセス制御はワークスペース間で管理できます。他のメタストアのデータにアクセスするには、Delta Sharingを使用します。

メタストアレベルのストレージを作成することを選択した場合、メタストアは前のステップで作成した S3 バケットと IAMロールを使用します。

メタストアを作成するには、次の手順を実行します。

  1. Databricksアカウントコンソールにログインします。

  2. カタログ アイコン カタログ」 をクリックします

  3. [メタストアを作成]をクリックします。

  4. 次の項目を入力します。

    • メタストアの名前。

    • メタストアをデプロイするリージョン。

      これは、データへのアクセスに使用するワークスペースと同じリージョンに存在する必要があります。また、前に作成したストレージバケットのリージョンと同じであることを確認してください。

    • (オプション)「ステップ 1 (オプション): AWS でメタストアレベルのマネージドストレージ用の S3 バケットを作成する」で作成したバケットとロールの S3 バケットパス (s3://を省略できます) と IAMロール名。

  5. [作成]をクリックします。

  6. メッセージが表示されたら、メタストアにリンクするワークスペースを選択します。

    詳細については、「 Unity Catalog のワークスペースを有効にする」を参照してください。

  7. メタストア管理者ロールをグループに転送します。

    メタストアを作成するユーザーは、その所有者であり、メタストア管理者とも呼ばれます。 メタストア管理者は、カタログなどのメタストアに最上位のオブジェクトを作成し、テーブルやその他のオブジェクトへのアクセスを管理できます。 Databricks では、メタストア管理者ロールをグループに再割り当てすることをお勧めします。 「 メタストア管理者を割り当てる」を参照してください。

  8. マネージド ボリュームへのアップロードの Databricks 管理を有効にします。

    Databricks は、クロスオリジン リソース共有 (CORS) を使用して、Unity Catalog 内の管理対象ボリュームにデータをアップロードします。 CORS 用の Unity Catalog ストレージ アカウントの構成を参照してください。