チュートリアル: Azure Data Lake Storage Gen2 への接続

Note

この記事では、Azure Data Lake Storage Gen2 へのアクセスを構成するための従来のパターンについて説明します。 Databricks では、Unity Catalog を使用することをお勧めします。 「Unity Catalog メタストアの作成」と「Unity Catalog を使用したクラウド オブジェクト ストレージへの接続」を参照してください。

このチュートリアルでは、Microsoft Entra ID サービス プリンシパルで OAuth 2.0 を使用して、Azure Databricks から Azure Data Lake Storage Gen2 に接続するために必要なすべての手順をガイドします。

要件

このチュートリアルを始める前に、以下のタスクを完了します。

手順 1: Microsoft Entra ID サービス プリンシパルを作成する

サービス プリンシパルを使用して Azure Data Lake Storage Gen2 に接続するには、管理者ユーザーが新しい Microsoft Entra ID (旧称 Azure Active Directory) アプリケーションを作成する必要があります。 Microsoft Entra ID サービス プリンシパルを既に使用できる場合は、「手順 2: サービス プリンシパルのクライアント シークレットを作成する」に進んでください。

Microsoft Entra ID サービス プリンシパルを作成するには、次の手順に従います。

  1. Azure portal にサインインします。

    Note

    使用するポータルは、Microsoft Entra ID アプリケーションが Azure パブリック クラウド、各国のクラウドまたはソブリン クラウドのいずれで実行されるかによって異なります。 詳細については、各国のクラウドに関する記事をご覧ください。

  2. 複数のテナント、サブスクリプション、またはディレクトリにアクセスできる場合は、上部のメニューの [ディレクトリ + サブスクリプション] (フィルター付きのディレクトリ) アイコンをクリックして、サービス プリンシパルをプロビジョニングするディレクトリに切り替えます。

  3. <Microsoft Entra ID を検索して選択します。

  4. [管理] で、[アプリの登録] > [新規登録] の順にクリックします。

  5. [名前] にアプリケーションの名前を入力します。

  6. [サポートされているアカウントの種類] セクションで、[この組織ディレクトリのみに含まれるアカウント (シングル テナント)] を選択します。

  7. [登録] をクリックします。

手順 2: サービス プリンシパルのクライアント シークレットを作成する

  1. [管理] で、[証明書とシークレット] をクリックします。

  2. [クライアント シークレット] タブで、[新しいクライアント シークレット] をクリックします。

    新しいクライアント シークレット

  3. [クライアントシークレットの追加] ウィンドウの [説明] に、クライアント シークレットの説明を入力します。

  4. [有効期限] で、クライアント シークレットの有効期限の期間を選択して、[追加] をクリックします。

  5. クライアント シークレットの をコピーし、安全な場所に保存します。このクライアント シークレットはアプリケーションのパスワードです。

  6. アプリケーション ページの [概要] ページの [要点] セクションで、次の値をコピーします。

    • アプリケーション (クライアント) ID
    • ディレクトリ (テナント) ID

    Azure 登録済みアプリの概要

手順 3: サービス プリンシパルに Azure Data Lake Storage Gen2 へのアクセス権を付与する

ストレージ リソースへのアクセス権を付与するには、サービス プリンシパルにロールを割り当てます。 このチュートリアルでは、Storage Blob のデータ共同作成者を、Azure Data Lake Storage Gen2 アカウントのサービス プリンシパルに割り当てます。 特定の要件に応じて、他のロールを割り当てる必要がある場合があります。

  1. Azure portal で、[ストレージ アカウント] サービスに移動します。
  2. 使用する Azure ストレージ アカウントを選択します。
  3. [アクセス制御 (IAM)] をクリックします。
  4. [+ 追加] をクリックし、ドロップダウン メニューから [ロールの割り当ての追加] を選択します。
  5. [選択] フィールドを Microsoft Entra ID アプリケーション名に設定し、手順 1 で作成した [ロール][Storage BLOB データ共同作成者] に設定します。
  6. [保存] をクリックします。

