AIエージェントの認証(Model Serving)
新しいユースケースの場合、Databricksは、エージェントコード、サーバー構成、およびデプロイワークフローを完全に制御するために、Databricks Appsにエージェントをデプロイすることをお勧めします。AIエージェントを作成してDatabricks Appsにデプロイするを参照してください。既存のエージェントを移行するには、Model ServingからDatabricks Appsにエージェントを移行するを参照してください。
AIエージェントは、タスクを完了するために他のリソースに対して認証を行う必要があることがよくあります。たとえば、デプロイされたエージェントは、非構造化データをクエリするためにAI Searchインデックスに、または動的プロンプトをロードするためにプロンプトレジストリにアクセスする必要がある場合があります。
このページでは、カスタムエージェントを使用してエージェントを開発およびデプロイする際に利用できる認証方法について説明します。
認証方法
次の表は、利用可能な認証方法を比較したものです。これらのいずれのアプローチも組み合わせることができます:
手法 | 説明 | セキュリティ体制 | セットアップの複雑さ |
|---|---|---|---|
エージェントは、デプロイしたユーザーの権限で実行されます。 Databricks は、宣言されたリソースの有効期間の短い資格情報を自動的に管理します。 | 短期的な資格情報、自動ローテーション | 低 - ロギング時に依存関係を宣言する | |
エージェントは、リクエストを行うエンドユーザーの権限で実行されます。 | 制限付きスコープでエンドユーザーの認証情報を使用します。 | 中 - スコープ宣言とランタイムの初期化が必要です | |
環境変数を使用して資格情報を明示的に指定します | 有効期間の長い資格情報にはローテーション管理が必要です。 | 高:手動での認証情報管理が必要です |
リソースに適切な認証方法を選択してください。
このフローチャートを使用して、各リソースの適切な認証方法を選択します。必要に応じてメソッドを組み合わせることができ、エージェントはユースケースに応じてリソースごとに異なるメソッドを使用できます。
-
ユーザーごとのアクセス制御またはユーザー属性の監査が必要ですか?
- はい → ユーザー代理認証を使用します。
- いいえ → ステップ2に進みます
-
すべてのリソースは自動認証に対応していますか?
Databricks MCPサーバーに認証します
Databricks MCPサーバーに認証するには、エージェントが必要とするすべてのリソースをログ記録時に指定します。
たとえば、エージェントが以下のMCPサーバーURLを使用している場合、すべてのAI Searchインデックスをprod.customer_supportとprod.billingスキーマで指定する必要があります。prod.billing にあるすべての Unity Catalog 関数も指定する必要があります:
https://<your-workspace-hostname>/api/2.0/mcp/ai-search/prod/customer_supporthttps://<your-workspace-hostname>/api/2.0/mcp/ai-search/prod/billinghttps://<your-workspace-hostname>/api/2.0/mcp/functions/prod/billing
管理対象 MCP サーバーのすべての依存リソースを特定するプロセスを簡素化するには、管理対象 MCP サーバーが必要とするリソースを取得するために、databricks-mcp PyPI パッケージ databricks_mcp.DatabricksMCPClient().get_databricks_resources(<server_url>) を使用してください。
エージェントがDatabricksアプリでホストされているカスタムMCPサーバーをクエリーする場合、モデルをログに記録する際にサーバーをリソースとして明示的に含めることで認証を設定できます。
自動認証パススルー
自動認証パススルーは、Databricks が管理するリソースにアクセスする最も簡単な方法です。エージェントのログ記録時にリソースの依存関係を宣言すると、Databricks はエージェントのデプロイ時に有効期間の短い資格情報を自動的にプロビジョニング、ローテーション、および管理します。
この認証動作は、Databricks ダッシュボードの「所有者としてラン」の動作に類似しています。Unity Catalog テーブルなどのダウンストリームリソースは、エージェントが必要とするリソースのみに最小特権でアクセスできるService Principal の認証情報を使用してアクセスされます。
自動認証パススルーの仕組み
自動認証パススルーを使用してエージェントがEndpointの背後で提供される場合、Databricks は以下のステップを実行します。
-
**権限の検証**:Databricksは、Endpoint作成者がエージェントのログ記録中に指定されたすべての依存関係にアクセスできることを検証します。
-
サービスプリンシパルの作成と権限付与 : エージェント モデル バージョンに対してサービスプリンシパルが作成され、エージェント リソースへの読み取りアクセスが自動的に付与されます。
システム生成のService Principalは、APIまたはUIリストには表示されません。エージェントのモデルバージョンがEndpointから削除された場合、Service Principalも削除されます。
- 資格情報のプロビジョニングとローテーション : Service Principal 用の有効期間の短い資格情報 (M2M OAuth トークン) が Endpoint に挿入され、エージェント コードが Databricks リソースにアクセスできるようになります。Databricks は資格情報もローテーションし、エージェントが依存リソースへ継続的かつ安全にアクセスできるようにします。
自動認証パススルーでサポートされているリソース
次の表に、自動認証パススルーをサポートするDatabricksリソースと、エージェントをデプロイする際にEndpoint作成者が持つ必要がある権限を示します。
Unity Catalog リソースには、親スキーマに対するUSE SCHEMAと、親カタログに対するUSE CATALOGも必要です。
リソースタイプ | 権限 | 最小MLflowバージョン |
|---|---|---|
SQLウェアハウス |
| 2.16.1以上 |
モデルサービングエンドポイント |
| 2.13.1以降 |
Unity Catalog 関数 |
| 2.16.1以上 |
Genie Agent |
| 2.17.1以上 |
AI Searchインデックス |
| 2.13.1以降 |
Unity Catalogテーブル |
| 2.18.0以上 |
Unity Catalog接続 |
| 2.17.1以上 |
Lakebase |
| 3.3.2以上 |
自動認証パススルーを実装する
自動認証パススルーを有効にするには、エージェントをログに記録するときに依存するリソースを指定します。log_model() APIのresourcesパラメーターを使用します。
すべてのダウンストリームの依存リソースもLogすることを忘れないでください。たとえば、Genie AgentをLogする場合、そのテーブル、SQL Warehouse、およびUnity Catalog関数もLogする必要があります。
import mlflow
from mlflow.models.resources import (
DatabricksVectorSearchIndex,
DatabricksServingEndpoint,
DatabricksSQLWarehouse,
DatabricksFunction,
DatabricksGenieSpace,
DatabricksTable,
DatabricksUCConnection,
DatabricksApp,
DatabricksLakebase
)
with mlflow.start_run():
logged_agent_info = mlflow.pyfunc.log_model(
python_model="agent.py",
artifact_path="agent",
input_example=input_example,
example_no_conversion=True,
# Specify resources for automatic authentication passthrough
resources=[
DatabricksVectorSearchIndex(index_name="prod.agents.databricks_docs_index"),
DatabricksServingEndpoint(endpoint_name="databricks-meta-llama-3-3-70b-instruct"),
DatabricksServingEndpoint(endpoint_name="databricks-bge-large-en"),
DatabricksSQLWarehouse(warehouse_id="your_warehouse_id"),
DatabricksFunction(function_name="ml.tools.python_exec"),
DatabricksGenieSpace(genie_space_id="your_genie_space_id"),
DatabricksTable(table_name="your_table_name"),
DatabricksUCConnection(connection_name="your_connection_name"),
DatabricksApp(app_name="app_name"),
DatabricksLakebase(database_instance_name="lakebase_instance_name"),
]
)
ユーザー代理認証
プレビュー
この機能は パブリック プレビュー段階です。
ユーザー代理(OBO)認証により、エージェントはクエリーを実行する Databricks ユーザーとして動作できます。これにより、次の機能が提供されます。
- ユーザーごとの機密データへのアクセス
- Unity Catalog によるきめ細かなデータ制御
- セキュリティトークンは、エージェントが宣言する APIs のみに制限(「ダウンスコープ」)され、誤用のリスクが軽減されます。
要件
- ユーザー代理認証には MLflow 2.22.1 以降が必要です。
- ユーザー代理認証はdefaultで無効になっており、ワークスペース管理者が有効にする必要があります。この機能を有効にする前に、セキュリティに関する考慮事項を確認してください。
OBOがサポートするリソース
Model Serving Endpointでは、OBO 認証を持つエージェントは、以下の表に記載されている Databricks リソースにのみアクセスできます。Unity Catalog ボリューム(ファイルのupload/download)など、ここに記載されていないリソースは、Model Serving での OBO には対応していません。
エージェントがより広範なリソースセットへの OBO アクセスを必要とする場合、Databricks は追加の OAuth スコープをサポートするDatabricks Appsへのエージェントのデプロイを推奨します。Model Serving から Databricks Apps にエージェントを移行するを参照してください。
Databricksリソース | 互換性のあるクライアント |
|---|---|
AI Searchインデックス |
|
モデルサービングエンドポイント |
|
SQLウェアハウス |
|
UC接続 |
|
UC テーブルと関数 |
|
Genie Agent |
|
モデルコンテキストプロトコル(MCP) |
|
OBO 認証を実装します
ユーザー代理認証を有効にするには、次のステップを完了します。
- エンドユーザーに代わってリソースにアクセスするように指定するために、SDK の呼び出しを更新します。
- エージェントコードを更新して、
predict関数内でOBOアクセスを初期化します。ユーザーIDはランタイムでのみ認識されるため、__init__では初期化しません。 - デプロイメント用にエージェントをログに記録する際は、エージェントが必要とするDatabricks REST APIスコープを宣言してください。
次のスニペットは、異なるDatabricksリソースへのユーザーに代わるアクセスを構成する方法を示しています。ツールを初期化する際は、初期化をtry-exceptブロックで囲むことで、アクセス許可エラーを適切に処理します。
- AI Search Retriever Tool
- AI Search Client
- MCP
- Model Serving Endpoint
- UC Connections
- Genie Agents (WorkspaceClient)
- Genie Agents (LangChain)
from databricks.sdk import WorkspaceClient
from databricks_ai_bridge import ModelServingUserCredentials
from databricks_langchain import VectorSearchRetrieverTool
# Configure a Databricks SDK WorkspaceClient to use on behalf of end
# user authentication
user_client = WorkspaceClient(credentials_strategy = ModelServingUserCredentials())
vector_search_tools = []
# Exclude exception handling if the agent should fail
# when users lack access to all required Databricks resources
try:
tool = VectorSearchRetrieverTool(
index_name="<index_name>",
description="...",
tool_name="...",
workspace_client=user_client # Specify the user authorized client
)
vector_search_tools.append(tool)
except Exception as e:
_logger.debug("Skipping adding tool as user does not have permissions")
from databricks.vector_search.client import VectorSearchClient
from databricks.vector_search.utils import CredentialStrategy
# Configure a VectorSearch Client to use on behalf of end
# user authentication
user_authenticated_vsc = VectorSearchClient(credential_strategy=CredentialStrategy.MODEL_SERVING_USER_CREDENTIALS)
# Exclude exception handling if the agent should fail when
# users lack access to all required Databricks resources
try:
vs_index = user_authenticated_vsc.get_index(endpoint_name="endpoint_name", index_name="index_name")
...
except Exception as e:
_logger.debug("Skipping Vector Index because user does not have permissions")
from databricks.sdk import WorkspaceClient
from databricks_ai_bridge import ModelServingUserCredentials
from databricks_mcp import DatabricksMCPClient
# Configure a Databricks SDK WorkspaceClient to use on behalf of end
# user authentication
user_client = WorkspaceClient(credentials_strategy=ModelServingUserCredentials())
mcp_client = DatabricksMCPClient(
server_url="<mcp_server_url>",
workspace_client=user_client, # Specify the user client here
)
from databricks.sdk import WorkspaceClient
from databricks_ai_bridge import ModelServingUserCredentials
# Configure a Databricks SDK WorkspaceClient to use on behalf of end
# user authentication
user_client = WorkspaceClient(credentials_strategy=ModelServingUserCredentials())
# Exclude exception handling if the agent should fail
# when users lack access to all required Databricks resources
try:
user_client.serving_endpoints.query("endpoint_name", input="")
except Exception as e:
_logger.debug("Skipping Model Serving Endpoint due to no permissions")
import requests
from databricks.sdk import WorkspaceClient
from databricks_ai_bridge import ModelServingUserCredentials
# Configure a Databricks SDK WorkspaceClient to use on behalf of end
# user authentication
user_client = WorkspaceClient(credentials_strategy=ModelServingUserCredentials())
response = requests.post(
f"{user_client.config.host}/api/2.0/unity-catalog/connections/connection_name/proxy/api/v1/resource",
headers={
**user_client.config.authenticate(),
"Content-Type": "application/json",
},
json={"key": "value"},
)
from databricks_langchain.genie import GenieAgent
from databricks.sdk import WorkspaceClient
from databricks_ai_bridge import ModelServingUserCredentials
# Configure a Databricks SDK WorkspaceClient to use on behalf of end
# user authentication
user_client = WorkspaceClient(credentials_strategy=ModelServingUserCredentials())
genie_agent = GenieAgent(
genie_space_id="space-id",
genie_agent_name="Genie",
description="This Genie Agent has access to sales data in Europe",
client=user_client
)
# Use the Genie SDK methods available through WorkspaceClient
try:
response = agent.invoke("Your query here")
except Exception as e:
_logger.debug("Skipping Genie due to no permissions")
from databricks.sdk import WorkspaceClient
from databricks_ai_bridge import ModelServingUserCredentials
from databricks_langchain.genie import GenieAgent
# Configure a Databricks SDK WorkspaceClient to use on behalf of end
# user authentication
user_client = WorkspaceClient(credentials_strategy=ModelServingUserCredentials())
genie_agent = GenieAgent(
genie_space_id="<genie_space_id>",
genie_agent_name="Genie",
description="Genie_description",
client=user_client, # Specify the user client here
)
予測関数でエージェントを初期化します
ユーザーのIDはクエリー時にのみ判明するため、OBOリソースにはpredictまたはpredict_stream内でアクセスする必要があり、エージェントの__init__メソッド内では行いません。これにより、呼び出し間でリソースが分離されます。
from mlflow.pyfunc import ResponsesAgent
class OBOResponsesAgent(ResponsesAgent):
def initialize_agent():
user_client = WorkspaceClient(
credentials_strategy=ModelServingUserCredentials()
)
system_authorized_client = WorkspaceClient()
### Use the clients above to access resources with either system or user authentication
def predict(
self, request
) -> ResponsesAgentResponse:
agent = initialize_agent() # Initialize the Agent in Predict
agent.predict(request)
...
エージェントをログに記録する際に、REST APIスコープを宣言します。
OBOエージェントをデプロイ用にログに記録する際は、エージェントがユーザーの代理で呼び出すDatabricks REST APIスコープをリストする必要があります。これにより、エージェントが最小権限の原則に従うことが保証されます。トークンはエージェントが必要とするAPIsのみに制限され、不正なアクションやトークンの誤用の可能性が減少します。
Model Serving Endpoint では、上記に記載されているOBO でサポートされているリソースに対応するスコープのみを使用できます。
ユーザー代理認証を有効にするには、MLflow AuthPolicy をlog_model()に渡します:
import mlflow
from mlflow.models.auth_policy import AuthPolicy, SystemAuthPolicy, UserAuthPolicy
from mlflow.models.resources import DatabricksServingEndpoint
# System policy: resources accessed with system credentials
system_policy = SystemAuthPolicy(
resources=[DatabricksServingEndpoint(endpoint_name="my_endpoint")]
)
# User policy: API scopes for OBO access
user_policy = UserAuthPolicy(api_scopes=[
"model-serving",
"ai-search"
])
# Log the agent with both policies
with mlflow.start_run():
mlflow.pyfunc.log_model(
name="agent",
python_model="agent.py",
auth_policy=AuthPolicy(
system_auth_policy=system_policy,
user_auth_policy=user_policy
)
)
OpenAIクライアントのOBO認証
OpenAIクライアントを使用するエージェントの場合、デプロイ時にDatabricks SDKを使用して自動的に認証してください。Databricks SDKには、認証が自動的に構成されたOpenAIクライアントを構築するためのラッパーがあります。get_open_ai_client()。
% pip install databricks-sdk[openai]
from databricks.sdk import WorkspaceClient
def openai_client(self):
w = WorkspaceClient()
return w.serving_endpoints.get_open_ai_client()
次に、デプロイ時に自動的に認証するように、resourcesでModel Serving Endpointを指定します。
OBO のセキュリティに関する考慮事項
エージェントを使用したユーザー代理認証を有効にする前に、以下のセキュリティ上の考慮事項をご確認ください。
拡張されたリソースアクセス :エージェントはユーザーの代理として機密リソースにアクセスできます。スコープはAPIsを制限しますが、Endpointはエージェントが明示的に要求するよりも多くのアクションを許可する可能性があります。例えば、model-serving APIスコープは、ユーザーの代理としてサービングEndpointを実行する権限をエージェントに付与します。ただし、サービングendpointは、元のエージェントが使用を許可されていない追加のAPIスコープにアクセスできます。
OBOのノートブックの例
次のノートブックでは、ユーザー代理承認を使用して AI Search でエージェントを作成する方法を説明します。
AI Searchによるユーザー代理認証
以下のノートブックでは、ユーザー代理認可を使用して SQLウェアハウス での SQL 実行をサポートするエージェントを作成する方法を示します。これにより、エージェントはユーザー資格情報を使用して Unity Catalog 関数を安全に呼び出すことができます。
これは現在、OBO を使用して UC 関数を実行する推奨される方法です。OBO を使用したServerless Spark 実行はまだサポートされていないためです。
SQL実行によるユーザー代理認証
手動認証
手動認証により、エージェントのデプロイ中に資格情報を明示的に指定できます。このメソッドは最も柔軟性がありますが、より多くのセットアップと継続的な資格情報管理が必要です。このメソッドは次の場合に使用します:
- 依存リソースは自動認証パススルーをサポートしていません。
- エージェントは、エージェントデプロイヤーの資格情報以外の資格情報を使用する必要があります。
- エージェントは、Databricks外の外部リソースまたはAPIsにアクセスします。
- デプロイされたエージェントは、プロンプト レジストリにアクセスします。
セキュリティ環境変数をオーバーライドすると、エージェントが依存する他のリソースに対する自動パススルーが無効になります。
OAuth認証 (推奨)
OAuth は、Service Principal 向けに、セキュアなトークンベース認証と自動トークン更新機能を備えているため、手動認証に推奨されるアプローチです:
-
Service Principalに、エージェントがアクセスできるすべてのDatabricksリソースへの権限を付与しますDatabricksリソースにアクセスするための特権。プロンプトレジストリにアクセスするには、プロンプトを保存するためのUnity Catalogスキーマで
CREATE FUNCTION、EXECUTE、およびMANAGEの権限を付与します。 -
Databricks シークレットを作成して、OAuth 資格情報に使用します。
-
エージェントコードでOAuth認証情報を構成します。
Pythonimport os
# Configure OAuth authentication for Prompt Registry access
# Replace with actual secret scope and key names
secret_scope_name = "your-secret-scope"
client_id_key = "oauth-client-id"
client_secret_key = "oauth-client-secret"
os.environ["DATABRICKS_HOST"] = "https://<your-workspace-url>"
os.environ["DATABRICKS_CLIENT_ID"] = dbutils.secrets.get(scope=secret_scope_name, key=client_id_key)
os.environ["DATABRICKS_CLIENT_SECRET"] = dbutils.secrets.get(scope=secret_scope_name, key=client_secret_key) -
ワークスペースに接続するためのシークレット:
Pythonw = WorkspaceClient(
host=os.environ["DATABRICKS_HOST"],
client_id=os.environ["DATABRICKS_CLIENT_ID"],
client_secret = os.environ["DATABRICKS_CLIENT_SECRET"]
) -
agents.deploy()を使用してデプロイする場合、OAuth資格情報を環境変数として組み込みます:Pythonagents.deploy(
UC_MODEL_NAME,
uc_registered_model_info.version,
environment_vars={
"DATABRICKS_HOST": "https://<your-workspace-url>",
"DATABRICKS_CLIENT_ID": f"{secrets/{secret_scope_name}/{client_id_key}}",
"DATABRICKS_CLIENT_SECRET": f"{secrets/{secret_scope_name}/{client_secret_key}}"
},
)
PAT認証
個人用アクセストークン (PAT) 認証は、開発環境とテスト環境でよりシンプルなセットアップを提供しますが、手動での資格情報管理がより多く必要になります。
-
Get a PAT using a Service Principal or personal アカウント:
Service Principal (セキュリティ上の理由から推奨) :
- Service Principalを作成する。
- Service Principalに、エージェントがアクセスできるすべてのDatabricksリソースへの権限を付与しますDatabricksリソースにアクセスするための特権。プロンプトレジストリにアクセスするには、プロンプトの保存に使用されるUnity Catalogスキーマに
CREATE FUNCTION、EXECUTE、およびMANAGEの権限を付与します。 - Service Principal の PAT を作成する。
個人アカウント:
- 個人用アカウントのPATを作成します。
-
PAT用のDatabricksシークレットを作成することで、PATを安全に保存します。
-
エージェントコードでPAT認証を設定します:
Pythonimport os
# Configure PAT authentication for Prompt Registry access
# Replace with your actual secret scope and key names
secret_scope_name = "your-secret-scope"
secret_key_name = "your-pat-key"
os.environ["DATABRICKS_HOST"] = "https://<your-workspace-url>"
os.environ["DATABRICKS_TOKEN"] = dbutils.secrets.get(scope=secret_scope_name, key=secret_key_name)
# Validate configuration
assert os.environ["DATABRICKS_HOST"], "DATABRICKS_HOST must be set"
assert os.environ["DATABRICKS_TOKEN"], "DATABRICKS_TOKEN must be set" -
agents.deploy()を使用してエージェントをデプロイする際、PAT を環境変数として含めてください:Pythonagents.deploy(
UC_MODEL_NAME,
uc_registered_model_info.version,
environment_vars={
"DATABRICKS_HOST": "https://<your-workspace-url>",
"DATABRICKS_TOKEN": f"{secrets/{secret_scope_name}/{secret_key_name}}"
},
)