2026年6月25日

AIエージェントを安全に分離する:Google Cloudの「Agent Platform Sessions」と「IAM Conditions」によるセッション単位のアクセス制御


Content
システム開発部門やマーケティング部門で、社内で共通のAIエージェントの導入を検討する企業が増えています。しかし、実際に運用を開始しようとすると、必ず突き当たるのがセキュリティとガバナンスの壁です。

「ユーザーAが相談した極秘の製品企画データが、同じエージェントを使うユーザーBの会話履歴から漏洩しないか?」「開発者がデバッグする際に、本番環境のすべての顧客データを閲覧できてしまわないか?」といった懸念は、エンタープライズでのAI活用において避けて通れない永遠の課題です。

今回は、Google Cloudが提供する「Gemini Enterprise Agent Platform」のセッション管理機能と、IAM Conditions(条件付きアクセス制御)」を組み合わせることで、AIエージェントの会話履歴を安全かつスマートに分離する方法について、具体的なシナリオを交えながら実機検証コードとともに徹底的に解説します!

Agent Platform Sessions の基本コンセプト

そもそも、Agent Platformにおける「セッション(Session)」とは何でしょうか?公式ドキュメントの「Agent Platform セッションの概要」によると、これは「ユーザーとエージェントシステム間の一連の会話の流れ」を管理する単位です。会話コンテキストと長期記憶を分離・維持するために、以下の4つのコアコンセプトが定義されています。

  • セッション (Session):メッセージやアクション(イベント)の時系列を表すスレッドです。
  • イベント (Event):会話の履歴に加え、AIが実行した関数呼び出し(ツール呼び出し)やその結果などのアクションを記録します。
  • 状態 (State):現在のセッション中のみで保持される一時データです。
  • 記憶 (Memory):特定のユーザーの複数セッション間で共有できる長期的な情報です。セッションをまたぐ継続性を確保するために「Memory Bank」という別機能と連携して動作します。

セッションは通常、デフォルトで365日の有効期間(TTL)を持ちますが、作成時に任意の有効期限(expire_time)や有効期間(秒数)を指定して自動的にクリーンアップすることが可能です。データライフサイクル管理が非常に楽になる仕組みとなっています。

セッションに応じた権限制御 (IAM Conditions) のメリット

デフォルトでは、セッションの閲覧や編集といった権限は「プロジェクト単位」で設定されます。しかし、IAM Conditions(条件付きアクセス制御)を導入することで、セッションの「ユーザーID(userId)」に基づいてアクセス権を動的に制御できるようになります。この機能がもたらすビジネス価値は非常に強力です。

メリット ビジネス価値
1. マルチテナント・ユーザー間のアクセス制御 同じエージェントエンジン(インフラ)を利用しながら、テナントやユーザーごとにセッションへのアクセス範囲を制御できます。IAM Conditions で sessionUserId に基づく条件を設定することで、他部署や他顧客の会話履歴への不用意なアクセスを抑制し、共通基盤を利用しながらデータ分離を実現しやすくなります。
2. デバッグ用セッションの最小権限制御 開発者やQA担当者に対し、デバッグ用のセッションID(接頭辞 test- など)のみ閲覧権限を付与することができます。これにより、本番環境の顧客の機密データを含むセッション履歴を一切露出させることなく、安全に開発・検証を行えます。
3. 認可ロジックのアウトソーシングによる開発効率化 自前で「このセッションはログイン中のユーザーのものか?」という判定ロジックをデータベースの検索と組み合わせて実装する必要がなくなります。Google Cloud IAMがネイティブにアクセス制限を処理するため、バックエンドのセキュリティバグを排除し、開発スピードを大幅に向上させます。

セッション分離によるマルチテナント保護の構造イメージ

同一のAIエージェント基盤であっても、IAM ConditionsによってセッションのuserIdを判定することで、アクセスできる会話履歴を動的に制御できます。これにより、共通基盤の利便性を維持しながら、ユーザーや部署ごとの情報分離を実現できます。

IAM Conditionsによるセッションアクセス制御のやり方

では、具体的にどのようにセッションのアクセス権を設定するのでしょうか。

セッションのアクセス制御は、プロジェクトレベルのIAMポリシーバインディングに、Common Expression Language(CEL)を使った条件(Condition)を追加することで実現します。この条件内で、API属性 aiplatform.googleapis.com/sessionUserId を参照します。

つまり、「誰にどのロールを付与するか」だけでなく、「どの userId のセッションに対して、そのロールを有効にするか」を条件として定義できます。


セッション用の専用IAMロール

