📖 はじめに
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で管理されているさまざまなリソースにアクセスします:

これらのリソースはすべてUnity Catalogの権限管理下にあるため、適切な認証なしにはアクセスできません。
🎭 Section 2: 認証方式の比較
| 認証方式 | Service Principal 🔒 | ユーザー代理認証 👤 |
|---|---|---|
| 動作原理 | アプリケーション自体の権限で動作する認証方式。 | エンドユーザーの権限を借用して動作する認証方式。 |
| 使い分け | バックグラウンド処理や共通リソースへのアクセス | ユーザー固有のリソースへのアクセス |
| 例1 | 大規模データ処理 | ユーザー固有のデータアクセス |
| 例2 | 定期バッチ処理 | ユーザー固有のジョブ実行 |
| 例3 | 外部API/サーバーサイド処理 | ユーザー固有のML推論サービス |
| 例4 | 共通リソース/カタログ | ユーザー固有のGenie |
| 例5 | 監視・メンテナンス | ユーザー固有の設定 |
🤖 Section 3: Service Principal認証の実装
👥 Section 4: ユーザー代理認証の実装
ユーザー代理認証は、エンドユーザーの権限を借用してDatabricksリソースにアクセスする認証方式です。
📐 認証フローの仕組み
🔨 実装コード
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の認証実装において重要なポイント:
- Unity Catalog管理リソースには必ず認証が必要 🔐
- Service Principal認証は、シンプルで固定的な権限管理に最適 🤖
- ユーザー代理認証は、ユーザーごとの権限制御が必要な場合に使用 👥
これらのポイントを押さえれば、セキュアで効率的なDatabricks Appsを開発できます!