手順 4: クライアント シークレットを Azure Key Vault に追加する

手順 1 のクライアント シークレットを Azure Key Vault に保存できます。

  1. Azure portal で、[キー コンテナー] サービスにアクセスします。
  2. 使用する Azure Key Vault を選択します。
  3. Key Vault の設定ページで、[シークレット] を選択します。
  4. [生成/インポート] をクリックします。
  5. [アップロード オプション][手動] を選択します。
  6. [名前] に、シークレットの名前を入力します。 シークレットの名前は、キー コンテナー内で一意である必要があります。
  7. [値] に、手順 1 で保存したクライアント シークレットを貼り付けます。
  8. Create をクリックしてください。

手順 5: Azure Databricks ワークスペースに Azure Key Vault でサポートされるシークレット スコープを作成する

Azure Key Vault に格納されているシークレットを参照するために、Azure Key Vault でサポートされるシークレットのスコープを Azure Databricks に作成できます。

  1. https://<databricks-instance>#secrets/createScope にアクセスします。 この URL では大文字と小文字が区別されます。createScope のスコープは大文字にする必要があります。

    スコープの作成

  2. シークレットのスコープの名前を入力します。 シークレットのスコープの名前は大文字と小文字が区別されません。

  3. [プリンシパルの管理] ドロップダウンを使用して、"すべてのユーザー" にこのシークレットのスコープの MANAGE アクセス許可を付与するか、シークレットのスコープの "作成者" (つまり、あなた) のみにするかを指定します。

  4. [DNS 名] (例: https://databrickskv.vault.azure.net/) と [リソース ID] (次の例) を入力します。

    /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/databricks-rg/providers/Microsoft.KeyVault/vaults/databricksKV
    

    これらのプロパティは、Azure portal 内の Azure Key Vault の [プロパティ] タブで使用できます。

    Azure Key Vault の [プロパティ] タブ

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

手順 6: Python を使用して Azure Data Lake Storage Gen2 に接続する

これで、Microsoft Entra ID アプリケーション サービス プリンシパルで OAuth 2.0 を認証に使用して、Azure Databricks ノートブックから Azure ストレージ アカウント内のデータに安全にアクセスできるようになりました。

  1. Azure Databricks ワークスペースに移動して新しい Python ノートブックを作成します。

  2. 次の Python コードを、その下の内容で置き換えて実行し、Azure Data Lake Storage Gen2 に接続します。

    service_credential = dbutils.secrets.get(scope="<scope>",key="<service-credential-key>")
    
    spark.conf.set("fs.azure.account.auth.type.<storage-account>.dfs.core.windows.net", "OAuth")
    spark.conf.set("fs.azure.account.oauth.provider.type.<storage-account>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
    spark.conf.set("fs.azure.account.oauth2.client.id.<storage-account>.dfs.core.windows.net", "<application-id>")
    spark.conf.set("fs.azure.account.oauth2.client.secret.<storage-account>.dfs.core.windows.net", service_credential)
    spark.conf.set("fs.azure.account.oauth2.client.endpoint.<storage-account>.dfs.core.windows.net", "https://login.microsoftonline.com/<directory-id>/oauth2/token")
    

    • <scope> を手順 5 のシークレット スコープ名と置き換えます。
    • <service-credential-key> をクライアント シークレットを含むキーの名前に置き換えます。
    • <storage-account> は Azure ストレージ アカウントの名前に置き換えます。
    • <application-id> を Microsoft Entra ID アプリケーションのアプリケーション (クライアント) ID に置き換えます。
    • <directory-id> を Microsoft Entra ID アプリケーションのディレクトリ (テナント) ID に置き換えます。

    これで、Azure Databricks ワークスペースを Azure Data Lake Storage Gen2 アカウントに正常に接続できました。

Azure Databricks ワークスペースに Azure Data Lake Storage Gen2 へのアクセス権を付与する

Azure Data Lake Storage Gen2 でファイアウォールを構成する場合は、Azure Databricks ワークスペースが Azure Data Lake Storage Gen2 に接続できるようにネットワーク設定を構成する必要があります。 まず、「Azure 仮想ネットワークに Azure Databricks をデプロイする (VNet インジェクション)」に従って、Azure Databricks ワークスペースが独自の仮想ネットワークにデプロイされていることを確認します。 次に、サブネットから Azure Data Lake Storage Gen2 アカウントへの接続を許可するように、プライベート エンドポイントまたは仮想ネットワークからのアクセスを構成できます。

サーバーレス SQL ウェアハウスなどのサーバーレス コンピューティングを使っている場合は、サーバーレス コンピューティング プレーンから Azure Data Lake Storage Gen2 へのアクセスを許可する必要があります。 「サーバーレス コンピューティング プレーン ネットワーク」をご覧ください。

プライベート エンドポイントを使用してアクセス権を付与する

Azure Data Lake Storage Gen2 アカウントのプライベート エンドポイントを使用して、プライベート リンク経由でのデータへの安全なアクセスを Azure Databricks ワークスペースに許可できます。

Azure portal を使用してプライベート エンドポイントを作成するには、「チュートリアル: Azure プライベート エンドポイントを使用してストレージ アカウントに接続する」を参照してください。 プライベート エンドポイントは、Azure Databricks ワークスペースがデプロイされているのと同じ仮想ネットワークに作成するようにしてください。

仮想ネットワークからアクセス権を付与する

Azure 仮想ネットワーク サービス エンドポイントを使用すると、重要な Azure サービス リソースをユーザーの仮想ネットワーク専用にして保護できます。 Azure Databricks ワークスペースに使用した VNet 内で、Azure Storage のサービス エンドポイントを有効にできます。

Azure CLI や PowerShell の手順などの詳細については、「仮想ネットワークからアクセスの許可」を参照してください。

  1. Azure Data Lake Storage Gen2 アカウントのストレージ アカウント共同作成者ロールを持つユーザーとして、Azure portal にログインします。
  2. Azure Storage アカウントに移動し、[ネットワーク] タブに移動します。
  3. 選択した仮想ネットワークと IP アドレスからのアクセスを許可するように選択されていることを確認します。
  4. [仮想ネットワーク] で、[既存の仮想ネットワークを追加する] を選択します。
  5. サイド パネルの [サブスクリプション] で、仮想ネットワークが存在するサブスクリプションを選択します。
  6. [仮想ネットワーク] で、Azure Databricks ワークスペースがデプロイされている仮想ネットワークを選択します。
  7. [サブネット] で、[すべて選択] を選択します。
  8. [有効化] をクリックします。
  9. [保存] を選択して変更を保存します。

トラブルシューティング

エラー: IllegalArgumentException: スコープがあるシークレットが存在しません: KeyVaultScope と key

このエラーは、おそらく次のことを意味します。

  • コードで参照される Databricks でサポートされるスコープが無効です。

この記事の手順 4 でシークレットの名前を確認します。

エラー: com.databricks.common.client.DatabricksServiceHttpClientException: INVALID_STATE: Databricks が keyvault にアクセスできませんでした

このエラーは、おそらく次のことを意味します。

  • コードで参照される Databricks でサポートされるスコープが無効です。 または、キー コンテナーに格納されているシークレットの有効期限が切れています。

手順 3 を調べて、Azure Key Vault シークレットが有効であることを確認します。 この記事の手順 4 でシークレットの名前を確認します。

エラー: ADAuthenticator$HttpException: HTTP Error 401: トークンが AzureAD 応答からトークンを取得できませんでした

このエラーは、おそらく次のことを意味します。

  • サービス プリンシパルのクライアント シークレット キーの有効期限が切れています。

この記事の手順 2 に従って新しいクライアント シークレットを作成し、Azure Key Vault 内のシークレットを更新します。

リソース