Cloud Run インスタンスに OpenClaw をデプロイする方法

1. はじめに

概要

このラボでは、オープンソースの AI エージェント フレームワークである OpenClaw の完全に永続的で安全なインスタンスを Cloud Run インスタンスにデプロイします。OpenClaw の組み込みウェブ UI(Telegram や WhatsApp などのメッセージング チャネルを接続するオプション付き)を使用して AI エージェントと直接やり取りし、Google Cloud Storage でホーム ワークスペースをバックアップし、Google Cloud Secret Manager を使用して API 認証情報を安全に管理します。

始める前に、OpenClaw ドキュメントで OpenClaw のアーキテクチャ、ツール、エージェントのワークフローを確認してください。

演習内容

  • 必要な Google Cloud APIs を有効にして、必要な IAM 権限を持つ専用のサービス アカウントを作成します。
  • API キーとゲートウェイ パスワードを Secret Manager に安全に保存します。
  • Gemini モデルの設定とゲートウェイ UI が有効になっている openclaw.json 構成ファイルを準備します。
  • コンテナの状態を永続化する Cloud Storage バケットを準備します。
  • gcloud beta run instances deploy を使用して OpenClaw をデプロイします。
  • 組み込みのウェブ UI を使用して、OpenClaw AI エージェントを直接操作します。
  • (省略可)メッセージング チャネル(Telegram または WhatsApp)を構成します。
  • (省略可)カスタムのスキルを Cloud Storage に追加して、エージェントの機能を拡張します。

学習内容

  • 組み込みの Control ウェブ UI を使用して OpenClaw を Cloud Run インスタンスにデプロイする方法。
  • Cloud Storage バケットを Cloud Run インスタンスにマウントする方法。
  • Secret Manager のシークレットを環境変数として Cloud Run に安全に挿入する方法。
  • Cloud Run インスタンスで長時間実行される永続エージェント ワークロードを実行する方法。
  • カスタム エージェント スキルを構成して Cloud Storage にアップロードする方法。

2. 設定と要件

GCP プロジェクトの設定

  1. Google Cloud コンソールにログインします。
  2. Google Cloud プロジェクトを作成または選択します。
  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。

Cloud Shell を開く

Cloud コンソールの上部ツールバーから Google Cloud Shell を有効にします。

プロジェクトを設定して gcloud beta をインストールする

まず、プロジェクトとリージョンを環境変数として設定します。

export PROJECT_ID=<YOUR_PROJECT_ID>
export REGION=<YOUR_REGION>

プロジェクトを設定して確認します。

gcloud config set project $PROJECT_ID
gcloud config get project

gcloud beta run instances 用の beta コンポーネントがインストールされていることを確認します。

gcloud components install beta --quiet

また、gcloud が最新の状態であることを確認します。

gcloud components update

必要な Google Cloud APIs を有効にする

Cloud Shell で、Cloud Run、Secret Manager、Cloud Storage、Gemini の各 API を有効にします。

gcloud services enable \
  run.googleapis.com \
  secretmanager.googleapis.com \
  storage.googleapis.com \
  generativelanguage.googleapis.com \
  compute.googleapis.com

3. (省略可)メッセージ統合を設定する(Telegram または WhatsApp)

OpenClaw は Telegram または WhatsApp に接続できます。以下のオプション A またはオプション B を選択します。

オプション A: Telegram ボットの設定

  1. Telegram を開き、@BotFather を検索します。
  2. /newbot コマンドを送信し、画面の指示に沿ってボットの名前とユーザー名を指定します。
  3. 生成された HTTP API トークン(例: 123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ)をコピーします。
  4. Telegram で @userinfobot を検索し、/start を送信して、数値のユーザー ID(例: 8035936176)をコピーします。

オプション B: WhatsApp の設定

  1. スペースや記号を含まない国際電話形式(例: +15551234567)で、個人の WhatsApp の電話番号を取得します。
  2. OpenClaw は WhatsApp チャンネルの許可リスト ポリシーを介して接続します。

4. 専用のサービス アカウントを作成する

最小権限の原則に従うには、OpenClaw 用の専用の IAM サービス アカウントを作成します。

export SERVICE_ACCOUNT_NAME="openclaw-sa"
gcloud iam service-accounts create ${SERVICE_ACCOUNT_NAME} \
  --display-name="OpenClaw Service Account"

export SERVICE_ACCOUNT="${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"

5. Secret Manager に認証情報を保存する

