Unity Catalog で Azure マネージド ID を使用してストレージにアクセスする

この記事では、Azure マネージド ID を使用して、Unity Catalog ユーザーの代わりにストレージ コンテナーに接続する方法について説明します。

Azure マネージド ID とは何か?

Unity Catalog は、Azure マネージド ID を使って、Unity Catalog ユーザーの代わりにストレージ コンテナーにアクセスするように構成できます。 マネージド ID により、アプリケーションが Microsoft Entra ID (旧称 Azure Active Directory) 認証をサポートするリソースに接続するときに使う ID が提供されます。

Unity Catalog でマネージド ID を使用すると、次の 2 つの主要なユース ケースをサポートできます。

  • メタストアのマネージド ストレージ アカウント (マネージド テーブルが格納されている場所) に接続するための ID として。
  • 他の外部ストレージ アカウントに接続するための ID として (ファイル ベースのアクセスまたは外部テーブルを介して既存のデータセットにアクセスする)。

マネージド ID を使用した Unity Catalog の構成には、サービス プリンシパルを使用した Unity Catalog の構成に比べて次のベネフィットがあります。

  • マネージド ID では、資格情報を維持したり、シークレットをローテーションしたりする必要がありません。

  • Azure Databricks ワークスペースが独自の VNet (VNet インジェクションとも呼ばれます) にデプロイされていて、ストレージ ファイアウォールを使用して Azure Data Lake Storage Gen2 アカウントを保護する場合は、マネージド ID を使用してそのアカウントにワークスペースを接続できます。 「(VNet インジェクション ワークスペースの場合に推奨) マネージド ID に基づいて Azure Storage への信頼されたアクセスを構成する」を参照してください。

    注意

    標準の Azure Databricks デプロイではストレージ ファイアウォールを使用できません。

Unity Catalog のマネージド ID を構成する

Unity Catalog で使用するマネージド ID を構成するには、まず Azure で Azure Databricks 用のアクセス コネクタを作成します。 既定では、アクセス コネクタはシステム割り当てマネージド ID を使用してデプロイされます。 代わりに、ユーザー割り当てマネージド ID をアタッチするように選択できます。 その場合、そのマネージド ID に Azure Data Lake Storage Gen2 アカウントへのアクセス権を付与し、Unity Catalog メタストアまたはストレージの資格情報を作成するときにそのアクセス コネクタを使用します。

必要条件

アクセス コネクタを作成する Azure ユーザーまたはサービス プリンシパルには、次の要件があります。

  • Azure リソース グループの共同作成者または所有者であること。

マネージド ID をストレージ アカウントに付与する Azure ユーザーまたはサービス プリンシパルには、次の要件があります。

  • ストレージ アカウントの所有者またはユーザー アクセス管理者 Azure RBAC ロールを持つユーザーであること。

ステップ 1: Azure Databricks 用のアクセス コネクタを作成する

Azure Databricks 用のアクセス コネクタはファースト パーティーの Azure リソースであり、マネージド ID を Azure Databricks アカウントに接続できます。

Azure Databricks の各アクセス コネクタには、1 つのシステム割り当てマネージド ID または 1 つのユーザー割り当てマネージド ID を含めることができます。 複数のマネージド ID を使用する場合は、それぞれに個別のアクセス コネクタを作成します。

システム割り当てマネージド ID を使用する

  1. リソース グループの共同作成者または所有者として Azure portal にログインします。

  2. [+ 作成] または [新しいリソースを作成] をクリックします。

  3. Azure Databricks 用のアクセス コネクタを検索し、選択します。

  4. Create をクリックしてください。

  5. [基本] タブで、以下のフィールドの値をそのまま使用するか、選択または入力します。

    • [サブスクリプション]: これは、アクセス コネクタが作成される Azure サブスクリプションです。 既定値は、現在使用している Azure サブスクリプションです。 テナント内の任意のサブスクリプションにすることができます。
    • リソース グループ: アクセス コネクタが作成される Azure リソース グループです。
    • [名前]: コネクタの目的を示す名前を入力します。
    • [リージョン]: これは、接続先のストレージ アカウントと同じリージョンである必要があります。
  6. [Review + create](レビュー + 作成) をクリックします。

  7. "検証に成功しました" というメッセージが表示されたら、[作成] をクリックします。

    デプロイが成功すると、アクセス コネクタがシステム割り当てのマネージド ID でデプロイされます。

  8. デプロイが完了したら、[リソースに移動] をクリックします。

  9. リソース ID を書き留めておきます。

    リソース ID の形式は次のとおりです。

    /subscriptions/12f34567-8ace-9c10-111c-aea8eba12345c/resourceGroups/<resource-group>/providers/Microsoft.Databricks/accessConnectors/<connector-name>
    