過剰な権限付与を防ぐため、セッション操作には以下の専用ロールを組み合わせて使用します。

ロール 用途
roles/aiplatform.sessionViewer セッションやイベント情報の取得・一覧表示のみを許可する読み取り専用ロールです。
roles/aiplatform.sessionEditor セッションの作成、更新、削除、およびイベント追加を許可する書き込み用ロールです。
roles/aiplatform.sessionUser 閲覧者と編集者の権限を含む、セッション操作用のフルアクセスロールです。

ここからは、実務で使いやすい3つの条件設定パターンを見ていきます。


パターン①:ユーザーIDが完全一致する場合のみ読み取りを許可する

特定ユーザー、たとえば userA@gmail.com に対して、セッションの userIduserA と完全に一致するセッションのみ閲覧を許可する設定です。

この設定により、同じプロジェクト内に存在する他ユーザーのセッションにはアクセスできません。

{
“members”: [“user:userA@gmail.com”],
“role”: “roles/aiplatform.sessionViewer”,
“condition”: {
“title”: “UserA Session Read Only”,
“expression”: “api.getAttribute(‘aiplatform.googleapis.com/sessionUserId’, ”) == ‘userA'”
}
}

パターン②:テスト用セッションへの書き込みを開発者に許可する

開発者、たとえば developerA@corp.com に対して、userIdtest- で始まるセッションのみ作成・更新を許可する設定です。

対象例は、test-user1test-session123 のような検証用セッションです。本番ユーザーのセッションとは接頭辞で明確に分離します。

前方一致の判定には startsWith() を使用できます。

{
“members”: [“user:developerA@corp.com”],
“role”: “roles/aiplatform.sessionEditor”,
“condition”: {
“title”: “Developer Test Session Write Access”,
“expression”: “api.getAttribute(‘aiplatform.googleapis.com/sessionUserId’, ”).startsWith(‘test-‘)”
}
}

パターン③:許可ユーザーリストに該当する場合のみアクセスを許可する

エンジニアリンググループ、たとえば group:engineering@corp.com に対して、特定の userId のセッションだけにフルアクセスを許可する設定です。

以下の例では、userA または user123 のセッションのみがアクセス対象になります。

CELのin演算子を使うことで、複数の許可対象をシンプルに表現できます。

{
“members”: [“group:engineering@corp.com”],
“role”: “roles/aiplatform.sessionUser”,
“condition”: {
“title”: “Engineering Group Allowed Sessions”,
“expression”: “api.getAttribute(‘aiplatform.googleapis.com/sessionUserId’, ”) in [‘userA’, ‘user123’]”
}
}

ListSessions API利用時の注意点

ListSessions APIそのものは、IAM Conditionsによる動的フィルタリングをサポートしていません。

そのため、ユーザーがプロジェクト内のセッション一覧を取得するAPI、つまり ListSessions を直接呼び出すには、プロジェクトレベルで無条件の sessionViewer などのロールが必要になります。

実運用では、クライアントアプリから ListSessions を直接呼び出させるのではなく、バックエンドのゲートウェイサービスを一枚挟む設計が安全です。

バックエンド側でログインユーザーのIDを確認し、そのユーザー自身の userId に紐づくセッションだけを返却するように、API呼び出しをカプセル化する設計が現実的です。

ADKおよびAPIを利用したセッションの実装

では、AIエージェントのプログラムでこれらのセッションをどのように操作するのかを見てみましょう。

1. Python ADK(Agent Development Kit)での実装

ADKを使用する場合、VertexAiSessionService を用いることで、自動的にGemini Enterprise Agent Platformのセッションサービスと接続されます。

import asyncio
from google import adk
from google.adk import Runner
from google.adk.sessions import VertexAiSessionService
from google.genai import types

# 1. エージェントの定義
root_agent = adk.Agent(
model="gemini-2.0-flash",
name="support_agent",
instruction="あなたは丁寧なカスタマーサポートエージェントです。"
)

# 2. セッションサービスの初期化
session_service = VertexAiSessionService(
project="your-gcp-project-id",
location="us-central1",
agent_engine_id="your-agent-engine-id"
)

# 3. ランナーの設定
runner = Runner(
agent=root_agent,
app_name="customer_support_app",
session_service=session_service
)

async def main():
user_id = "user-abc-999"

# 10日後に自動クリーンアップされるセッションを作成
session = await session_service.create_session(
app_name="customer_support_app",
user_id=user_id,
ttl="864000s"
)

print(f"Session Created. ID: {session.id}")