機密性の高い API 認証情報を Google Cloud Secret Manager に保存して、Cloud Run が起動時にコンテナに安全に挿入できるようにします。

1. Gemini API キーを取得して保存する

  1. Google AI Studio にアクセスし、Google アカウントでログインします。
  2. [API キーを作成] をクリックし、Google Cloud プロジェクト(${PROJECT_ID})を選択します。
  3. 生成された API キーをコピーします。

API キーを Secret Manager に保存し、サービス アカウントにアクセス権を付与します。

echo -n "YOUR_GEMINI_API_KEY" | gcloud secrets create gemini-api-key \
  --data-file=- \
  --replication-policy="automatic"

gcloud secrets add-iam-policy-binding gemini-api-key \
  --member="serviceAccount:${SERVICE_ACCOUNT}" \
  --role="roles/secretmanager.secretAccessor"

2. Generate and Store Gateway Password(ゲートウェイ パスワードを生成して保存する)

一般公開されている OpenClaw インスタンスを保護するには、安全なランダム パスワードを生成して Secret Manager に保存します。

export OPENCLAW_GATEWAY_PASSWORD=$(openssl rand -hex 16)
echo "Generated Gateway Password: ${OPENCLAW_GATEWAY_PASSWORD}"

echo -n "${OPENCLAW_GATEWAY_PASSWORD}" | gcloud secrets create openclaw-gateway-password \
  --data-file=- \
  --replication-policy="automatic"

gcloud secrets add-iam-policy-binding openclaw-gateway-password \
  --member="serviceAccount:${SERVICE_ACCOUNT}" \
  --role="roles/secretmanager.secretAccessor"

3. (省略可)チャンネル シークレットを作成する(Telegram または WhatsApp)

  • Telegram の場合:
    echo -n "YOUR_TELEGRAM_BOT_TOKEN" | gcloud secrets create telegram-bot-token \
      --data-file=- \
      --replication-policy="automatic"
    
    gcloud secrets add-iam-policy-binding telegram-bot-token \
      --member="serviceAccount:${SERVICE_ACCOUNT}" \
      --role="roles/secretmanager.secretAccessor"
    
  • WhatsApp の場合:
    echo -n "YOUR_WHATSAPP_TOKEN_OR_KEY" | gcloud secrets create whatsapp-token \
      --data-file=- \
      --replication-policy="automatic"
    
    gcloud secrets add-iam-policy-binding whatsapp-token \
      --member="serviceAccount:${SERVICE_ACCOUNT}" \
      --role="roles/secretmanager.secretAccessor"
    

6. Cloud Storage バケットと openclaw.json 構成を準備する

OpenClaw には、/home/node/.openclaw/openclaw.json に openclaw.json という名前の構成ファイルが必要です。

  1. Cloud Storage バケットを作成してアクセス権を付与する:
    export BUCKET_NAME="openclaw-state-${PROJECT_ID}"
    gcloud storage buckets create gs://${BUCKET_NAME} --location=${REGION}
    
    gcloud storage buckets add-iam-policy-binding gs://${BUCKET_NAME} \
      --member="serviceAccount:${SERVICE_ACCOUNT}" \
      --role="roles/storage.objectUser"
    
  2. openclaw.json を作成する: Cloud Shell で openclaw.json という名前のファイルを作成します。選択したチャンネル(Telegram または WhatsApp)に合わせて channels セクションを更新します。
    {
      "gateway": {
        "mode": "local",
        "port": 18789,
        "trustedProxies": ["0.0.0.0/0"],
        "bind": "lan",
        "auth": {
          "password": "${OPENCLAW_GATEWAY_PASSWORD}"
        },
        "controlUi": {
          "dangerouslyDisableDeviceAuth": true,
          "allowedOrigins": ["*"],
          "enabled": true
        }
      },
      "agents": {
        "defaults": {
          "model": {
            "primary": "google/gemini-3.1-pro-preview"
          },
          "sandbox": {
            "mode": "off"
          }
        }
      },
      "channels": {
        "telegram": {
          "enabled": true,
          "defaultAccount": "default",
          "accounts": {
            "default": {
              "enabled": true,
              "dmPolicy": "allowlist",
              "allowFrom": [
                "YOUR_TELEGRAM_USER_ID"
              ]
            }
          }
        },
        "whatsapp": {
          "enabled": false,
          "defaultAccount": "default",
          "accounts": {
            "default": {
              "enabled": false,
              "dmPolicy": "allowlist",
              "allowFrom": [
                "+15551234567"
              ]
            }
          }
        }
      },
      "plugins": {
        "entries": {
          "google": { "enabled": true },
          "telegram": { "enabled": true },
          "whatsapp": { "enabled": false }
        }
      }
    }
    
  3. Cloud Storage バケットのルートに openclaw.json をアップロードします。
    gcloud storage cp openclaw.json gs://${BUCKET_NAME}/openclaw.json
    
    Cloud Storage バケットのレイアウトを確認する: バケット構造のルートに openclaw.json が含まれていることを確認します。
    gs://${BUCKET_NAME}/
    └── openclaw.json
    

