0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🔥 Databricks Apps内で利用する二つの認証方式

Last updated at Posted at 2025-11-05

📖 はじめに

Databricks Appsを開発していて、こんなエラーに遭遇したことはありませんか?

❌ "Access denied: User does not have permission to use Unity Catalog"
❌ "Invalid authentication token"

実は、Databricks AppsがUnity Catalog管理のテーブルやSQL Warehouseにアクセスするには、適切な認証を実装する必要があります。しかし、公式ドキュメントを読んでも「結局どっちの認証方式を使えばいいの?」と悩む方も多いはず。

この記事では、2つの認証方式(Service Principalとユーザー代理認証)の違いを明確にし、実際のコード例とともに実装方法を解説します!

🏗️ Section 1: Databricks Apps認証アーキテクチャの全体像

🤔 なぜ認証が必要なのか?

Databricks Appsは、Unity Catalogで管理されているさまざまなリソースにアクセスします:
image.png

これらのリソースはすべてUnity Catalogの権限管理下にあるため、適切な認証なしにはアクセスできません。

🎭 Section 2: 認証方式の比較

認証方式 Service Principal 🔒 ユーザー代理認証 👤
動作原理 アプリケーション自体の権限で動作する認証方式。 エンドユーザーの権限を借用して動作する認証方式。
使い分け バックグラウンド処理や共通リソースへのアクセス ユーザー固有のリソースへのアクセス
例1 大規模データ処理 ユーザー固有のデータアクセス
例2 定期バッチ処理 ユーザー固有のジョブ実行
例3 外部API/サーバーサイド処理 ユーザー固有のML推論サービス
例4 共通リソース/カタログ ユーザー固有のGenie
例5 監視・メンテナンス ユーザー固有の設定

🤖 Section 3: Service Principal認証の実装

image.png
image.png

👥 Section 4: ユーザー代理認証の実装

ユーザー代理認証は、エンドユーザーの権限を借用してDatabricksリソースにアクセスする認証方式です。

📐 認証フローの仕組み

image.png

🔨 実装コード

FastAPIを使用した実装例

from fastapi import FastAPI, Header, HTTPException
from fastapi.responses import JSONResponse
from typing import Annotated
from databricks.sdk import WorkspaceClient
import pandas as pd

app = FastAPI()

@app.get("/user-data")
async def get_user_data(
    token: Annotated[
        str,
        Header(alias="X-Forwarded-Access-Token")
    ]
) -> JSONResponse:
    """
    ユーザー代理認証でデータを取得するエンドポイント
    """
    try:
        # ユーザーのトークンでWorkspaceClientを初期化
        as_user = WorkspaceClient(token=token)
        
        # 現在のユーザー情報を取得
        user = as_user.current_user.me()
        
        # ユーザーの権限でデータにアクセス
        query = """
        SELECT 
            user_id, 
            department, 
            sales_amount
        FROM catalog.schema.sales_data
        WHERE user_id = current_user()
        LIMIT 100
        """
        
        result = as_user.sql.query(query)
        
        return JSONResponse({
            "user": user.user_name,
            "data": result.to_pandas().to_dict(orient="records")
        })
        
    except Exception as e:
        raise HTTPException(status_code=401, detail=str(e))

@app.get("/me")
async def get_current_user(
    token: Annotated[
        str,
        Header(alias="X-Forwarded-Access-Token")
    ]
) -> JSONResponse:
    """
    現在のユーザー情報を取得
    """
    as_user = WorkspaceClient(token=token)
    user = as_user.current_user.me()
    return JSONResponse(user.as_dict())

🎯 トークンスコープの要件

⚠️ 重要な制約事項:

# アプリケーション登録時のスコープ設定
required_scopes = [
    "sql:warehouses:use",     # SQL Warehouseの使用
    "unity-catalog:tables:select",  # テーブルの参照
    "unity-catalog:schemas:use"     # スキーマの使用
]

トークンにはアプリケーションが要求するすべてのスコープが含まれている必要があります!

📊 実装パターンの比較表

項目 Service Principal ユーザー代理認証
セットアップの複雑さ 🟢 簡単 🟡 やや複雑
権限の柔軟性 🔴 固定 🟢 動的
監査ログの詳細度 🟡 基本的 🟢 詳細
適用シーン バッチ処理、API インタラクティブUI

🎯 まとめ

Databricks Appsの認証実装において重要なポイント:

  1. Unity Catalog管理リソースには必ず認証が必要 🔐
  2. Service Principal認証は、シンプルで固定的な権限管理に最適 🤖
  3. ユーザー代理認証は、ユーザーごとの権限制御が必要な場合に使用 👥

これらのポイントを押さえれば、セキュアで効率的なDatabricks Appsを開発できます!

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?