🔒

セルフホスト版 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 トークンを設定します。

以下に、httpxgoogle-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_KEYLANGFUSE_PUBLIC_KEY: Langfuseのプロジェクト設定画面で取得できるAPIキーです。
  • LANGFUSE_HOST: デプロイした Langfuse インスタンスのホスト名です(例: https://langfuse.yourdomain.com)。
  • GOOGLE_APPLICATION_CREDENTIALS: fetch_id_token() が ID トークンを取得するために使用するサービスアカウントの認証情報ファイル(JSON キー)へのパスを指定します。

動作確認

上記のコードを実行し、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