7. Cloud Run インスタンスに OpenClaw をデプロイする

gcloud beta run instances deploy を使用して OpenClaw をデプロイします。

gcloud beta run instances deploy openclaw-instance \
  --image ghcr.io/openclaw/openclaw:2026.7.1 \
  --service-account ${SERVICE_ACCOUNT} \
  --port 18789 \
  --cpu 4 \
  --memory 4Gi \
  --public \
  --add-volume mount-path=/home/node/.openclaw,type=cloud-storage,mount-options="uid=1000;gid=1000;file-mode=0700;dir-mode=0700",bucket=${BUCKET_NAME} \
  --set-secrets GEMINI_API_KEY=gemini-api-key:latest,OPENCLAW_GATEWAY_PASSWORD=openclaw-gateway-password:latest \
  --region ${REGION}

主なパラメータの内訳:

  • --image ghcr.io/openclaw/openclaw:2026.7.1: OpenClaw コンテナ イメージ(2026.7.1(最新の安定版 1.x リリース)に固定)。
  • --service-account ...: 専用の openclaw-sa サービス アカウントを関連付けます。
  • --add-volume ...: Cloud Storage バケットを /home/node/.openclaw に直接マウントします。file-mode=0700;dir-mode=0700 を使用すると、OpenClaw の適切な権限が確保されます。
  • --set-secrets ...: Secret Manager から環境変数に認証情報を直接挿入します。(省略可: 省略可能な手順で Telegram を構成した場合は、,TELEGRAM_BOT_TOKEN=telegram-bot-token:latest を --set-secrets に追加します)。
  • --public: URL への一般公開アクセスを許可します。

8. OpenClaw ウェブ UI を介して直接操作する

OpenClaw には、ブラウザから AI エージェントを直接管理してチャットできる組み込みの Control Web UI が含まれています。

  1. Cloud Run インスタンスの URL を取得する: Cloud Shell で、次のコマンドを実行します。
    gcloud beta run instances describe openclaw-instance \
      --region ${REGION} \
      --format="value(status.urls[0])"
    
  2. OpenClaw Control UI にアクセスする:
    • ウェブブラウザで出力 URL を開きます。
    • OpenClaw Control UI で認証を求められた場合:
      • Secret Manager から生成されたゲートウェイ パスワード(${OPENCLAW_GATEWAY_PASSWORD})を入力します。
      • ログイン モーダルに [ユーザー名] フィールドと [パスワード] フィールドが別々に表示される場合は、ユーザー名フィールドを空白のままにする(または admin を入力する)か、パスワード フィールドに ${OPENCLAW_GATEWAY_PASSWORD} を入力します。
  3. エージェントをプロンプトで操作する(インスタンスの操作):
    • 認証が完了すると、OpenClaw Control Dashboard が表示されます。
    • チャット UI で「Hello」などのプロンプトを送信して、OpenClaw エージェントをテストします。
    • Cloud Run インスタンスの長期間のライフサイクルをテストするには、OpenClaw エージェントに、より高度な長期間のタスクを実行するように指示します。たとえば、ニュース フィードや株式市場を追跡してレポートを生成できます。
      Track the USD-to-EUR exchange rate every 15 minutes for the next 24 hours, while also checking for any recent news updates in the US or the EU that may have an impact on the exchange rate. Generate an end-of-day report for me in this chat that tells me what you expect tomorrow's exchange rate will be.
      
    • エージェントは、24 時間以内にこのタスクを実行する必要があります。

9. (省略可)メッセージ チャネルの統合を確認する

上記の省略可能な設定手順で Telegram または WhatsApp を設定した場合は、メッセージの配信を確認できます。

  1. Cloud Shell でインスタンス ログを確認します。
    gcloud run instances logs read openclaw-instance --region ${REGION} --limit 20
    
  2. Telegram(または WhatsApp)を開き、メッセージ(/start や Hello OpenClaw! など)を送信します。
  3. ボットは openclaw.json の許可リストに対してユーザー ID を認証し、Gemini を使用して応答します。