ユーザー割り当てマネージド ID を使用する

  1. ユーザー割り当てマネージド ID がまだない場合は、新たに作成し、そのリソース ID を書き留めておきます。

    ユーザー割り当てマネージド ID の管理」を参照してください。

  2. リソース グループの共同作成者または所有者として Azure portal にログインします。

    リソース グループは、接続先のストレージ アカウントと同じリージョンに存在する必要があります。

  3. [Deploy a custom template] (カスタム テンプレートのデプロイ) を検索して選択します。

  4. [Build your own template] (独自のテンプレートの作成) を選択し、次のテンプレートをエディターに貼り付けます。

    {
     "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
     "contentVersion": "1.0.0.0",
     "parameters": {
         "connectorName": {
             "defaultValue": "testConnector",
             "type": "String",
             "metadata": {
                 "description": "The name of the Azure Databricks Access Connector to create."
             }
         },
         "accessConnectorRegion": {
             "defaultValue": "[resourceGroup().location]",
             "type": "String",
             "metadata": {
                 "description": "Location for the access connector resource."
             }
         },
         "userAssignedManagedIdentiy": {
             "type": "String",
             "metadata": {
                 "description": "The resource Id of the user assigned managed identity."
             }
         }
     },
     "resources": [
         {
             "type": "Microsoft.Databricks/accessConnectors",
             "apiVersion": "2023-05-01",
             "name": "[parameters('connectorName')]",
             "location": "[parameters('accessConnectorRegion')]",
             "identity": {
                 "type": "UserAssigned",
                 "userAssignedIdentities": {
                     "[parameters('userAssignedManagedIdentiy')]": {}
                 }
              }
          }
       ]
    }
    
  5. [Basics] (基本) タブで、以下のフィールドの値をそのまま使用するか、選択または入力します。

    • [サブスクリプション]: アクセス コネクタが作成される Azure サブスクリプション。 既定値は、現在使用している Azure サブスクリプションです。 テナント内の任意のサブスクリプションにすることができます。
    • [リソース グループ]: 接続先のストレージ アカウントと同じリージョン内のリソース グループ。
    • [名前]: コネクタの目的を示す名前。
    • [リージョン]: これは、接続先のストレージ アカウントと同じリージョンである必要があります。 リソース グループが接続先のストレージ アカウントと同じリージョンに作成されていた場合は、事前設定された値 '[resourceGroup().location]' を選択できます。
    • ユーザー割り当てマネージド ID: 使用するユーザー割り当てマネージド ID のリソース ID。
  6. [Review + create](レビュー + 作成) をクリックします。

  7. "検証に成功しました" というメッセージが表示されたら、[作成] をクリックします。

  8. デプロイが完了したら、[リソースに移動] をクリックします。

  9. リソース ID を書き留めておきます。

    リソース ID の形式は次のとおりです。

    /subscriptions/12f34567-8ace-9c10-111c-aea8eba12345c/resourceGroups/<resource-group>/providers/Microsoft.Databricks/accessConnectors/<connector-name>
    

ステップ 2: マネージド ID にストレージ アカウントへのアクセスを許可する

この手順でアクセス許可を付与するには、ストレージ アカウントの所有者またはユーザー アクセス管理者の Azure RBAC の役割が必要です。

  1. [Azure Data Lake Storage Gen2] アカウントにログインしてください。
  2. [アクセス制御 (IAM)] に移動して、[+ 追加] をクリックし、[ロールの割り当ての追加] を選択します。
  3. [ストレージ BLOB データ共同作成者] ロールを選択し、[次へ] をクリックします。
  4. [アクセスの割り当て先][マネージド ID] を選択します。
  5. [メンバー の選択] をクリックし、[Azure Databricks 用のアクセス コネクタ] または [ユーザー割り当てマネージド ID] のいずれかを選択してください。
  6. コネクタ名またはユーザー割り当て ID を検索して選択し、[Review and Assign] (確認と割り当て) をクリックします。

または、マネージド ID に特定のコンテナーへのアクセスを許可することで、ストレージ アカウントへのアクセスを制限することもできます。 上記と同じ手順に従いますが、ストレージ アカウントの Storage BLOB デリゲータ ロールとコンテナーのストレージ BLOB 共同作成者ロールを付与します。

手順 3: マネージド ID にファイル イベントへのアクセス権を付与する

