Cloud Run で ADK エージェントをデプロイ、管理、オブザーバビングする

1. はじめに

このチュートリアルでは、Google Cloud Run で Agent Development Kit(ADK)を使用して構築された強力なエージェントをデプロイ、管理、モニタリングする方法について説明します。ADK を使用すると、複雑なマルチエージェント ワークフローに対応できるエージェントを作成できます。フルマネージド サーバーレス プラットフォームである Cloud Run を活用することで、基盤となるインフラストラクチャを気にすることなく、エージェントをスケーラブルなコンテナ化アプリケーションとしてデプロイできます。この強力な組み合わせにより、Google Cloud の堅牢でスケーラブルな環境のメリットを享受しながら、エージェントのコアロジックに集中できます。

このチュートリアルでは、ADK と Cloud Run のシームレスな統合について説明します。エージェントのデプロイ方法を学習し、本番環境のような設定でアプリケーションを管理する際の実際的な側面について説明します。トラフィックを管理してエージェントの新しいバージョンを安全にロールアウトする方法について説明します。これにより、完全なリリース前に一部のユーザーで新機能をテストできます。

さらに、エージェントのパフォーマンスをモニタリングする実践的な経験を積むことができます。ロードテストを実施して、Cloud Run の自動スケーリング機能を実際に確認することで、実際のシナリオをシミュレートします。エージェントの動作とパフォーマンスに関する詳細な分析情報を得るために、Cloud Trace を使用してトレースを有効にします。これにより、リクエストがエージェントを通過する際の詳細なエンドツーエンドのビューが提供され、パフォーマンスのボトルネックを特定して対処できます。このチュートリアルを終了すると、Cloud Run で ADK を活用したエージェントを効果的にデプロイ、管理、モニタリングする方法を包括的に理解できるようになります。

この Codelab では、次の手順でアプローチします。

  1. ADK エージェント データベース セッション サービスで使用する PostgreSQL データベースを CloudSQL に作成する
  2. 基本的な ADK エージェントを設定する
  3. ADK ランナーで使用されるデータベース セッション サービスを設定
  4. エージェントを Cloud Run に初回デプロイする
  5. 負荷テストと Cloud Run 自動スケーリングの検査
  6. 新しいエージェント リビジョンをデプロイし、新しいリビジョンへのトラフィックを徐々に増やす
  7. クラウド トレースを設定し、エージェントの実行トレースを検査する

アーキテクチャの概要

20d503f01eaadfd.jpeg

前提条件

  • Python の操作に慣れている
  • HTTP サービスを使用した基本的なフルスタック アーキテクチャの理解

学習内容

  • ADK の構造とローカル ユーティリティ
  • データベース セッション サービスで ADK エージェントを設定する
  • Database セッション サービスで使用される CloudSQL で PostgreSQL を設定する
  • Dockerfile を使用してアプリケーションを Cloud Run にデプロイし、初期環境変数を設定する
  • ロードテストで Cloud Run の自動スケーリングを構成してテストする
  • Cloud Run を使用した段階的リリースの戦略
  • Cloud Trace への ADK エージェントのトレースを設定する

必要なもの

  • Chrome ウェブブラウザ
  • Gmail アカウント
  • 課金が有効になっている Cloud プロジェクト

この Codelab は、初心者を含むあらゆるレベルのデベロッパーを対象としており、サンプル アプリケーションで Python を使用します。ただし、ここで説明するコンセプトを理解するために Python の知識は必要ありません。

2. 🚀 ワークショップの開発環境のセットアップを準備しています

ステップ 1: Cloud コンソールでアクティブなプロジェクトを選択する

Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します(コンソールの左上部分を参照)。

9a0e28d3a550a989.png

クリックすると、次の例のように、すべてのプロジェクトのリストが表示されます。

14e76d7abc8aeaba.png

赤いボックスで示されている値はプロジェクト ID であり、この値はチュートリアル全体で使用されます。

Cloud プロジェクトに対して課金が有効になっていることを確認します。これを確認するには、左上のバーにあるハンバーガー アイコン ☰ をクリックしてナビゲーション メニューを表示し、[お支払い] メニューを見つけます。

db07810b26fc61d6.png

