エージェント ファーストのワークフロー - プロンプトから本番環境まで

1. 概要

「2 日目」へようこそ。アプリを構築して [公開] をクリックするのは魔法のようですが、実際のトラフィックは実際の障害をもたらします。YAML の操作やログの検索に時間を費やすのではなく、特殊なエージェントの群れを構築して、運用上の配管を管理できます。この Codelab では、Google Cloud の統合スタック(Eventarc、Cloud Run、Firestore、Cloud Build、BigQuery)を使用して、エージェントがシークレットを安全に取得し、ログをストリーミングし、問題をすぐに解決する方法について説明します。

概要

この Codelab では、Gemini を搭載した恐竜アドベンチャー ゲーム DinoQuest を一から構築し、完全にエージェント化された CI/CD パイプラインに接続します。このコースを修了すると、次のことができるようになります。

  • Cloud Run で実行されている DinoQuest ウェブアプリ(サービス名: dinoquest
  • Cloud Run ログを BigQuery にストリーミングし、インタラクティブなゲーム分析ダッシュボードを生成するログ分析パイプライン
  • 修復エージェントremediation-agent) - Cloud Run エラーを監視して自動的に修正する ADK 修復エージェント。Eventarc によってトリガーされる独自の Cloud Run サービスとしてデプロイされます。
  • PR 差分を読み取り、テストをインテリジェントにスコープ設定し、Cloud Build 経由で Docker イメージをビルドして、コミット ステータスを GitHub に投稿する CI エージェントci-agent
  • デプロイ リスクをスコアリングし、トラフィックを分割し、指標をモニタリングして、自動的に昇格またはロールバックする CD エージェント

学習内容

  • フルスタックの Vite + FastAPI アプリを単一のコンテナとして Cloud Run にデプロイする方法
  • React アプリ用に Firebase Auth と Firestore を構成する方法
  • Eventarc を介して Pub/Sub イベントに応答する ADK エージェントを構築してデプロイする方法
  • Cloud Run ログを BigQuery に転送してゲーム分析をクエリする方法
  • CI とカナリア デプロイ用のエージェント型スキルを作成する方法

必要なもの

  • 課金を有効にした Google Cloud プロジェクト
  • Firebase プロジェクト(同じ GCP プロジェクトでも可)
  • GitHub アカウントと DinoQuest リポジトリのフォーク
  • Gemini(Google のエージェント ランナー)による Antigravity へのアクセス
  • gcloud CLI がインストールされ、認証されている - 以下のインストール手順をご覧ください。
  • node ≥ 18 かつ npm
  • python3 ≥ 3.11
  • gitgh(GitHub CLI)

gcloud CLI をインストールする

macOS

brew install --cask google-cloud-sdk

または、cloud.google.com/sdk/docs/install からインストーラをダウンロードします。

Windows

winget install Google.CloudSDK

または、cloud.google.com/sdk/docs/install から Windows インストーラ(.exe)をダウンロードして実行します。

インストール後、初期化して認証します。

gcloud init
gcloud auth login
gcloud auth application-default login

2. Firebase を設定する

すべてのエージェントは、推論に必要なデータを必要とします。DinoQuest は Firestore と Firebase Auth を使用して、プロダクション レディなデータレイヤを提供します。このデータレイヤは、後でエージェントが自然言語を使用して検出、探索、更新を行います。

このアプリは AI Studio で生成されたため、Firebase と緊密に統合されています。Firebase を使用すると、事前保護されたアーキテクチャと管理されたデータアクセスがすぐに利用できるため、ゲームの状態を最初から保護できるなど、いくつかのメリットがあります。

A. Firebase プロジェクトを作成する

  1. console.firebase.google.com に移動します。
  2. [プロジェクトを追加](新しいプロジェクトを作成するオプションに隠れています)をクリック → 既存の GCP プロジェクトを選択(または新しいプロジェクトを作成)
  3. Google アナリティクスを無効にするよう求められたら無効にする → [プロジェクトを作成](デフォルト設定のままにすることもできます)

B. Google 認証の有効化

  1. Firebase コンソールで、[セキュリティ] → [認証(スタートガイド)] → [ログイン方法] に移動します。
  2. [Google] をクリック → [有効にする] をオンにする → サポート用メールアドレスを保存 → [保存] をクリック

C. localhost を承認済みドメインとして追加する

  1. [認証] で、[設定] タブをクリックします。
  2. [承認済みドメイン] で、localhost がリストされていることを確認します(デフォルトでリストされているはずです)。

D. Firestore データベースを作成する

  1. [Database & Storage → Firestore Database → Create database] に移動します。
  2. [Standard Edition] を選択 → [次へ]
  3. リージョン us-central1 を選択します(または Cloud Run リージョンと一致させます)。
  4. [本番環境モードで開始] → [作成] を選択します。

作成したら、データベース ID をメモします。名前を付けない限り、(default) のようになります。

E. Firebase セキュリティ ルールを設定する

Firestore Database → Rules で、デフォルトのルールを次のルールに置き換えます。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // ===============================================================
    // Helper Functions
    // ===============================================================
    function isAuthenticated() {
      return request.auth != null;
    }
    
    function isOwner(userId) {
      return isAuthenticated() && request.auth.uid == userId;
    }

    function isValidUser(data) {
      return data.keys().hasAll(['uid', 'email']) &&
             data.uid is string && data.uid.size() > 0 &&
             (data.email == null || (data.email is string && data.email.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$")));
    }

    function isValidDinosaur(data) {
      return data.keys().hasAll(['userId', 'name', 'type']) &&
             data.userId == request.auth.uid &&
             data.name is string && data.name.size() > 0 && data.name.size() < 50 &&
             data.type in ['Speedy', 'Tank', 'Balanced', 'Agile'];
    }

    function isValidGame(data) {
      return data.keys().hasAll(['userId', 'score']) &&
             data.userId == request.auth.uid &&
             data.score is number && data.score >= 0;
    }


    match /users/{userId} {
      allow read: if isOwner(userId);
      allow create: if isOwner(userId) && isValidUser(request.resource.data);
      allow update: if isOwner(userId) && isValidUser(request.resource.data);

      match /dinosaurs/{dinoId} {
        allow read: if isOwner(userId);
        allow create: if isOwner(userId) && isValidDinosaur(request.resource.data);
        allow update: if isOwner(userId) && isValidDinosaur(request.resource.data);
      }

      match /games/{gameId} {
        allow read: if isOwner(userId);
        allow create: if isOwner(userId) && isValidGame(request.resource.data);
      }

      match /seenAnnouncements/{announcementId} {
        allow read, create: if isOwner(userId);
      }
    }

    match /announcements/{announcementId} {
      allow read: if isAuthenticated();
    }

    // Default deny
    match /{document=**} {
      allow read, write: if false;
    }

    match /scores/{scoreId} {
      allow read: if true;
      allow create: if isAuthenticated();
      allow update: if false;
    }
  }
}