# エージェントとのやり取りを実行
content = types.Content(
role="user",
parts=[
types.Part(text="こんにちは!注文ステータスを確認したいです。")
]
)

async for event in runner.run_async(
user_id=user_id,
session_id=session.id,
new_message=content
):
if event.is_final_response():
print("Response:", event.content.parts[0].text)

if __name__ == "__main__":
asyncio.run(main())

2. REST APIでのセッション作成

ADKを使わず、APIから直接セッションを作成する場合は、以下のように userId を含めてPOSTリクエストを送信します。

POST https://us-central1-aiplatform.googleapis.com/v1beta1/projects/YOUR_PROJECT_ID/locations/us-central1/reasoningEngines/YOUR_AGENT_ENGINE_ID/sessions

Content-Type: application/json

{
"userId": "user-abc-999"
}

具体的なユースケースシナリオ

このセッション単位のIAM Conditionsを導入すると、実際の業務現場ではどのような効果があるのでしょうか。

ここでは、特に社内ITやヘルプデスク運用で発生しやすい2つのユースケースを例に、セッション単位のアクセス制御がどのように役立つかを整理します。

ユースケース1:社内ポータル問合せAIでの情報アクセス分離

ある企業の情報システム部門が、社内ポータルに「人事・総務・IT問い合わせ対応AI」を共通のAIエージェント基盤として構築したとします。

この場合、同じAIエージェント基盤を使っていても、問い合わせ内容によって扱う情報の機密性は大きく異なります。たとえば、人事関連の問い合わせには、給与、育休、退職、評価、異動など、センシティブな個人情報が含まれる可能性があります。

そこで、セッションのuserIdに部署や用途を表す接頭辞を付けます。人事系の問い合わせであれば hr-、ITサポート系の問い合わせであればit-のように分類します。そのうえで、IAM Conditionsを使い、人事担当者にはhr-で始まるセッションのみ、情シス担当者にはit-で始まるセッションのみアクセスを許可します。

この設計により、AIエージェント基盤を共通化しながら、部署ごとの会話履歴を分離できます。インフラやアプリケーション基盤は共有しつつ、データアクセスだけをセッション単位で制御できる点が大きなメリットです。


ユースケース2:検証セッションと本番機密データの分離

社内ヘルプデスク向けのAIチャットボットで障害が発生した場合、開発者や運用担当者は、ログやセッションイベントを確認して原因を調査する必要があります。

しかし、本番環境のセッションには、社員が入力した一時パスワード、アカウント情報、電話番号、社内システムの利用状況などが含まれる可能性があります。障害調査のためとはいえ、開発者が本番ユーザーの全セッションを自由に閲覧できる状態は望ましくありません。

そこで、再現検証時には、セッションのuserIdにdebug-test-という接頭辞を付与します。そして、開発者には debug-またはtest-で始まるセッションだけを閲覧できるようにIAM Conditionsを設定します。

この設計により、開発者は検証用セッションを使って安全に調査できます。一方で、本番ユーザーの会話履歴にはアクセスできないため、デバッグ効率と情報保護を両立できます。

検証セッションと本番機密データの分離イメージ

検証用のdebug-test-セッションだけを開発者に公開し、本番セッションは保護します。これにより、コンプライアンスを維持しながら、障害調査や品質改善を進めやすくなります。

まとめ

Google Cloudの Agent Platform SessionsIAM Conditions を組み合わせることで、エンタープライズAI開発における最大の課題の一つである「セッション情報のプライバシー・セキュリティ保護」を、最小限の実装コストで解決できます。

認可ロジックをインフラであるGoogle Cloud IAMにアウトソーシングし、「userId」に紐づくCEL条件式を設定するだけで、堅牢なマルチテナント隔離とセキュアな開発デバッグ体制が手に入ります。これから本格的な社内AIエージェント基盤や、外部向けSaaS AIサービスを構築される場合は、ぜひこの強固なセキュリティ設計を取り入れてみてください。

システムサポートでは、Google Cloudのセキュリティ設計やGenerative AI(Gemini)の導入・活用支援を行っております。

セキュアな生成AIプラットフォームの構築に関心がある、または導入にお悩みをお持ちの方は、ぜひお気軽にご相談ください!

Google Cloud 導入・活用支援に関するご相談はこちら

2026年6月25日 AIエージェントを安全に分離する:Google Cloudの「Agent Platform Sessions」と「IAM Conditions」によるセッション単位のアクセス制御

Category Google Cloud

ご意見・ご相談・料金のお見積もりなど、
お気軽にお問い合わせください。

お問い合わせはこちら