[お支払い / 概要] タイトル(クラウド コンソールの左上部分)に [Google Cloud Platform Trial Billing Account] が表示されている場合は、このチュートリアルでプロジェクトを使用する準備が整っています。そうでない場合は、このチュートリアルの最初に戻って、トライアルの課金アカウントを利用します。

45539d4ac57dd995.png

ステップ 2: Cloud SQL データベースを準備する

ADK エージェントが後で使用するデータベースが必要です。Cloud SQL に PostgreSQL データベースを作成しましょう。まず、Cloud コンソールの上部にある検索バーに移動し、「cloud sql」と入力します。[Cloud SQL] プロダクトをクリックします。

39dbcf39661a8b65.png

次に、新しいデータベース インスタンスを作成する必要があります。[インスタンスを作成] をクリックして、[PostgreSQL] を選択します。

b004e6ead3213818.png

2fd64e7f862ebbc2.png

新しいプロジェクトから始める場合は、Compute Engine API を有効にする必要がある場合もあります。このプロンプトが表示されたら、[API を有効にする] をクリックします。

509305746061b60b.png

次に、データベースの仕様を選択します。サンドボックス エディションのプリセットで Enterprise エディションを選択します。

f1a642e4ecd3295.png

その後、インスタンス名とユーザー postgres のデフォルト パスワードをここで設定します。この設定には任意の認証情報を使用できますが、このチュートリアルでは、インスタンス名に「adk-deployment」、パスワードに「ADK-deployment123」を使用します。

4f1dfe940451606d.png

このチュートリアルでは、単一ゾーンの us-central1 を使用します。[インスタンスを作成] ボタンをクリックして、データベースの作成を完了し、必要な設定をすべて完了します。

6dceef8db8c1c7aa.png

完了を待機している間に、次のセクションに進みます。

ステップ 3: Cloud Shell について理解する

チュートリアルのほとんどの部分で Cloud Shell を使用します。Google Cloud コンソールの上部にある [Cloud Shell をアクティブにする] をクリックします。承認を求めるメッセージが表示されたら、[承認] をクリックします。

26f20e837ff06119.png

79b06cc89a99f840.png

Cloud Shell に接続したら、シェル(またはターミナル)がアカウントで認証済みかどうかを確認する必要があります。

gcloud auth list

次の出力例のように、個人の Gmail が表示されていれば問題ありません。

Credentialed Accounts

ACTIVE: *
ACCOUNT: alvinprayuda@gmail.com

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

表示されない場合は、ブラウザを更新して、プロンプトが表示されたら [承認] をクリックしてください(接続の問題により中断されることがあります)。

次に、シェルがすでに正しい プロジェクト ID に構成されているかどうかを確認する必要があります。ターミナルの $アイコンの前に()内の値が表示されている場合(下のスクリーンショットでは値は "adk-cloudrun-deployment-476504")、この値はアクティブなシェル セッション用に構成されたプロジェクトを示しています。

7695eb78acb3cacb.png

表示されたがすでに正しい場合は、次のコマンドスキップできます。正しくない場合や欠落している場合は、次のコマンドを実行します。

gcloud config set project <YOUR_PROJECT_ID>

次に、GitHub からこの Codelab のテンプレート作業ディレクトリのクローンを作成します。次のコマンドを実行します。作業ディレクトリは deploy_and_manage_adk ディレクトリに作成されます。

git clone https://github.com/alphinside/deploy-and-manage-adk-service.git deploy_and_manage_adk

手順 4: Cloud Shell エディタと設定アプリケーションの作業ディレクトリについて理解する

これで、コーディング作業を行うようにコードエディタを設定できます。これには Cloud Shell エディタを使用します。

[エディタを開く] ボタンをクリックします。Cloud Shell エディタ 168eacea651b086c.png が開きます。

次に、Cloud Shell エディタの上部のセクションに移動し、[File->Open Folder] をクリックして、ユーザー名ディレクトリを見つけ、deploy_and_manage_adk ディレクトリを見つけて、[OK] ボタンをクリックします。これにより、選択したディレクトリがメインの作業ディレクトリになります。この例では、ユーザー名は alvinprayuda であるため、ディレクトリ パスは次のようになります。

8eb3f593141dbcbf.png

ea96d0447c4160a2.png

