セルフホスト版 Langfuse を Identity-Aware Proxy で保護した際の API アクセス方法
Langfuse は、LLM アプリケーションの監視・評価を支援するオープンソースの LLMOps プラットフォームです。
本稿では、Langfuse を公式 Google Cloud テンプレートでデプロイし、Identity-Aware Proxy (IAP) で保護する際に生じる API アクセスの課題とその解決策について解説します。
Langfuse 自体の詳細については、多くの優れた記事が存在するため、ここでは割愛します。
Langfuse の Google Cloud デプロイと IAP による保護
Langfuse は公式に Google Cloud へのデプロイテンプレートを提供しており、容易に GKE 上でセルフホスティングを開始できます(Google Cloud 以外にも Azure や AWS のテンプレートもあります)。
しかし、このテンプレートをデフォルト設定のままデプロイすると、Langfuse のサインイン・サインアップ画面がインターネットに公開されてしまいます。
これを簡易に防ぐには、Google Cloud の Identity-Aware Proxy (IAP) の利用が考えられます。
IAP を利用した保護方法については、以下の記事などが参考になります。
IAP 保護後の API アクセスの課題
IAP で Langfuse へのアクセスを保護すると、意図した通り Web ブラウザからの GUI アクセスは制御されますが、同時に API へのアクセスも IAP によって保護されます。
これにより、外部のアプリケーションやスクリプトから Langfuse API を直接呼び出す際に、追加の認証処理が必要になります。
httpx_client で IAP 認証情報を付与する
Langfuse SDK には、HTTP クライアントを渡すことができ、このクライアントをカスタマイズすることで IAP の認証情報をリクエストに含めることができます。
具体的には、IAP が要求する Proxy-Authorization
ヘッダーに、Google の ID トークンを設定します。
以下に、httpx
と google-auth
ライブラリを使用して、IAP で保護された API にアクセスするための Python コード例を示します。
import os
import httpx
from google.auth.transport.requests import Request
from google.oauth2 import id_token
from langfuse import Langfuse
# IAP用のIDトークンを取得
try:
print("Fetching ID token for IAP...")
token = id_token.fetch_id_token(Request(), os.getenv("IAP_CLIENT_ID"))
print("Successfully fetched ID token.")
except Exception as e:
print(f"Failed to fetch ID token: {e}")
raise
# IAP認証情報を含むヘッダーを作成
headers = {
"Proxy-Authorization": f"Bearer {token}",
"Content-Type": "application/json",
}
# カスタムヘッダーとタイムアウトを設定したhttpxクライアントを作成
configured_httpx_client = httpx.Client(
headers=headers,
timeout=20.0,
)
# Langfuseクライアントを初期化
langfuse_client = Langfuse(
secret_key=os.getenv("LANGFUSE_SECRET_KEY"),
public_key=os.getenv("LANGFUSE_PUBLIC_KEY"),
host=os.getenv("LANGFUSE_HOST"),
httpx_client=configured_httpx_client,
)
# 接続確認
try:
auth_check_result = langfuse_client.auth_check()
print(f"Langfuse auth_check result: {auth_check_result}")
except Exception as e:
print(f"Langfuse auth_check failed: {e}")
設定値について
-
IAP_CLIENT_ID
: Google Cloud コンソールの Identity-Aware Proxy 設定画面で確認できる、IAP で保護されたリソースの OAuth 2.0 クライアント ID です。 -
LANGFUSE_SECRET_KEY
、LANGFUSE_PUBLIC_KEY
: Langfuseのプロジェクト設定画面で取得できるAPIキーです。 -
LANGFUSE_HOST
: デプロイした Langfuse インスタンスのホスト名です(例:https://langfuse.yourdomain.com
)。 -
GOOGLE_APPLICATION_CREDENTIALS
:fetch_id_token()
が ID トークンを取得するために使用するサービスアカウントの認証情報ファイル(JSON キー)へのパスを指定します。- ここで指定する認証情報は、
gcloud auth application-default login
等で取得したユーザーアカウントの認証情報ではなく、サービスアカウントの認証情報である必要があります。 - 公式ドキュメント: アプリケーションのデフォルト認証情報の仕組み
- ここで指定する認証情報は、
動作確認
上記のコードを実行し、langfuse_client.auth_check()
が True
を返せば、IAP で保護された API への認証が成功しています。
Fetching ID token for IAP...
Successfully fetched ID token.
Langfuse auth_check result: True
まとめ
Langfuse を Google Cloud にデプロイし IAP で保護する場合、API アクセスにも IAP の認証が必要になります。
Langfuse SDK の HTTP クライアントをカスタマイズし、Proxy-Authorization
ヘッダーに Google の ID トークンを付与することで解決できます。
Discussion