[公開] をクリックします。

F. ウェブアプリを追加して構成を取得する

  1. [プロジェクト設定](歯車アイコン)→ [全般] タブに移動します。
  2. [Your apps] までスクロール → [Add app] をクリック → [Web] アイコン()を選択
  3. 名前を付けます(dinoquest)→ [アプリの登録]
  4. 表示された firebaseConfig オブジェクトをコピーします。これは後で必要になります。

3. ゲームの実行

エージェントの役割: 環境。エージェントを動作させるには、エージェントが管理する世界が必要です。このステップでは、DinoQuest の「Day One」バージョンをデプロイします。これにより、スウォームが後で検出して管理するライブサービス、ログ、状態が作成されます。

概要

次の 2 つのオプションのいずれかを選択します。どちらの場合も、以降のすべてのステップで同じように使用する GEMINI_API_KEY が生成されます。他の変更は必要ありません。

A. Gemini API キーを設定する

Vertex AI では、プロジェクトのデフォルトのサービス アカウントを使用して、GCP プロジェクトに直接関連付けられ、そのプロジェクトに課金される Gemini API キーを作成できます。AI Studio アカウントを別途作成する必要はありません。

  1. GCP プロジェクト ID をエクスポートします。
    export PROJECT_ID=<YOUR_PROJECT_ID>
    
  2. 必要な API を有効にし、Compute Engine のデフォルト サービス アカウントに必要な権限を付与します。
    gcloud auth application-default set-quota-project $PROJECT_ID
    gcloud config set project $PROJECT_ID
    
    # Enable Vertex AI, Compute Engine, and Generative Language APIs
    gcloud services enable aiplatform.googleapis.com \
                           compute.googleapis.com \
                           generativelanguage.googleapis.com
    
    # Grant Vertex AI User role to the default compute service account
    PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
      --role="roles/aiplatform.user" \
      --condition=None
    
  3. Cloud コンソールで Vertex AI API キーページを開きます。
  4. [認証情報を作成] をクリック → [API キー] を選択
  5. 作成ダイアログで次の操作を行います。
    • キーに Dino_Key という名前を付けます。
    • [サービス アカウントを介して API 呼び出しを認証する] チェックボックスをオンにします。
    • [サービス アカウント] で、デフォルトのコンピューティング サービス アカウントPROJECT_NUMBER-compute@developer.gserviceaccount.com)を選択します。
    • [API の制限を選択] に戻り、[GEMINI API] をオンにします。
    • [作成] をクリックします。
  6. 生成されたキーをコピーします。

オプション B - AI Studio(ローカル開発に最適)

  1. aistudio.google.com を開きます
  2. 左側のサイドバーで [API キーを取得] をクリックします。
  3. [API キーを作成] をクリック → GCP プロジェクトを選択 → キーをコピー

どちらのキーも以降の手順で GEMINI_API_KEY として設定されます。バックエンドはこれらを同じように扱います。

リポジトリのクローンを作成する

コース リポジトリは https://github.com/gca-americas/dinoquest にあります。まず、ご自身の GitHub アカウントにフォークしてください。代わりにエージェントがリポジトリで作業します。

フォークしたら、フォークした DinoQuest リポジトリの main ブランチのクローンを作成し、プロジェクト ディレクトリに入ります。

git clone https://github.com/YOUR_GITHUB_USERNAME/dinoquest.git
cd dinoquest

B. 環境変数を設定する

この Codelab で開く新しい bash ターミナルごとに、これらの重要な環境変数を必ず設定してください。プレースホルダの値を実際のプロジェクトの詳細に置き換えます。

まず、GitHub リポジトリの URL をエクスポートします。

export GITHUB_REPO_URL=https://github.com/YOUR_GITHUB_USERNAME/dinoquest

次に、残りの環境変数をエクスポートします。

export PROJECT_ID=your-project-id
export GOOGLE_CLOUD_PROJECT=$PROJECT_ID
export CLOUD_RUN_REGION=us-central1
export GOOGLE_GENAI_USE_VERTEXAI=True
export HARNESS_EVENTS_TOPIC=projects/$PROJECT_ID/topics/harness-events
export CLOUD_BUILD_REPO=<YOUR_GITHUB_USERNAME>-dinoquest

構造が次のようになっていることを確認します。

dinoquest/
├── backend/          # FastAPI backend (serves frontend + Gemini API calls)
├── frontend/         # React/Vite frontend
├── skills/           # Agentic CI/CD skill files
├── Dockerfile        # Multi-stage build (React → Python)
├── start.sh          # Local dev launcher
└── README.md

B. バックエンド環境ファイルを作成する

まず、Gemini API キーをエクスポートします。

export GEMINI_API_KEY=YOUR_GEMINI_API_KEY_FROM_STEP_2

次に、.env ファイルを作成します。

cat > backend/.env <<EOF
GEMINI_API_KEY=$GEMINI_API_KEY
GOOGLE_GENAI_USE_VERTEXAI=False
GOOGLE_CLOUD_PROJECT=$PROJECT_ID
EOF

C. Firebase App Check / サービス アカウント(Cloud Run 用)を有効にする

Cloud Run で実行する場合、バックエンドは アプリケーションのデフォルト認証情報を使用して Firebase と通信します。サービス アカウントの鍵ファイルは必要ありません。backend/main.pyfirebase_admin.initialize_app() 呼び出しは、これを自動的に取得します。

ローカル開発の場合は、1 回認証します。

gcloud auth application-default login

D. Firebase アプリの構成ファイルを作成する

frontend/ ディレクトリに、前のステップの構成を使用して firebase-applet-config.json を作成します。

{
  "apiKey": "YOUR_API_KEY",
  "authDomain": "YOUR_PROJECT_ID.firebaseapp.com",
  "projectId": "YOUR_PROJECT_ID",
  "storageBucket": "YOUR_PROJECT_ID.appspot.com",
  "messagingSenderId": "YOUR_SENDER_ID",
  "appId": "YOUR_APP_ID",
  "firestoreDatabaseId": "(default)"
}

注: firestoreDatabaseId は、前の手順で作成したデータベース ID と一致する必要があります。デフォルトを使用した場合は、"(default)" のままにします。

変更をリポジトリに commit します。

git add frontend/firebase-applet-config.json
git commit -m "chore: add firebase config"
git push origin main

C. DinoQuest をローカルで実行する

1. 必要な API の有効化

gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  artifactregistry.googleapis.com \
  secretmanager.googleapis.com \
  firestore.googleapis.com \
  logging.googleapis.com \
  pubsub.googleapis.com \
  eventarc.googleapis.com \
  aiplatform.googleapis.com \
  bigquery.googleapis.com \
  aiplatform.googleapis.com

2. DinoQuest を開始する

start.sh スクリプトは、React フロントエンドをビルドし、ターミナルを FastAPI バックエンドに渡します。FastAPI バックエンドは、コンパイルされた静的ファイルを配信します。

cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt -q

cd ..
# Force-remove the Vertex AI flag from the current terminal session to avoid conflicts
unset GOOGLE_GENAI_USE_VERTEXAI
./start.sh

ブラウザで http://localhost:8000 を開きます。DinoQuest のタイトル画面が表示されます。Google でログインし、最初の恐竜を生成して、Firestore に保存されることを確認します。

トラブルシューティング: 空白のページが表示されたり、Firebase 認証エラーが表示されたりする場合は、frontend/firebase-applet-config.json に正しい値が設定されていることと、localhost が承認済みドメインのリストに含まれていることを再確認してください。

E. DinoQuest を Cloud Run にデプロイする

1. プロジェクトを設定する

export PROJECT_ID=$(gcloud config get-value project)

3. Artifact Registry リポジトリを作成する

gcloud artifacts repositories create dinoquest \
  --repository-format=docker \
  --location=$CLOUD_RUN_REGION \
  --description="DinoQuest container images"

4. Gemini API キーを Secret Manager に保存する

echo -n $GEMINI_API_KEY | \
  gcloud secrets create gemini-api-key --data-file=-

# Grant the default compute service account access to the secret
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
gcloud secrets add-iam-policy-binding gemini-api-key \
  --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

5. Cloud Build を使用してコンテナ イメージをビルドする

gcloud builds submit \
  --tag $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/app:latest .

これにより、マルチステージ Dockerfile が実行されます。まず React アプリをビルドし、次にその出力を FastAPI イメージにパッケージ化します。3 ~ 5 分ほどかかります。

6. Cloud Run へのデプロイ

まず、管理者のメールアドレスをエクスポートします。

export ADMIN_EMAIL=<YOUR_TEST_ACCOUNT_EMAIL>

次に、サービスをデプロイします。

gcloud run deploy dinoquest \
  --image=$CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/app:latest \
  --region=$CLOUD_RUN_REGION \
  --platform=managed \
  --allow-unauthenticated \
  --memory=128Mi \
  --set-secrets="GEMINI_API_KEY=gemini-api-key:latest" \
  --set-env-vars="ADMIN_EMAILS=$ADMIN_EMAIL" \
  --set-env-vars="GOOGLE_GENAI_USE_VERTEXAI=False" \
  --set-env-vars="GOOGLE_CLOUD_PROJECT=$PROJECT_ID"

コマンドが完了すると、Cloud Run によってサービス URL が出力されます。この URL をコピーします。Firebase でドメインを承認する際に必要になります。

7. Firebase で Cloud Run ドメインを承認する

デプロイしたアプリからユーザーがログインできるようにするには、Cloud Run の URL を Firebase の承認済みドメインに追加する必要があります。

  1. Firebase コンソール → [認証] → [設定] → [承認済みドメイン] に戻ります。
  2. [ドメインを追加] をクリックします。
  3. Cloud Run サービス URL(dinoquest-xxxxx.us-central1.run.app など)を貼り付けます。https:// 接頭辞を削除します。
  4. [保存] をクリックします。

8. リーダーボードのデータをシードする

ゲームに初期の「ライフ」を与え、エージェントがデータを利用できるようにするには、リーダーボードに初期スコアを設定します。

  1. dinoquest ルート ディレクトリにいることを確認します。
    cd ~/dinoquest
    
  2. 仮想環境を作成して有効にします。
    python3 -m venv venv
    source venv/bin/activate
    
  3. 必要な Firestore 依存関係をインストールします。
    pip install google-cloud-firestore
    
  4. シーディング スクリプトを実行します。
    python3 prep/seed_scores.py
    
  5. 仮想環境を無効にします。
    deactivate
    

これで、ブラウザでサービス URL を開くことができます。DinoQuest が完全にライブになりました。

4. Dino Theater をセットアップする

エージェントの役割: 可視化ツール。自律型エージェント チームをどのようにモニタリングしますか?Dino Theater は、エージェント スウォームの思考をリアルタイムで可視化します。ターミナルログを凝視する代わりに、エージェントが推論し、互いに呼び出しを行い、クラウド全体でタスクを実行する様子をライブのビジュアル ダッシュボードで確認できます。

概要

A. Dino Theater を Cloud Run にデプロイする

まず、ホーム ディレクトリに戻り、Dino Theater コードのクローンを作成します。