マネージド ID にファイル イベントへのアクセスを許可すると、Azure Databricks はクラウド プロバイダーで生成されたファイル イベント通知をサブスクライブできます。 これにより、ファイル処理の効率が向上します。 この手順でアクセス許可を付与するには、ストレージ アカウントの所有者またはユーザー アクセス管理者の Azure RBAC の役割が必要です。

  1. [Azure Data Lake Storage Gen2] アカウントにログインしてください。
  2. [アクセス制御 (IAM)] に移動して、[+ 追加] をクリックし、[ロールの割り当ての追加] を選択します。
  3. [ストレージ キュー データ共同作成者] ロールを選択し、[次へ] をクリックしてください。
  4. [アクセスの割り当て先][マネージド ID] を選択します。
  5. [メンバー の選択] をクリックし、[Azure Databricks 用のアクセス コネクタ] または [ユーザー割り当てマネージド ID] のいずれかを選択してください。
  6. コネクタ名またはユーザー割り当て ID を検索して選択し、[Review and Assign] (確認と割り当て) をクリックします。

この手順により、Azure Databricks でファイル イベントを自動的に設定できます。 ユーザーに代わってファイル イベントを構成するためのアクセス権を Azure Databricks に付与しない場合は、場所ごとにファイル イベントを手動で構成する必要があります。 この手順でアクセス許可を付与するには、マネージド ID および Azure Data Lake Storage Gen2 アカウントが属するリソース グループに対する所有者またはユーザー アクセス管理者の Azure RBAC の役割が必要です。

  1. 上記の「手順 3: マネージド ID にファイル イベントへのアクセス権を付与する」の手順に従い、ストレージ キュー データ共同作成者ロールと共にストレージ アカウント共同作成者をマネージド ID に割り当ててください。
  2. Azure Data Lake Storage Gen2 アカウントが属する Azure リソース グループに移動してください。
  3. [アクセス制御 (IAM)] に移動して、[+ 追加] をクリックし、[ロールの割り当ての追加] を選択します。
  4. [EventGrid EventSubscription 共同作成者]ロールを選び、[次へ] をクリックしてください。
  5. [アクセスの割り当て先][マネージド ID] を選択します。
  6. [メンバー の選択] をクリックし、[Azure Databricks 用のアクセス コネクタ] または [ユーザー割り当てマネージド ID] のいずれかを選択してください。
  7. コネクタ名またはユーザー割り当て ID を検索して選択し、[Review and Assign] (確認と割り当て) をクリックします。

マネージド ID を使用して Unity Catalog ルート ストレージ アカウントにアクセスする

このセクションでは、Unity Catalog メタストアを作成するときに、マネージド ID にルート ストレージ アカウントへのアクセスを許可する方法について説明します。

マネージド ID を使用するように既存の Unity Catalog メタストアをアップグレードする方法については、「既存の Unity Catalog メタストアをアップグレードしてマネージド ID を使用してそのルート ストレージにアクセスする」を参照してください。

  1. Azure Databricks アカウント管理者として、Azure Databricks アカウント コンソールにログインします。
  2. カタログ アイコンカタログ をクリックします。
  3. [メタストアの作成] をクリックします。
  4. 次のフィールドの値を入力します。
    • メタストアの [名前]

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

      パフォーマンスを最適にするには、同じクラウド リージョン内にアクセス コネクタ、ワークスペース、メタストア、クラウド ストレージを併置します。

    • [ADLS Gen 2 のパス]: メタストアのルート ストレージとして使うストレージ コンテナーへのパスを入力します。

      abfss:// プレフィックスが自動的に追加されます。

    • [アクセス コネクタ ID]: Azure Databricks アクセス コネクタのリソース ID を、次の形式で入力します。

      /subscriptions/12f34567-8ace-9c10-111c-aea8eba12345c/resourceGroups/<resource-group>/providers/Microsoft.Databricks/accessConnectors/<connector-name>
      
    • (省略可能) マネージド ID: ユーザー割り当てマネージド ID を使用してアクセス コネクタを作成した場合は、マネージド ID のリソース ID を入力します。

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

Unity Catalog で管理されている外部ストレージにマネージド ID を使用してアクセスする

Unity Catalog を使用すると、ストレージの資格情報と外部の場所を使用して、ストレージ アカウント内の既存のデータにアクセスできます。 ストレージ資格情報にはマネージド ID が格納され、外部の場所ではストレージ資格情報への参照と共にストレージへのパスが定義されます。 この方法を使用すると、クラウド ストレージ内の既存のデータへのアクセスを許可および制御したり、Unity Catalog に外部テーブルを登録したりできます。