Cloud Shell エディタの作業ディレクトリは次のようになります(deploy_and_manage_adk 内)。

612d7958881293cc.png

次に、エディタのターミナルを開きます。メニューバーの [Terminal -> New Terminal] をクリックするか、Ctrl + Shift + C を使用して、ブラウザの下部にターミナル ウィンドウを開きます。

aa04a318f1fc485f.png

現在アクティブなターミナルは、deploy_and_manage_adk 作業ディレクトリ内にある必要があります。この Codelab では Python 3.12 を使用し、uv Python プロジェクト マネージャーを使用して、Python のバージョンと仮想環境の作成と管理の必要性を簡素化します。この uv パッケージは、Cloud Shell にプリインストールされています。

次のコマンドを実行して、.venv ディレクトリの仮想環境に必要な依存関係をインストールします。

uv sync --frozen

次に、次のコマンドを使用して、必要な API を有効にする必要があります。この処理にはしばらく時間がかかることがあります。

gcloud services enable aiplatform.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       sqladmin.googleapis.com

コマンドが正常に実行されると、次のようなメッセージが表示されます。

Operation "operations/..." finished successfully.

次に、このプロジェクトの構成ファイルを設定する必要があります。

.env.example ファイルの名前を .env に変更します。

cp .env.example .env

.env ファイルを開き、GOOGLE_CLOUD_PROJECT の値を project-id に更新します。

# .env

# Google Cloud and Vertex AI configuration
GOOGLE_CLOUD_PROJECT=your-project-id
GOOGLE_CLOUD_LOCATION=global
GOOGLE_GENAI_USE_VERTEXAI=True

# Database connection for session service
# DB_CONNECTION_NAME=your-db-connection-name

この Codelab では、GOOGLE_CLOUD_LOCATIONGOOGLE_GENAI_USE_VERTEXAI. の事前構成済みの値を使用します。今のところ、DB_CONNECTION_NAME はコメントアウトしたままにします。

次のステップに進み、エージェントのロジックを調べてデプロイします。

3. 🚀 ADK と Gemini 2.5 を使用して天気エージェントを構築する

ADK のディレクトリ構造の概要

まず、ADK の機能とエージェントの構築方法について説明します。ADK の完全なドキュメントは、こちらの URL からアクセスできます。ADK では、CLI コマンドの実行内で多くのユーティリティを利用できます。以下に例を示します。

  • エージェント ディレクトリ構造を設定する
  • CLI の入出力でインタラクションをすばやく試す
  • ローカル開発 UI ウェブ インターフェースをすばやく設定する

次に、weather_agent ディレクトリでエージェントの構造を確認します。

weather_agent/
├── __init__.py
├── agent.py
└── tool.py

init.pyagent.py を調べると、次のコードが表示されます。

# __init__.py

from weather_agent.agent import root_agent

__all__ = ["root_agent"]
# agent.py


import os
from pathlib import Path

import google.auth
from dotenv import load_dotenv
from google.adk.agents import Agent
from weather_agent.tool import get_weather

# Load environment variables from .env file in root directory
root_dir = Path(__file__).parent.parent
dotenv_path = root_dir / ".env"
load_dotenv(dotenv_path=dotenv_path)


# Use default project from credentials if not in .env
_, project_id = google.auth.default()
os.environ.setdefault("GOOGLE_CLOUD_PROJECT", project_id)
os.environ.setdefault("GOOGLE_CLOUD_LOCATION", "global")
os.environ.setdefault("GOOGLE_GENAI_USE_VERTEXAI", "True")

root_agent = Agent(
    name="weather_agent",
    model="gemini-2.5-flash",
    instruction="""
You are a helpful AI assistant designed to provide accurate and useful information.
""",
    tools=[get_weather],
)

ADK コードの説明

このスクリプトには、次のものを初期化するエージェントの初期化が含まれています。

  • 使用するモデルを gemini-2.5-flash に設定する
  • 天気エージェントとしてエージェント機能をサポートするツール get_weather を提供

ウェブ UI を実行する

これで、エージェントを操作して、その動作をローカルで検査できるようになりました。ADK を使用すると、開発ウェブ UI を使用して、インタラクション中に何が起こっているかを操作して確認できます。次のコマンドを実行して、ローカル開発 UI サーバーを起動します。