cd ~
git clone https://github.com/gca-americas/dinoquest-theater.git
cd dinoquest-theater
  1. コンテナをビルドして push します。
    gcloud builds submit --tag $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/dino-theater:latest .
    
  2. サービス アカウントと権限を設定する:
    # Create the service account
    gcloud iam service-accounts create dino-theater
    
    # Create the Pub/Sub topic (if you haven't yet)
    gcloud pubsub topics create harness-events
    
    # Create the subscription
    gcloud pubsub subscriptions create harness-events-theater \
      --topic=harness-events
    
    # Grant subscriber role
    gcloud pubsub subscriptions add-iam-policy-binding harness-events-theater \
      --member="serviceAccount:dino-theater@${PROJECT_ID}.iam.gserviceaccount.com" \
      --role="roles/pubsub.subscriber"
    
  3. アプリケーションをデプロイします。
    gcloud run deploy dino-theater \
      --image $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/dino-theater:latest \
      --region=$CLOUD_RUN_REGION \
      --service-account=dino-theater@${PROJECT_ID}.iam.gserviceaccount.com \
      --set-env-vars="GOOGLE_CLOUD_PROJECT=$PROJECT_ID" \
      --allow-unauthenticated \
      --min-instances=1
    
    注: --min-instances=1 は、イベント間で SSE 接続を維持するために推奨されます。
  4. 動作を確認する: デプロイされたサービス URL(https://dino-theater-xxx-uc.a.run.app/demo など)をブラウザで開きます。

5. IDE でのエージェント主導型の DevOps

エージェントの役割: ネイティブ アンチグラビティ。IDE とクラウドのギャップを埋めるために、Antigravity を Google Cloud のマネージド MCP サーバーに接続します。これにより、ネイティブ エージェントがプロジェクトを「監視」できるようになり、API キーを管理したり、コンソールにコンテキストを切り替えたりすることなく、ログの解析、指標の確認、インフラストラクチャに関する推論を行うことができます。

スキルを実行する前に、Google Cloud への Antigravity のアクセスを構成し、DinoQuest スキルのプレイブックを読み込む必要があります。

A. Google のマネージド MCP サービスをインストールする

Google のマネージド MCP サービスは、単一のホスト型エンドポイントを介してすべての Google Cloud API へのアクセスを提供します。

アプリケーションのデフォルト認証情報を使用して認証します。

gcloud auth application-default login

B. mcp_config.json を構成する

Antigravity 構成ディレクトリ(通常は ~/.gemini/antigravity/mcp_config.json)またはコンソールで mcp_config.json を作成または更新します。これにより、Antigravity はスキルに必要な Google Cloud と GitHub のツールにアクセスできます。

{
  "mcpServers": {
    "google-developer-knowledge": {
      "serverUrl": "https://developerknowledge.googleapis.com/mcp",
      "authProviderType": "google_credentials"
    },
    "google-bigquery": {
      "serverUrl": "https://bigquery.googleapis.com/mcp",
      "authProviderType": "google_credentials"
    },
    "google-cloud-logging": {
      "serverUrl": "https://logging.googleapis.com/mcp",
      "authProviderType": "google_credentials"
    },
    "google-cloud-monitoring": {
      "serverUrl": "https://monitoring.googleapis.com/mcp",
      "authProviderType": "google_credentials",
      "disabledTools": [
        "get_dashboard",
        "list_dashboards"
      ]
    },
    "google-cloud-run": {
      "serverUrl": "https://run.googleapis.com/mcp",
      "authProviderType": "google_credentials",
      "disabledTools": [
        "deploy_service_from_image",
        "deploy_service_from_archive",
        "deploy_service_from_file_contents"
      ]
    },
    "google-cloud-sql": {
      "serverUrl": "https://sqladmin.googleapis.com/mcp",
      "authProviderType": "google_credentials",
      "disabled": true
    },
    "google-cloud-trace": {
      "serverUrl": "https://cloudtrace.googleapis.com/mcp",
      "authProviderType": "google_credentials"
    },
    "google-error-reporting": {
      "serverUrl": "https://clouderrorreporting.googleapis.com/mcp",
      "authProviderType": "google_credentials"
    },
    "google-firestore": {
      "serverUrl": "https://firestore.googleapis.com/mcp",
      "authProviderType": "google_credentials"
    },
    "google-resource-manager": {
      "serverUrl": "https://cloudresourcemanager.googleapis.com/mcp",
      "authProviderType": "google_credentials"
    },
    "gemini-cloud-assist": {
      "serverUrl": "https://geminicloudassist.googleapis.com/mcp",
      "authProviderType": "google_credentials"
    }
  }
}

C. スキルを Antigravity に読み込む(省略可)

Antigravity は、特定の標準ディレクトリでスキルを検出します。クローンしたリポジトリからグローバルな Antigravity スキル フォルダに DinoQuest スキルをコピーします。

# Create the standard skills directory if it doesn't exist
mkdir -p ~/.gemini/antigravity/skills

# Copy all DinoQuest skills into the global skills folder
cp -r skills/* ~/.gemini/antigravity/skills/

D. Antigravity を再起動する(省略可)

mcp_config.json の変更を適用して、新しくコピーしたスキルを読み込むには、Antigravity アプリケーションを再起動します。

再起動すると、次のようになります。

  1. 設定で、googlegithub の MCP サーバーのステータスが緑色の「接続済み」になっていることを確認します。
  2. スキルリストに DinoQuest スキルが表示されていることを確認します。

注: 各スキルには、SKILL.md の上部に ## Configuration テーブルがあります。コピー後、~/.gemini/antigravity/skills//SKILL.md の値をプロジェクトに合わせて更新する必要があります。

E. ローカル IDE でクラウド サービスを修復する

  1. エラーをトリガーする: ブラウザで、デプロイした DinoQuest の URL(前の手順で取得)を開きます。
  2. リーダーボードに移動する: [リーダーボード] ボタンをクリックします。現在のリーダーボードの実装は意図的に非効率的です。大量のデータをメモリに読み込もうとして、メモリ不足(OOM)エラーが発生します。
  3. Antigravity Agent Manager(Agent HUB)で、エラーの復元と根本原因の修正を依頼します。
  • プロンプト 1: dinoquest の問題点を特定します。
  • プロンプト 2: Dinoquest ゲームのコードを見て、メモリ不足エラーの原因を修正してください。

6. ログを BigQuery にストリーミングして分析を生成する

エージェントのロール: データ エージェント。未加工のログを実用的なプロダクト戦略に変換するのに、何時間もかけて手動でデータ パイプラインを構築する必要はありません。Data Agent Kit と BigQuery MCP を使用して、ログを BigQuery に直接ストリーミングする「ゼロ ETL」パイプラインを作成します。これにより、エージェントは 2 分以内にプレミアム分析ダッシュボードを生成できます。

log-router-bq-report スキルは、DinoQuest の Cloud Run ログを BigQuery に継続的にストリーミングする Cloud Logging シンクを設定し、データをクエリしてトラフィック レポートとゲーム分析の分析情報を生成します。

概要

A. スキル変数を構成する

DinoQuest リポジトリで skills/log-router-bq-report/SKILL.md を開き、上部の Configuration セクションを更新します。

| Variable      | Your Value         |
|---------------|--------------------|
| SERVICE_NAME  | dinoquest          |
| BQ_DATASET    | dinoquest_logs     |
| LOG_SINK_NAME | dinoquest-bq-sink  |

B. Antigravity でスキルを実行する

DinoQuest リポジトリをコンテキストとして Antigravity を開き、Gemini に次のように指示します。

Run the log-router-bq-report skill

スキルは次のことを行います。

  1. GCP プロジェクトを自動的に解決する
  2. BigQuery シンクがすでに存在するかどうかを確認します。存在しない場合は、データセットとシンクが作成されます。
  3. IAM 権限を付与: シンクの writerIdentity にデータセットに対する BigQuery データ編集者ロールが付与されます。

注: Eventarc シンクと同様に、このプロセス中に gcloud から「データセットで serviceAccount:service-... に BigQuery データ編集者のロールを付与してください」という警告が表示されることがあります。スキルはこれを自動的に処理します。

C. Antigravity を使用してレポートを生成する

Antigravity に「BigQuery ログシンクを設定して分析レポートを生成して」とリクエストするだけです。エージェントは次の対応を行います。

  1. インフラストラクチャを構成する: BigQuery データセットと Cloud Logging シンクを作成します。
  2. 権限を管理: シンクの書き込み ID に必要な IAM ロールを自動的に付与します。
  3. 分析情報を生成する: ログを分析し、ゲーム テレメトリーと勝率分析を含むプレミアムなインタラクティブ HTML ダッシュボードを作成します。

7. 自己修復エージェント

エージェントのロール: SRE エージェント。午前 2 時に本番環境サービスが失敗しても、起きる必要はありません。このエージェントは、最初の応答者として機能します。Eventarc を介して Cloud Run エラーログによってトリガーされ、クラッシュを自動的に分析し、修正を提案して、修復パイプラインを開始します。これらはすべて、コンソールにログインする前に行われます。

DinoAgent は、Eventarc 経由で Cloud Run エラーログをリッスンし、根本原因を診断して、メモリの増加、トラフィックのロールバック、GitHub でのコード修正 PR の提出のいずれかによって自動的に修復する ADK エージェントです。

概要

A. 修復エージェント リポジトリのクローンを作成する

cd ~
git clone https://github.com/gca-americas/dinoquest-reme-agent.git
cd dinoquest-reme-agent

プロジェクトの構造:

dinoquest-reme-agent/
├── main.py              # Service entrypoint — receives Eventarc HTTP POST, runs agent
├── runner.py            # ADK Runner + session service
├── agent.py             # LlmAgent definition, loads skill from file
├── tools.py             # Cloud Run v2 API tools (list/get/rollback/update)
├── skills/
   └── remediation/
       ├── SKILL.md     # Agent playbook — edit this to change behavior
       └── scripts/     # Shell scripts for the code-fix track
           ├── clone_repo.sh
           ├── read_file.sh
           ├── apply_fix.sh
           ├── commit_branch.sh
           ├── open_pr.sh
           └── rollback_fix.sh
├── requirements.txt
└── Dockerfile

B. GitHub アクセスを設定する(コード修正トラック)

コード修正トラックは、DinoQuest リポジトリのクローンを作成し、ソースファイルを読み取り、パッチを適用して、PR を開きます。repo スコープを持つ GitHub 個人アクセス トークンが必要です。

  1. github.com/settings/tokens に移動 → [Generate new token (classic)] をクリック
  2. 名前を付け、repo スコープを選択 → [トークンを生成] → コピー

Secret Manager に保存します。

まず、GitHub トークンをエクスポートします。

export GH_TOKEN=ghp_YOUR_TOKEN_HERE

次に、シークレットを作成します。

echo -n $GH_TOKEN | \
  gcloud secrets create github-token --data-file=-

C. Slack 通知を設定する(省略可)

修復が完了すると、DinoAgent は Slack チャンネルに概要を投稿します。

  1. api.slack.com/apps に移動し、[Create New App] → [From scratch] を選択します。
  2. 名前を DinoAgent にして、ワークスペースを選択 → [アプリを作成]
  3. [Features] → [Incoming Webhooks] → 切り替えをオンにします。
  4. [Add New Webhook to Workspace] をクリック → チャンネルを選択 → [Allow]
  5. Webhook URL(https://hooks.slack.com/services/...)をコピーする

Secret Manager に保存します。

export SLACK_TOKEN=YOUR_SLACK_WEBHOOK
echo -n "https://hooks.slack.com/services/$SLACK_TOKEN" | \
  gcloud secrets create slack-webhook --data-file=-

D. DinoAgent サービス アカウントを作成する

gcloud iam service-accounts create remediation-agent \
  --display-name="Cloud Run Remediation Agent"

export SA="remediation-agent@${PROJECT_ID}.iam.gserviceaccount.com"

for ROLE in \
  roles/run.admin \
  roles/iam.serviceAccountUser \
  roles/eventarc.eventReceiver \
  roles/aiplatform.user \
  roles/artifactregistry.reader \
  roles/secretmanager.secretAccessor \
  roles/pubsub.publisher \
  roles/logging.viewer; do
  gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:${SA}" --role="$ROLE" \
    --condition=None
done

シークレットへのアクセス権を付与します。

for SECRET in github-token slack-webhook; do
  gcloud secrets add-iam-policy-binding $SECRET \
    --member="serviceAccount:${SA}" \
    --role="roles/secretmanager.secretAccessor"
done

E. DinoAgent をビルドして Cloud Run にデプロイする

# Get Project Number for the CIAgent URL
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
export CIAGENT_URL=https://ci-agent-${PROJECT_NUMBER}.${CLOUD_RUN_REGION}.run.app
export SA="remediation-agent@${PROJECT_ID}.iam.gserviceaccount.com"
export GITHUB_REPO_URL=https://github.com/YOUR_REPO
HARNESS_EVENTS_TOPIC=projects/$PROJECT_ID/topics/harness-events


AGENT_IMAGE="$CLOUD_RUN_REGION-docker.pkg.dev/${PROJECT_ID}/dinoquest/remediation-agent:latest"
gcloud builds submit --tag $AGENT_IMAGE .


gcloud run deploy remediation-agent \
  --image=$AGENT_IMAGE \
  --region=$CLOUD_RUN_REGION \
  --service-account=$SA \
  --memory=2Gi \
  --set-env-vars="GOOGLE_CLOUD_PROJECT=${PROJECT_ID},GOOGLE_GENAI_USE_VERTEXAI=True" \
  --set-env-vars="GITHUB_REPO_URL=${GITHUB_REPO_URL}" \
  --set-secrets="SLACK_WEBHOOK_URL=slack-webhook:latest" \
  --set-env-vars="HARNESS_EVENTS_TOPIC=${HARNESS_EVENTS_TOPIC}" \
  --set-env-vars="CIAGENT_URL=${CIAGENT_URL}" \
  --set-secrets="GITHUB_TOKEN=github-token:latest" \
  --no-allow-unauthenticated \
  --min-instances=1 \
  --no-cpu-throttling \
  --timeout=300

F. Eventarc トリガーを接続する

Cloud Run エラーログを受信する Pub/Sub トピックを作成します。

gcloud pubsub topics create cloud-run-errors

dinoquest サービスからエラーログをフィルタしてトピックに転送する Cloud Logging シンクを作成します。

export SERVICE_NAME=dinoquest
FILTER="resource.type=\"cloud_run_revision\" resource.labels.service_name=\"$SERVICE_NAME\" severity=ERROR NOT logName=~\"cloudaudit\" NOT httpRequest.requestUrl=~\"/_ah/health\""

gcloud logging sinks create cloud-run-errors-sink \
  pubsub.googleapis.com/projects/${PROJECT_ID}/topics/cloud-run-errors \
  --log-filter="$FILTER"

注: 上記のコマンドを実行すると、gcloud は「Please remember to grant serviceAccount:service-... the Pub/Sub Publisher role on the topic.」という情報メッセージを出力します。次のステップでこの処理を行います。

シンクの書き込み ID(警告に記載されているサービス アカウント)にパブリッシュ権限を付与します。

SINK_SA=$(gcloud logging sinks describe cloud-run-errors-sink \
  --format='value(writerIdentity)')

gcloud pubsub topics add-iam-policy-binding cloud-run-errors \
  --member="${SINK_SA}" --role="roles/pubsub.publisher"

有効であることを確認します。

gcloud eventarc triggers describe remediation-trigger --location=$CLOUD_RUN_REGION

修復エージェントを呼び出すための Eventarc 権限を付与します。

gcloud run services add-iam-policy-binding remediation-agent \
  --region=$CLOUD_RUN_REGION \
  --member="serviceAccount:${SA}" \
  --role="roles/run.invoker"

Eventarc トリガーを作成します。

gcloud eventarc triggers create remediation-trigger \
  --location=$CLOUD_RUN_REGION \
  --destination-run-service=remediation-agent \
  --destination-run-region=$CLOUD_RUN_REGION \
  --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
  --transport-topic=projects/${PROJECT_ID}/topics/cloud-run-errors \
  --service-account=${SA}

修復は完全に自動化されています。DinoAgent は、インフラストラクチャのスケーリングだけでなく、アプリケーション コードの根本原因を詳細に分析し、セマンティック パッチを適用します。また、エージェント間(A2A)通信を使用して、修正を CI エージェントに渡し、検証とデプロイを行います。実装の詳細については、reme-agent コードベースをご覧ください。

8. CI エージェントを設定する

エージェント ロール: CI パイプライン。複雑な YAML ファイルや手動ビルド スクリプトとの格闘はやめましょう。このエージェントは、PR の運用上の配管を管理します。コードの変更を読み取り、コンテキストを理解し、必要なテストの範囲を設定して、Cloud Build 経由で Docker イメージをビルドします。これにより、すべての commit がメインブランチに到達する前に「エージェント承認済み」になります。

ci-agent は、Cloud Run サービスとしてデプロイされる自律型 CI パイプライン エージェントです。Docker ビルドを Cloud Build に送信し、完了をポーリングして、Artifact Registry のイメージを検証し、GitHub にレポートします。

概要

CI パイプラインにエージェントを使用する理由従来型の静的スクリプトとは異なり、エージェント型 CI パイプラインは次の機能を提供します。

  1. Cognitive Scope Classification: コード変更のセマンティクスな影響に基づいて、必要なテストの深さをインテリジェントに判断し、型チェック、単体テスト、完全な統合スイートを切り替えます。
  2. 自律型 PR 管理: エージェントは、PR を自動的に作成し、変更の詳細な概要を投稿できます。また、人間の介入なしでシークレット スキャンとセキュリティ監査を管理することもできます。
  3. リアルタイムの障害診断: ビルドが失敗すると、エージェントはログを表示するだけでなく、スタック トレースを分析して原因を特定し、人間が読める診断結果を PR に直接投稿します。

A. CIAgent リポジトリのクローンを作成する

cd ~
git clone https://github.com/gca-americas/dinoquest-ci-agent.git
cd dinoquest-ci-agent

B. CIAgent サービス アカウントを作成する

gcloud iam service-accounts create ci-agent \
  --display-name="CIAgent CI Pipeline"

export SA="ci-agent@${PROJECT_ID}.iam.gserviceaccount.com"

# Grant necessary roles to the service account
for ROLE in \
  roles/cloudbuild.builds.editor \
  roles/cloudbuild.builds.builder \
  roles/artifactregistry.reader \
  roles/artifactregistry.writer \
  roles/aiplatform.user \
  roles/secretmanager.secretAccessor \
  roles/pubsub.publisher \
  roles/developerconnect.admin; do
  gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:${SA}" --role="$ROLE" \
    --condition=None
done



# ci-agent needs to act as itself when running build steps
gcloud iam service-accounts add-iam-policy-binding $SA \
  --member="serviceAccount:${SA}" \
  --role="roles/iam.serviceAccountUser"

C. GitHub リポジトリを Cloud Build に接続する

CIAgent は repoSource を介してビルドを送信します。これには、GitHub リポジトリを Cloud Build Developer Connect に接続する必要があります。

  1. GCP Console → Cloud Build → リポジトリに移動します。
  2. [リポジトリを接続] をクリックします。
  3. [GitHub(Cloud Build GitHub アプリ)] を選択します。
  4. YOUR_GITHUB_USERNAME/dinoquest リポジトリを承認して選択する
  5. トリガーの作成を求められたら、[接続] をクリックし、[スキップ] をクリックします。
  6. 接続名をメモします(通常、デフォルトは GitHub ユーザー名または類似の名前です)。

D. CIAgent にシークレットへのアクセス権を付与する

DinoAgent 用に先ほど作成したシークレットを再利用します。

gcloud secrets add-iam-policy-binding github-token \
  --member="serviceAccount:${SA}" \
  --role="roles/secretmanager.secretAccessor"

gcloud secrets add-iam-policy-binding slack-webhook-ci \
  --member="serviceAccount:${SA}" \
  --role="roles/secretmanager.secretAccessor"

E. CIAgent をビルドして Cloud Run にデプロイする

# Set up required variables for orchestration
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
export CDAGENT_URL=https://cd-agent-${PROJECT_NUMBER}.${CLOUD_RUN_REGION}.run.app
export CI_AGENT_URL=ci-agent-${PROJECT_NUMBER}.${CLOUD_RUN_REGION}.run.app
export GITHUB_OWNER="YOUR_GITHUB_USERNAME"
export CLOUD_BUILD_CONNECTION="YOUR_CONNECTION_NAME"  # Update this if your connection name is different
export CLOUD_BUILD_REPO="YOUR_GITHUB_USERNAME-dinoquest" # Update this if your connection name is different

export SLACK_TOKEN=YOUR_SLACK_WEBHOOK
echo -n "https://hooks.slack.com/services/$SLACK_TOKEN" | \
  gcloud secrets create slack-webhook-ci --data-file=-

export SA="ci-agent@${PROJECT_ID}.iam.gserviceaccount.com"
AGENT_IMAGE="$CLOUD_RUN_REGION-docker.pkg.dev/${PROJECT_ID}/dinoquest/ci-agent:latest"
gcloud builds submit --tag $AGENT_IMAGE .

gcloud run deploy ci-agent \
  --image=$AGENT_IMAGE \
  --region=$CLOUD_RUN_REGION \
  --service-account=$SA \
  --memory=1Gi \
  --timeout=600 \
  --allow-unauthenticated \
  --min-instances=1 \
  --set-env-vars="GOOGLE_CLOUD_PROJECT=${PROJECT_ID},GOOGLE_GENAI_USE_VERTEXAI=True" \
  --set-env-vars="HARNESS_EVENTS_TOPIC=${HARNESS_EVENTS_TOPIC}" \
  --set-env-vars="HOST=${CI_AGENT_URL},PROTOCOL=https" \
  --set-secrets="SLACK_WEBHOOK_URL=slack-webhook-ci:latest" \
  --set-env-vars="GITHUB_OWNER=${GITHUB_OWNER},GITHUB_REPO=dinoquest" \
  --set-env-vars="CLOUD_BUILD_CONNECTION=${CLOUD_BUILD_CONNECTION},CLOUD_BUILD_REPO=${CLOUD_BUILD_REPO},CLOUD_BUILD_REGION=${CLOUD_RUN_REGION}" \
  --set-env-vars="CDAGENT_URL=${CDAGENT_URL}" \
  --set-secrets="GITHUB_TOKEN=github-token:latest" \
  --min-instances=1

F. Slack スラッシュ コマンドの設定

  1. api.slack.com/apps に移動 Create New App From scratch
  2. 名前を CIAgent にして、ワークスペースを選択 → [アプリを作成]
  3. [機能] → [スラッシュ コマンド] → [新しいコマンドを作成]
  4. コマンド: /runci
  5. リクエスト URL: 上記の CIAgent Cloud Run URL に /slack を追加した URL(例: https://ci-agent-xxx-.us-central1.run.app/slack
  6. 簡単な説明: Trigger CI
  7. 保存
  8. [設定] → [アプリをインストール] で、[Workspace にインストール] をクリックして [許可] をクリックします。

CI エージェントは、Cloud Build や Artifact Registry などの堅牢な Google Cloud サービスの上に位置する「頭脳」として機能します。ビルドが検証されると、A2A 経由で CD エージェントを呼び出して最終デプロイ フェーズがトリガーされ、ビルド サイクルとリリース サイクル間のシームレスなハンドオフが保証されます。

9. Deployment を設定する

エージェントのロール: CD エージェント。デプロイは、信頼を前提とした飛躍であってはなりません。このエージェントがリスクを管理します。デプロイの安全性をスコアリングし、カナリア トラフィックの分割を管理し、リアルタイム指標をモニタリングして、リリースを昇格させるかロールバックするかを決定します。これは、自律エージェント スウォームの最後のゲートキーパーです。

cd-agent は、Cloud Run サービスとしてデプロイされる自律型カナリア デプロイ エージェントです。ci-agent から A2A デプロイ リクエストを受信し、リスクスコアを計算して、リスク調整済みのカナリアの割合を設定し、指標をモニタリングして、自動的に昇格またはロールバックします。また、Firestore を使用した過去のデプロイから学習します。

概要

エージェントを直接接続すると、「認知パイプライン」が作成され、各ハンドオフはインテントとコンテキストの豊富な転送になります。従来のウェブフックとは異なり、A2A 通信では次のことが可能です。

  1. インテリジェントなコンテキスト共有: エージェントはセッションのメモリ全体、PR の差分、リスクスコアを渡すため、次のエージェントは作業を開始する前に「理由」を完全に把握できます。
  2. Cognitive Handshakes: エージェントがゲートを交渉できます。たとえば、CD エージェントはカナリア ロールアウト中に CI エージェントに特定のスモークテストをリクエストして、修正をリアルタイムで検証できます。
  3. 共同修復: デプロイが失敗した場合、CD エージェントは失敗した指標を修復エージェントに事前に通知し、人がページングされる前に自律的な根本原因分析を開始できます。
  4. リソース交渉: エージェントはインフラストラクチャのニーズを交渉できます。たとえば、CI エージェントは大規模なリファクタリングを検出した場合、修正エージェントにビルド容量の追加プロビジョニングを要求できます。また、CD エージェントは、メジャー リリースの前に本番環境クラスタのスケーリングを提案できます。
  5. マルチエージェント コンセンサス: リスクの高い変更の場合、複数のエージェント(セキュリティ エージェントや CD エージェントなど)が A2A を介して「共同承認」を実行し、コードがビルドとデプロイだけでなく、本番環境に移行する前にセキュリティ ポリシーに準拠していることを確認します。

A. CDAgent リポジトリのクローンを作成する

cd ~
git clone https://github.com/gca-americas/dinoquest-cd-agent.git
cd dinoquest-cd-agent

B. Firestore データベースを作成する

CDAgent は、デプロイ メモリ パターンを Firestore に保存します。

gcloud firestore databases create \
  --region=$CLOUD_RUN_REGION \
  --project=$PROJECT_ID

(このプロジェクトでデータベースをすでに作成している場合は、この手順をスキップできます)。

C. CDAgent サービス アカウントを作成する

gcloud iam service-accounts create cd-agent \
  --display-name="CDAgent Canary Deployer"

export SA="cd-agent@${PROJECT_ID}.iam.gserviceaccount.com"

# Grant necessary roles
for ROLE in \
  roles/run.developer \
  roles/iam.serviceAccountUser \
  roles/artifactregistry.reader \
  roles/artifactregistry.writer \
  roles/monitoring.viewer \
  roles/datastore.user \
  roles/aiplatform.user \
  roles/run.admin \
  roles/pubsub.publisher; do
  gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:${SA}" --role="$ROLE" \
    --condition=None
done

D. CDAgent にシークレットへのアクセス権を付与する

先ほど作成した GitHub トークンと Slack Webhook を再利用し、デプロイされたアプリが使用できるように、Cloud Run コンピューティング サービス アカウントに Gemini API キーへのアクセス権を付与します。

gcloud secrets add-iam-policy-binding github-token \
  --member="serviceAccount:${SA}" \
  --role="roles/secretmanager.secretAccessor"

gcloud secrets add-iam-policy-binding slack-webhook-cd \
  --member="serviceAccount:${SA}" \
  --role="roles/secretmanager.secretAccessor"

# Grant the compute service account access to Gemini API key
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
gcloud secrets add-iam-policy-binding gemini-api-key \
  --project=$PROJECT_ID \
  --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

E. CDAgent をビルドして Cloud Run にデプロイする

export GITHUB_OWNER="YOUR_GITHUB_USERNAME"

export CD_AGENT_URL=cd-agent-${PROJECT_NUMBER}.${CLOUD_RUN_REGION}.run.app

export SLACK_TOKEN=YOUR_SLACK_WEBHOOK
echo -n "https://hooks.slack.com/services/$SLACK_TOKEN" | \
  gcloud secrets create slack-webhook-cd --data-file=-

AGENT_IMAGE="$CLOUD_RUN_REGION-docker.pkg.dev/${PROJECT_ID}/dinoquest/cd-agent:latest"
gcloud builds submit --tag $AGENT_IMAGE .


export SA="cd-agent@${PROJECT_ID}.iam.gserviceaccount.com"


gcloud run deploy cd-agent \
  --image=$AGENT_IMAGE \
  --region=$CLOUD_RUN_REGION \
  --service-account=$SA \
  --memory=1Gi \
  --set-env-vars="GOOGLE_CLOUD_PROJECT=${PROJECT_ID}" \
  --set-env-vars="GOOGLE_GENAI_USE_VERTEXAI=True" \
  --set-env-vars="HOST=${CD_AGENT_URL},PROTOCOL=https" \
  --set-env-vars="CD_TARGET_SERVICE=dinoquest" \
  --set-env-vars="HARNESS_EVENTS_TOPIC=${HARNESS_EVENTS_TOPIC}" \
  --set-env-vars="GITHUB_OWNER=${GITHUB_OWNER}" \
  --set-env-vars="GITHUB_REPO=dinoquest" \
  --set-env-vars="DEMO_MODE=true" \
  --set-env-vars="LEADERBOARD_ENABLED=true" \
  --set-secrets="SLACK_WEBHOOK_URL=slack-webhook-cd:latest" \
  --set-secrets="GITHUB_TOKEN=github-token:latest" \
  --allow-unauthenticated \
  --min-instances=1 \
  --no-cpu-throttling \
  --timeout=300

注: --min-instances=1 --no-cpu-throttling は、Slack と A2A コマンドに迅速に応答できるように、インスタンスをウォーム状態に保ちます。

CD エージェントは、本番環境の最終的なゲートキーパーです。各デプロイのリスクを評価し、リスク調整済みのカナリアを実行して、リアルタイムの指標をモニタリングします。異常が検出されると、自動ロールバックが開始されます。

10. スケールアップ: エージェント スワームでレベル 2 をアンロックする

A. フル スワームをテストする

  1. エラーをトリガーする: ブラウザで、デプロイした DinoQuest の URL(前の手順で取得)を開きます。
  2. リーダーボードに移動する: [リーダーボード] ボタンをクリックします。現在のリーダーボードの実装は意図的に非効率的です。大量のデータをメモリに読み込もうとして、メモリ不足(OOM)エラーが発生します。
  3. エージェントを待機: 約 60 秒以内に、remediation-agent は Eventarc 経由でエラー イベントを受信し、診断を開始します。
  4. Slack を確認する: Slack チャンネルに次のような通知が表示されます。DinoAgent 修復の概要
    • サービス: dinoquest
    • 失敗したリビジョン: dinoquest-xxxx-xxxx
    • 証拠: 「Memory limit of 128 MiB exceeded with 13x MiB used.」(メモリ上限の 128 MiB を超え、13x MiB が使用されました)。
    • このリビジョンが悪い理由: /api/leaderboard エンドポイントが非効率的に xxxxx され、OOM エラーが発生しました。
    • 実施したアクション: サービス dinoquest のメモリを xMi から yGi に増やしました。新しいリビジョンが作成されました。
    • 根本原因の PR: https://github.com/YOUR_USERNAME/DinoQuest/pull/x
  5. 修正を確認する:
    • GitHub: リポジトリで新しいブランチと Pull Request を確認します。エージェントは、基盤となるメモリリークを修正するためにアプリケーション コードをパッチ適用しました。
    • Cloud Run: GCP Console に、更新されたメモリ割り当てを含む dinoquest サービスの新しいリビジョンが表示されます。
    • リーダーボード: リーダーボードをもう一度試してください。メモリの増加と最終的なコード修正により、今度は正常に読み込まれるはずです。

B. 進化: レベル 2 のゲームロジックを実装する

レベル 2(小惑星破壊)という新しい重要な機能を追加します。これにより、高得点の恐竜は新しいゲームモードに進むことができます。

  1. dinoquest リポジトリに戻ります
    cd ~/dinoquest
    
  2. 新しいブランチを作成して切り替える:
    git checkout -b level_2
    
  3. レベル 2 のパッチを適用する: 提供されたスクリプトを実行して、レベル 2 のアセット、コンポーネント、ゲームロジックでローカル コードベースにパッチを適用します。
    bash level_2_backup/levelup.sh
    
  4. 変更を commit して push します
    git add .
    git commit -m "feat: add Level 2"
    git push origin level_2
    

curl を使用してエージェントを手動でトリガーする代わりに、先ほど構成した Slack スラッシュ コマンドを使用します。これは、実際のシナリオで自律型 CI パイプラインを操作する方法です。

  1. Slack を開きCIAgent アプリがインストールされている任意のチャンネルに移動します。
  2. 次のコマンドを入力して、CI ビルドをトリガーします。
    /runci run ci on branch level_2
    
  3. 進行状況をモニタリングする:
    • Slack: エージェントはコマンドを確認し、ビルドの進行状況に応じて更新情報を投稿します。
    • Dino Theater: エージェントが変更を分類し、Cloud Build ジョブを送信し、CD エージェントと通信する際の「吹き出し」を確認します。
    • GitHub: level_2 PR を確認します。エージェントが commit ステータスと完全な CI レポート コメントを投稿していることがわかります。
  4. プロセスを確認する:
    • Dino Theater で、CI エージェントが変更を分類してパイプラインを実行していることを確認します。
    • GitHub PR を確認して、CI エージェントがコミット ステータスと最終レポートを投稿していることを確認します。

11. まとめ

Google Cloud 上に完全なエージェントベースの DevOps スタックを構築しました。

コンポーネント

機能

DinoQuest(Cloud Run dinoquest

Gemini を活用したゲーム - React フロントエンド + FastAPI バックエンド

Firebase Auth + Firestore

ユーザー認証と恐竜のプロフィール保存

修復エージェント(Cloud Run + Eventarc)

OOM エラーとコードバグを自動的に修復する SRE エージェント

log-router-bq-report

ログを BigQuery にストリーミングして分析情報を生成するデータ エージェント

CIAgent(Cloud Run)

テストのスコープ設定、イメージのビルド、A2A による CD の呼び出しを行う CI エージェント

CDAgent(Cloud Run)

自動ロールバックでリスクスコア付きカナリア デプロイを実行する CD エージェント

エージェントの動作はすべて skills/ ディレクトリに Markdown プレイブックとして保存されます。動作を変更するには、コードではなくスキルを編集します。スキルは Antigravity with Gemini で実行され、実行するスキルをエージェントに伝えることで呼び出されます。