Databricks Apps でユーザー単位のアクセス制御を実現

Databricks Appsでユーザー単位のアクセス制御を実装。トークン取得からSDK実行まで解説。

目次

はじめに

Databricks Apps を使ったアプリケーション開発において、ユーザーごとに異なるデータアクセス権限を適用したいケースは多いでしょう。本記事では、Databricks Apps でユーザートークンを取得し、Unity Catalog や Genie Space へのアクセス制御を一気通貫で実装する方法を解説します。

事前設定

1. アプリでのユーザー権限設定

まず、Databricks Apps でユーザー認証を有効化します。

Compute > Apps > 対象のアプリ > Edit > Configure resources から User authorizationからAdd scopeより以下のように設定します。

 

重要: User authorization が Preview モードになっていることを確認してください。有効になっていない場合は、ユーザー設定から Previews をクリックしてトグルを ON にします。

2. Genie Space への権限付与

接続する Genie Space に対して、ユーザーが Run 以上の権限 を持っていることを確認します。Genie Space の Share ボタンから権限設定を確認できます。

アプリと Genie Space を接続するため、

app.yaml

に Genie Space ID を定義しておきます。

command: ['streamlit', 'run', 'app.py'] 

env: 
  - name: 'GENIE_SPACE_ID' 
    valueFrom: 'genie_space_id'
  - name: 'GENIE_DYNAMIC_META'
    valueFrom: 'genie_dynamic_meta' 
  - name: 'OPENAI_API_KEY' 
    valueFrom: 'openai-api-key'
  - name: 'GEMINI_API_KEY' 
    valueFrom: 'gemini-api-key'
  - name: 'DATABRICKS_WAREHOUSE_ID' 
    valueFrom: 'sql-warehouse' 
  - name: 'STREAMLIT_GATHER_USAGE_STATS' 
    value: 'false'
3. Unity Catalog への権限付与

ユーザーが参照したいカタログ、スキーマ、テーブルに対して適切な権限(USE CATALOG、USE SCHEMA、SELECT など)が付与されていることを確認します。

実装の流れ

ステップ1: ユーザートークンの取得

Streamlit のコンテキストから、ユーザーがアクセスした際、リクエストヘッダー(x-forwarded-access-token)からトークンを取得します。

user_token = None 
if hasattr(st, "context") and st.context.headers is not None: 
   user_token = st.context.headers.get("x-forwarded-access-token") 
ステップ2: パイプライン初期状態への保存

取得したトークンを、エージェントの状態管理(state)に保存します。これにより、すべてのサブエージェントが同じトークンにアクセスできるようになります。

state = { 
      "user_input": user_input, 
      "chat_history": chat_history, 
      "user_access_token": user_token, # <--- Stateに保存 }
ステップ3: エージェントでのトークン利用

エージェントで state からトークンを取り出し、Databricks SDK のクライアント(WorkspaceClient)を作成します。

# state からトークンを取得 
user_token = ctx.session.state.get("user_access_token") 
# トークンを使って WorkspaceClient を作成 
if user_token: 
    w = WorkspaceClient( token=user_token, auth_type="pat" ) 
else: w = WorkspaceClient()

作成したクライアントとDatabricks SDKの

statement_execution

APIを使用してSQLクエリ(

statement

)を実行し、データを取得します。

stmt = w.statement_execution.execute_statement( 
        statement=query, 
        warehouse_id=warehouse_id, 
        catalog="data" 
)

まとめ

Databricks Apps でユーザー単位のアクセス制御を実装するポイントは以下の通りです。

  1. 事前設定: User authorization、Genie Space、Unity Catalog の権限設定を正しく行う
  2. トークン取得: st.context.headers から x-forwarded-access-token を取得
  3. State 管理: 取得したトークンをState に保存し、各エージェントで参照
  4. SDK 利用: WorkspaceClient 作成時に tokenauth_type="pat" を指定

この実装により、アプリケーション全体でユーザーの権限に基づいたデータアクセス制御が実現できます。セキュリティとガバナンスを保ちながら、柔軟なデータ活用が可能になります。

CTA
  • URLをコピーしました!
  • URLをコピーしました!
この記事を書いた人
目次