uv run adk web --port 8080

次の例のような出力が生成されます。これは、ウェブ インターフェースにすでにアクセスできることを意味します。

INFO:     Started server process [xxxx]
INFO:     Waiting for application startup.

+-----------------------------------------------------------------------------+
| ADK Web Server started                                                      |
|                                                                             |
| For local testing, access at http://localhost:8080.                         |
+-----------------------------------------------------------------------------+

INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)

確認するには、Cloud Shell エディタの上部にある [ウェブでプレビュー] ボタンをクリックし、[ポート 8080 でプレビュー] を選択します。

edc73e971b9fc60c.png

次のウェブページが表示されます。左上のプルダウン ボタン(この例では weather_agent)で利用可能なエージェントを選択し、ボットとやり取りできます。左側のウィンドウには、エージェントの実行時のログの詳細に関する多くの情報が表示されます。

25999e0b71c3989.png

では、操作してみましょう。左側のバーでは、各入力のトレースを検査できます。これにより、エージェントが最終的な回答を生成するまでに各アクションに要した時間を把握できます。

b4ba38adf419017e.png

これは ADK に組み込まれているオブザーバビリティ機能の 1 つで、現在はローカルで検査しています。後で、これが Cloud Tracing に統合され、すべてのリクエストのトレースが一元化される方法について説明します。

4. 🚀 Cloud Run へのデプロイ

次に、このエージェント サービスを Cloud Run にデプロイします。このデモでは、このサービスは他のユーザーがアクセスできるパブリック サービスとして公開されます。ただし、安全ではないため、ベスト プラクティスではありません

20d503f01eaadfd.jpeg

この Codelab では、Dockerfile を使用してエージェントを Cloud Run にデプロイします。この時点で、アプリケーションを Cloud Run にデプロイするために必要なファイル(Dockerfileserver.py)はすべて揃っています。これについては後ほど詳しく説明します。

まず、サービスをデプロイします。Cloud Shell ターミナルに移動し、現在のプロジェクトがアクティブなプロジェクトに構成されていることを確認します。構成されていない場合は、gcloud configure コマンドを使用してプロジェクト ID を設定します。

gcloud config set project [PROJECT_ID]

次に、.env ファイルを再度開きます。DB_CONNECTION_NAME 変数のコメントを解除して、正しい値を入力する必要があります。

# Google Cloud and Vertex AI configuration
GOOGLE_CLOUD_PROJECT=your-project-id
GOOGLE_CLOUD_LOCATION=global
GOOGLE_GENAI_USE_VERTEXAI=True

# Database connection for session service
DB_CONNECTION_NAME=your-db-connection-name

DB_CONNECTION_NAME の値を取得するには、Cloud SQL に再度移動して、作成したインスタンスをクリックします。Cloud コンソールの上部にある検索バーに移動し、「cloud sql」と入力します。[Cloud SQL] プロダクトをクリックします。

39dbcf39661a8b65.png

以前に作成したインスタンスが表示されるので、それをクリックします。

8faf706622293e9a.png

インスタンス ページで、[このインスタンスに接続] セクションまでスクロールすると、接続名をコピーして DB_CONNECTION_NAME の値を置き換えることができます。

d669fc62ae37ab7d.png

その後、.env ファイルを開き、DB_CONNECTION_NAME 変数を変更します。env ファイルは次の例のようになります。

# Google Cloud and Vertex AI configuration
GOOGLE_CLOUD_PROJECT=your-project-id
GOOGLE_CLOUD_LOCATION=global
GOOGLE_GENAI_USE_VERTEXAI=True

# Database connection for session service
DB_CONNECTION_NAME=your-project-id:your-location:your-instance-name

その後、デプロイ スクリプトを実行します。

bash deploy_to_cloudrun.sh

Docker リポジトリのアーティファクト レジストリの作成を確認するよう求められたら、Y と答えます。

デプロイ プロセスを待っている間に、deploy_to_cloudrun.sh を見てみましょう。

#!/bin/bash

# Load environment variables from .env file
if [ -f .env ]; then
    export $(cat .env | grep -v '^#' | xargs)
else
    echo "Error: .env file not found"
    exit 1
fi