ストレージ資格情報には、マネージド ID またはサービス プリンシパルを保持できます。 マネージド ID を使用すると、サービス プリンシパルでは不可能な、ネットワーク ルールによって保護されたストレージ アカウントに Unity Catalog がアクセスできるというベネフィットがあり、シークレットを管理およびローテーションする必要がなくなります。

マネージド ID を使用してストレージ資格情報を作成し、そのストレージ資格情報を外部の場所に割り当てるには、「Unity Catalog を使用してクラウド オブジェクト ストレージに接続する」の手順に従います。

Azure Databricks ワークスペースが独自の Azure仮想ネットワーク ("VNet インジェクション" とも呼ばれます) にデプロイされていて、ストレージ ファイアウォールを使用して Azure Data Lake Storage Gen2 アカウントを保護する場合、次を行う必要があります。

  1. Azure Storage にアクセスするように Azure Databricks ワークスペースを有効にする。
  2. マネージド ID を有効にして Azure Storage にアクセスする。

ステップ 1. Azure Storage にアクセスするように Azure Databricks ワークスペースを有効にする

Azure Databricks ワークスペースで Azure Data Lake Storage Gen2 にアクセスできるようにネットワーク設定を構成する必要があります。 サブネットから Azure Data Lake Storage Gen2 アカウントへの接続を許可するように、Azure Data Lake Storage Gen2 でプライベート エンドポイントまたは仮想ネットワークからのアクセスを構成できます。

手順については、「Azure Databricks ワークスペースに Azure Data Lake Storage Gen2 へのアクセス権を付与する」を参照してください。

ステップ 2: マネージド ID を有効にして Azure Storage にアクセスする

このステップは、Azure Storage アカウントで [信頼されたサービス一覧にある Azure サービスがこのストレージ アカウントにアクセスすることを許可します] が無効になっている場合にのみ必要です。 その構成が有効になっている場合:

  • ストレージ アカウントと同じテナント内の Azure Databricks 用のアクセス コネクタは、すべてストレージ アカウントにアクセスできます。
  • 信頼されたすべての Azure サービスが、ストレージ アカウントにアクセスできます。 「信頼された Azure サービスにアクセスを許可する」を参照してください。

次の手順には、この構成を無効にするステップが含まれています。 Azure portal か、Azure CLI を使用することができます。

Azure Portal の使用

  1. Azure portal にログインし、Azure Storage アカウントを見つけて選択し、[ネットワーク] タブに移動します。

  2. [パブリック ネットワーク アクセス][選択した仮想ネットワークと IP アドレスから有効] に設定します。

    代わりに、[パブリック ネットワーク アクセス][無効] に設定することもできます。 マネージド ID を使用して、パブリック ネットワーク アクセスのチェックをバイパスできます。

  3. [リソース インスタンス] で、[Microsoft.Databricks/accessConnectors][リソースの種類] を選択し、Azure Databricks アクセス コネクタを選択します。

  4. [例外][信頼されたサービスの一覧にある Azure サービスがこのストレージ アカウントにアクセスすることを許可します] チェックボックスをオフにします。

Azure CLI の使用

  1. Azure CLI をインストールして、サインインします

    Microsoft Entra ID サービス プリンシパルを使用してサインインするには、Microsoft Entra ID サービス プリンシパルを使用した Azure CLI ログインに関する記事を参照してください。

    Azure Databricks ユーザー アカウントを使用してサインインするには、「Azure Databricks ユーザー アカウントを使用した Azure CLI のログイン」を参照してください。

  2. ストレージ アカウントにネットワーク ルールを追加します。

    az storage account network-rule add \
    -–subscription <subscription id of the resource group> \
    -–resource-id <resource Id of the access connector for Azure Databricks> \
    -–tenant-id <tenant Id> \
    -g <name of the Azure Storage resource group> \
    -–account-name <name of the Azure Storage resource> \
    

    リソース ID を次の形式で追加します。

    /subscriptions/12f34567-8ace-9c10-111c-aea8eba12345c/resourceGroups/<resource-group>/providers/Microsoft.Databricks/accessConnectors/<connector-name>
    
  3. ネットワーク ルールを作成したら、Azure portal で Azure Storage アカウントに移動し、[リソース インスタンス] の下の [ネットワーク] タブでマネージド ID を表示します。リソースの種類は Microsoft.Databricks/accessConnectors です。

  4. [例外][信頼されたサービスの一覧にある Azure サービスがこのストレージ アカウントにアクセスすることを許可します] チェックボックスをオフにします。

  5. 必要に応じて、[パブリック ネットワーク アクセス][無効] に設定します。 マネージド ID を使用して、パブリック ネットワーク アクセスのチェックをバイパスできます。

    標準的な方法は、この値を [選択した仮想ネットワークと IP アドレスから有効] に設定したままにすることです。