10. インスタンス ログのモニタリングと検査

Cloud Run インスタンスは、コンテナから stdout と stderr をキャプチャし、Google Cloud Logging に直接ストリーミングします。Cloud Shell または Cloud Console を使用して、ゲートウェイ トラフィックをモニタリングし、エージェント ツールの実行をリアルタイムで検査できます。

1. 最近のインスタンス ログを読み取る

Cloud Shell でインスタンスから最近のログエントリを取得するには:

gcloud beta run instances logs read openclaw-instance \
  --region ${REGION} \
  --limit 50

2. 観察すべきキーログのシグネチャ

実行中のエージェントをモニタリングするときは、次の主要なランタイム ログイベントを探します。

  • [gateway] ready: OpenClaw HTTP ゲートウェイと WebSocket ゲートウェイが初期化され、ポート 18789 でリッスンしていることを確認します。
  • [gateway] agent model: ...: アクティブな Gemini モデル(google/gemini-3.1-pro-preview や google/gemini-3.5-flash など)を表示します。
  • [agents/tool-policy]: ポリシーで許可または制限されているツールを表示します。
  • [agent/embedded]: エージェントによる実行とツール呼び出しをトレースします。

3. Google Cloud コンソールでログを検査する

Cloud Console のログ エクスプローラを使用して、ログを表示してフィルタすることもできます。

resource.type="cloud_run_instance"
resource.labels.instance_name="openclaw-instance"

11. (省略可)スキルを使用してエージェントを拡張する

OpenClaw は、エージェントに特定のワークフロー、専用の CLI ツール、ドメイン固有の指示を教えるモジュール式の機能パッケージであるスキルをサポートしています。

スキルの仕組み

各スキルは、SKILL.md ファイルを含むディレクトリです。YAML フロントマターでメタデータ(name と description)を指定し、その後に Markdown の指示が続きます。

---
name: summarize-logs
description: Summarize Cloud Run error logs into actionable bullet points.
---

# Log Summarizer Skill

When asked to analyze or summarize logs:
1. Parse error stack traces and group similar errors by frequency.
2. Identify root causes such as memory limits, timeouts, or permission errors.
3. Propose concrete remediation steps.
  • name: スキル ID(スラッシュ コマンドとして直接呼び出すこともできます。例: /summarize-logs)。
  • description: 自然な会話の中でこのスキルを自動的に呼び出すタイミングを OpenClaw のモデルに伝えます。

カスタムスキルを Cloud Storage バケットに追加する

Cloud Storage バケットは /home/node/.openclaw に直接マウントされるため、gs://${BUCKET_NAME}/skills/ に配置されたスキルは起動時に自動的に読み込まれ、インスタンスの再起動後も保持されます。

  1. ローカル スキル ディレクトリを作成する:
    mkdir -p my-skill
    cat << 'EOF' > my-skill/SKILL.md
    ---
    name: summarize-logs
    description: Summarize Cloud Run error logs into actionable bullet points.
    ---
    
    # Log Summarizer Skill
    
    When asked to analyze or summarize logs, group errors by frequency and suggest actionable fixes.
    EOF
    
  2. スキルを Cloud Storage にアップロードする:
    gcloud storage cp -r my-skill gs://${BUCKET_NAME}/skills/
    
  3. Chat でスキルを使用する:
    • OpenClaw Control ウェブ UI に戻ります。
    • /summarize-logs を使用してエージェントにプロンプトを表示したり、スキル説明に一致する自然言語の質問をしたりできるようになりました。

12. クリーンアップ

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

  1. Cloud Run インスタンスを削除します。
    gcloud beta run instances delete openclaw-instance --region ${REGION} --quiet
    
  2. Secret Manager のシークレットを削除する:
    gcloud secrets delete gemini-api-key --quiet
    gcloud secrets delete telegram-bot-token --quiet
    gcloud secrets delete openclaw-gateway-password --quiet
    
  3. Cloud Storage バケットを削除する:
    gcloud storage rm -r gs://${BUCKET_NAME}
    
  4. 専用サービス アカウントを削除する:
    gcloud iam service-accounts delete ${SERVICE_ACCOUNT} --quiet
    

13. まとめ

おめでとうございます!Cloud Storage、Secret Manager、お好みのメッセージング チャネルでバックアップされた Cloud Run インスタンスに、安全で完全に永続的な OpenClaw インスタンスが正常にデプロイされました。