# Validate required variables
required_vars=("GOOGLE_CLOUD_PROJECT" "DB_CONNECTION_NAME")
for var in "${required_vars[@]}"; do
    if [ -z "${!var}" ]; then
        echo "Error: $var is not set in .env file"
        exit 1
    fi
done

gcloud run deploy weather-agent \
    --source . \
    --port 8080 \
    --project ${GOOGLE_CLOUD_PROJECT} \
    --allow-unauthenticated \
    --add-cloudsql-instances ${DB_CONNECTION_NAME} \
    --update-env-vars SESSION_SERVICE_URI="postgresql+pg8000://postgres:ADK-deployment123@postgres/?unix_sock=/cloudsql/${DB_CONNECTION_NAME}/.s.PGSQL.5432",GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT} \
    --region us-central1 \
    --min 1 \
    --memory 1G \
    --concurrency 10

このスクリプトは、.env 変数を読み込んでから、デプロイ コマンドを実行します。

よく見ると、サービスをデプロイする場合に必要なすべての処理(イメージのビルド、レジストリへの push、サービスのデプロイ、IAM ポリシーの設定、リビジョンの作成、トラフィックのルーティングなど)は、1 つの gcloud run deploy コマンドで実行できます。この例では、Dockerfile がすでに提供されているため、このコマンドはそれを使用してアプリをビルドします。

デプロイが完了すると、次のようなリンクが表示されます。

https://weather-agent-*******.us-central1.run.app

この URL を取得したら、シークレット ウィンドウまたはモバイル デバイスからアプリケーションを使用して、エージェントの Dev UI にアクセスできます。デプロイの完了を待つ間に、次のセクションでデプロイしたばかりの詳細なサービスを確認しましょう。

5. 💡 Dockerfile とバックエンド サーバー スクリプト

エージェントをサービスとしてアクセスできるようにするため、エージェントを FastAPI アプリ内にラップし、Dockerfile コマンドで実行します。以下は Dockerfile の内容です。

FROM python:3.12-slim

RUN pip install --no-cache-dir uv==0.7.13

WORKDIR /app

COPY . .

RUN uv sync --frozen

EXPOSE 8080

CMD ["uv", "run", "uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8080"]

ここでは、エージェントをサポートするために必要なサービスを構成できます。たとえば、本番環境用に SessionMemoryArtifact サービスを準備します。使用する server.py のコードは次のとおりです。

import os

from dotenv import load_dotenv
from fastapi import FastAPI
from google.adk.cli.fast_api import get_fast_api_app
from pydantic import BaseModel
from typing import Literal
from google.cloud import logging as google_cloud_logging


# Load environment variables from .env file
load_dotenv()

logging_client = google_cloud_logging.Client()
logger = logging_client.logger(__name__)

AGENT_DIR = os.path.dirname(os.path.abspath(__file__))

# Get session service URI from environment variables
session_uri = os.getenv("SESSION_SERVICE_URI", None)

# Prepare arguments for get_fast_api_app
app_args = {"agents_dir": AGENT_DIR, "web": True, "trace_to_cloud": True}

# Only include session_service_uri if it's provided
if session_uri:
    app_args["session_service_uri"] = session_uri
else:
    logger.log_text(
        "SESSION_SERVICE_URI not provided. Using in-memory session service instead. "
        "All sessions will be lost when the server restarts.",
        severity="WARNING",
    )

# Create FastAPI app with appropriate arguments
app: FastAPI = get_fast_api_app(**app_args)

app.title = "weather-agent"
app.description = "API for interacting with the Agent weather-agent"


class Feedback(BaseModel):
    """Represents feedback for a conversation."""

    score: int | float
    text: str | None = ""
    invocation_id: str
    log_type: Literal["feedback"] = "feedback"
    service_name: Literal["weather-agent"] = "weather-agent"
    user_id: str = ""


# Example if you want to add your custom endpoint
@app.post("/feedback")
def collect_feedback(feedback: Feedback) -> dict[str, str]:
    """Collect and log feedback.

    Args:
        feedback: The feedback data to log

    Returns:
        Success message
    """
    logger.log_struct(feedback.model_dump(), severity="INFO")
    return {"status": "success"}


# Main execution
if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=8080)

サーバーコードの説明