サーバーレス SQL ウェアハウスは、通常お使いの Azure サブスクリプションではなく、Azure Databricks 用の Azure サブスクリプションで実行されるコンピューティング リソースです。 サーバーレス SQL ウェアハウスを使用する予定があり、Azure Data Lake Storage Gen2 でファイアウォールを構成する場合は、ファイアウォールの構成でサーバーレス SQL ウェアハウスからのアクセスを許可する必要があります。

構成手順については、「サーバーレス コンピューティングのアクセス用にファイアウォールを構成する」を参照してください。

マネージド ID を使用してルート ストレージにアクセスするように既存の Unity Catalog メタストアをアップグレードする

サービス プリンシパルを使用して作成された Unity Catalog メタストアがあり、マネージド ID を使用するようにアップグレードする場合は、API 呼び出しを使用して更新できます。

  1. Unity Catalog のマネージド ID を構成する」の手順に従って、Azure Databricks 用のアクセス コネクタを作成し、Unity Catalog メタストア ルート ストレージに使用されているストレージ コンテナーへのアクセス許可を割り当てます。

    アクセス コネクタは、システム割り当てマネージド ID またはユーザー割り当てマネージド ID のいずれかを使用して作成できます。

    アクセス コネクタのリソース ID を書き留めておきます。 ユーザー割り当てマネージド ID を使用する場合は、そのリソース ID も書き留めます。

  2. アカウント管理者として、メタストアに割り当てられている Azure Databricks ワークスペースにログインします。

    ワークスペース管理者である必要はありません。

    ワークスペースの URL (https:// の後の URL の最初の部分で azuredatabricks.net を含める) をメモしておきます。

  3. 個人用アクセス トークンを生成します

  4. ホーム ディレクトリ内の .netrc ファイルに個人用アクセス トークンを追加します。 これにより、シェルのコマンド履歴に個人用アクセス トークンが表示されるのを防ぐことで、セキュリティが向上します。 トークン管理 API に関するページを参照してください。

  5. 次の cURL コマンドを実行して、ストレージ資格情報を再度作成します。

    プレースホルダー値を次のように置き換えます。

    • <databricks-instance>: 個人用アクセス トークンが生成されたワークスペースのワークスペース URL
    • <credential-name>: ストレージ資格情報の名前。
    • <access-connector-id>: /subscriptions/12f34567-8ace-9c10-111c-aea8eba12345c/resourceGroups/<resource-group>/providers/Microsoft.Databricks/accessConnectors/<connector-name> の形式の、Azure Databricks アクセス コネクタのリソース ID
    • <managed-identity-id>: ユーザー割り当てマネージド ID を使用してアクセス コネクタを作成した場合は、マネージド ID のリソース ID を指定します。
    curl -n -X POST --header 'Content-Type: application/json' https://<databricks-instance>/api/2.0/unity-catalog/storage-credentials --data "{
      \"name\": \"<credential-name>\",
      \"azure_managed_identity\": {
        \"access_connector_id\": \"<access-connector-id>\",
        \"managed_identity_id\": \"<managed-identity-id>\"
      }
    }"
    
  6. 応答内のストレージ資格情報 ID を記録しておきます。

  7. 次の cURL コマンドを実行して metastore_id を取得します。<databricks-instance> は、個人用アクセス トークンが生成されたワークスペースのワークスペース URL です。

    curl -n GET--header 'Content-Type: application/json' https://<databricks-instance>/api/2.0/unity-catalog/metastore_summary
    
  8. 次の cURL コマンドを実行して、新しいルート ストレージ資格情報でメタストアを更新します。

    プレースホルダー値を次のように置き換えます。

    • <databricks-instance>: 個人用アクセス トークンが生成されたワークスペースのワークスペース URL
    • <metastore-id>: 前のステップで取得したメタストア ID。
    • <storage-credential-id>: ストレージ資格情報 ID。
    curl -n -X PATCH --header 'Content-Type: application/json' https://<databricks-instance>/api/2.0/unity-catalog/metastores/<metastore-id> --data
    "{\"storage_root_credential_id\": \"<storage-credential-id>\"}"