server.py スクリプトで定義されている内容は次のとおりです。

  1. get_fast_api_app メソッドを使用して、エージェントを FastAPI アプリに変換します。これにより、ウェブ開発 UI で使用されるルート定義を継承できます。
  2. get_fast_api_app メソッドにキーワード引数を追加して、必要なセッション、メモリ、アーティファクト サービスを構成します。このチュートリアルでは、SESSION_SERVICE_URI 環境変数を構成すると、セッション サービスはその変数を使用します。それ以外の場合は、インメモリ セッションを使用します。
  3. カスタムルートを追加して、他のバックエンド ビジネス ロジックをサポートできます。スクリプトでは、フィードバック機能のルートの例を追加します。
  4. get_fast_api_app 引数パラメータでクラウド トレースを有効にして、トレースを Google Cloud Trace に送信します。
  5. uvicorn を使用して FastAPI サービスを実行する

デプロイがすでに完了している場合は、Cloud Run URL にアクセスして、ウェブ開発 UI からエージェントを操作してみてください。

6. 🚀 ロードテストによる Cloud Run 自動スケーリングの検査

次に、Cloud Run の自動スケーリング機能を確認します。このシナリオでは、インスタンスあたりの最大同時実行数を有効にして、新しいリビジョンをデプロイします。前のセクションでは、最大同時実行数を 10(フラグ --concurrency 10)に設定しました。したがって、この数を超える負荷テストを行うと、Cloud Run がインスタンスのスケーリングを試行することが予想されます。

load_test.py ファイルを確認しましょう。これは、locust フレームワークを使用して負荷テストを行うために使用するスクリプトです。このスクリプトは、次の処理を行います。

  1. ランダム化された user_id と session_id
  2. user_id の session_id を作成する
  3. 作成した user_id と session_id を使用してエンドポイント「/run_sse」にアクセスします。

デプロイされたサービスの URL が必要になります。Cloud Run コンソールに移動し、weather-agent サービスをクリックします。

979ec433acc4e35f.png

次に、weather-agent サービスを見つけてクリックします。

6f0874f1e96cdbd6.png

サービス URL は、リージョン情報のすぐ横に表示されます。例:

6d0823829ee15d1.png

次のコマンドを実行して、ロードテストを行います。

uv run locust -f load_test.py \
              -H {YOUR_SERVICE_URL} \
              -u 60 \
              -r 5 \
              -t 120 \
              --headless

実行すると、次のような指標が表示されます。(この例では、すべてのリクエストが成功しています)。

Type     Name                                  # reqs      # fails |    Avg     Min     Max    Med |   req/s  failures/s
--------|------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
POST     /run_sse end                             813     0(0.00%) |   5817    2217   26421   5000 |    6.79        0.00
POST     /run_sse message                         813     0(0.00%) |   2678    1107   17195   2200 |    6.79        0.00
--------|------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
         Aggregated                              1626     0(0.00%) |   4247    1107   26421   3500 |   13.59        0.00  

次に、Cloud Run で何が起こったかを確認します。デプロイしたサービスに再度アクセスして、ダッシュボードを確認します。これにより、Cloud Run が受信リクエストを処理するためにインスタンスを自動的にスケーリングする方法を確認できます。インスタンスあたりの最大同時実行数を 10 に制限しているため、Cloud Run インスタンスは、この条件を満たすようにコンテナの数を自動的に調整しようとします。

a23679982c072041.png

7. 🚀 新しいリビジョンの段階的なリリース

次のシナリオを考えてみましょう。エージェントのプロンプトを更新したい。weather_agent/agent.py を開き、次のコードで上書きします。

# weather_agent/agent.py

import os
from pathlib import Path

import google.auth
from dotenv import load_dotenv
from google.adk.agents import Agent
from weather_agent.tool import get_weather

# Load environment variables from .env file in root directory
root_dir = Path(__file__).parent.parent
dotenv_path = root_dir / ".env"
load_dotenv(dotenv_path=dotenv_path)


# Use default project from credentials if not in .env
_, project_id = google.auth.default()
os.environ.setdefault("GOOGLE_CLOUD_PROJECT", project_id)
os.environ.setdefault("GOOGLE_CLOUD_LOCATION", "global")
os.environ.setdefault("GOOGLE_GENAI_USE_VERTEXAI", "True")

root_agent = Agent(
    name="weather_agent",
    model="gemini-2.5-flash",
    instruction="""
You are a helpful AI assistant designed to provide accurate and useful information.
You only answer inquiries about the weather. Refuse all other user query
""",
    tools=[get_weather],
)

次に、新しいリビジョンをリリースするが、すべてのリクエスト トラフィックが新しいバージョンに直接送信されないようにします。Cloud Run を使用して段階的なリリースを行うことができます。まず、–no-traffic フラグを使用して新しいリビジョンをデプロイする必要があります。以前のエージェント スクリプトを保存して、次のコマンドを実行します。

gcloud run deploy weather-agent \
                  --source . \
                  --port 8080 \
                  --project {YOUR_PROJECT_ID} \
                  --allow-unauthenticated \
                  --region us-central1 \
                  --no-traffic

完了すると、以前のデプロイ プロセスと同様のログが届きます。ただし、処理されたトラフィックの数が異なります。配信されたトラフィックが 0% と表示されます。

Service [weather-agent] revision [weather-agent-xxxx-xxx] has been deployed and is serving 0 percent of traffic.

次に、Cloud Run のプロダクト ページに移動して、デプロイしたインスタンスを見つけます。検索バーに「cloud run」と入力し、Cloud Run プロダクトをクリックします。

979ec433acc4e35f.png

次に、weather-agent サービスを見つけてクリックします。

6f0874f1e96cdbd6.png

[リビジョン] タブに移動すると、デプロイされたリビジョンのリストが表示されます。

de00ac6870ed120b.png

新しくデプロイされたリビジョンが 0% で提供されていることがわかります。ここから、その他メニュー(⋮)をクリックして [トラフィックの管理] を選択します。

f35344086aecc5e6.png

新しくポップアップ表示されたウィンドウで、各リビジョンに転送されるトラフィックの割合を編集できます。

525ae793ebeee87f.png

しばらく待つと、トラフィックは割合の構成に基づいて比例的に転送されます。これにより、新しいリリースで問題が発生した場合に、以前のリビジョンに簡単にロールバックできます。

8. 🚀 ADK トレース

ADK で構築されたエージェントは、すでに OpenTelemetry を埋め込んでトレースをサポートしています。Cloud Trace を使用して、トレースをキャプチャして可視化します。以前にデプロイしたサービスで有効にする方法について、server.py を確認してみましょう。

# server.py

...

app_args = {"agents_dir": AGENT_DIR, "web": True, "trace_to_cloud": True}

...

app: FastAPI = get_fast_api_app(**app_args)

...

ここでは、trace_to_cloud 引数を True に渡します。他のオプションを使用してデプロイする場合は、このドキュメントで、さまざまなデプロイ オプションから Cloud Trace へのトレースを有効にする方法の詳細を確認してください。

サービス ウェブ開発 UI にアクセスして、エージェントとチャットしてみてください。その後、Cloud コンソールの検索バーに「Trace エクスプローラ」と入力し、[Trace エクスプローラ] プロダクトを選択します。

8d6786e232c8fd40.png

トレース エクスプローラ ページに、エージェントとの会話のトレースが送信されたことが表示されます。[スパン名] セクションで、エージェント固有のスパン(agent_run [weather_agent] という名前)を確認してフィルタできます。

ab15b7e94ae72e85.png

スパンがすでにフィルタされている場合は、各トレースを直接検査することもできます。エージェントが実行した各アクションの詳細な所要時間が表示されます。たとえば、以下の画像をご覧ください。

6258b48344a61a4b.png

92ab222ff1200011.png

各セクションで、以下のように属性の詳細を確認できます。

8b19a748d40276cb.png

これで、エージェントとユーザーのやり取りに関するオブザーバビリティと情報が充実し、問題のデバッグに役立つようになりました。さまざまなツールやワークフローを試してみてください。

9. 🎯 課題

マルチエージェント ワークフローまたはエージェント ワークフローを試して、負荷がかかった場合のパフォーマンスとトレースを確認する

10. 🧹 クリーンアップ

この Codelab で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。
  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
  4. コンソールで [Cloud Run] に移動し、デプロイしたサービスを選択して削除することもできます。