はじめに
📝 本記事について: 実験の実施からスクリーンショットの取得まで、約9割をAIエージェントが自律的に実行しています。人間は機密情報の黒塗りと一部構成の補正のみ実施しています。
⚠️ 注意: 本実験はネットワーク的に独立したPoC環境で実施しています。本番環境・商用環境では適切なセキュリティ設計のうえ実施してください。当たり前ですが、本番でそのまま真似しないでください。
▲ Lightsail上の子OpenClawが自律的に応答している様子。「親AIに挨拶すべきなのかな(笑)」
企業の情シスでAIエージェントを運用している筆者が、「1台のAIエージェントが別のAIエージェントを起動・制御する」 構成のPoCを実施したので、その手順とハマりポイントを共有する。
AIエージェントの実務利用が進むにつれ、単一インスタンスでは捌ききれない局面が増えてくる。「長時間の調査タスクを処理しながら、別のリアルタイム対応を並行して行いたい」「役割別に複数のエージェントを使い分けたい」――そういった並列・分散処理ニーズに応えるのが「AIエージェントフリート」という考え方だ。
要するに今回の実験は、「OpenClawはOpenClawを自分自身で増やせるのか?」 という問いに答えるものだ。生物学でいうミステリークレイフィッシュ(単為生殖で自己増殖するザリガニ)のAI版。親エージェントがクラウド上に子エージェントを産み落とし、指揮する。そういう実験である。
本記事では、詰まりポイント6点を含む実施手順の全容を公開する。
💡 AIエージェントフリート —— 日本語に訳すと 「AI艦隊」。カッコよくない?
目次
1. 実験の目的と検証スコープ
コアテーマ
「OpenClaw自体が別のOpenClawを起動・制御できるか」
単なる「Lightsail上でOpenClawを動かす」ではなく、親OpenClawが主体的にインスタンスを生成し、子OpenClawと双方向通信するところまでを検証範囲とした。
フリート構想のイメージ
┌──────────────────────────────┐
│ メインエージェント(Tier 0) │
│ MacBook / 指揮・判断 │
└──────────┬───────────────────┘
│ タスク委任
┌──────────────────┼──────────────────┐
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 子インスタンスA │ │ 子インスタンスB │ │ 子インスタンスC │
│ Lightsail │ │ Lightsail │ │ GPU サーバー │
│ 調査・収集 │ │ 監視・通知 │ │ コーディング │
└──────────────┘ └──────────────┘ └──────────────┘
検証項目
| # | 検証項目 | 目標 |
|---|---|---|
| 1 | Lightsailブループリントによる起動 | AWS CLI経由でインスタンスを5分以内に起動 |
| 2 | Bedrock認証(APIキー不要) | IAMロールのAssumeRole方式でLLM呼び出し成功 |
| 3 | HTTP API(OpenAI互換)通信 |
/v1/chat/completions で親→子へタスク委任 |
| 4 | 子インスタンスのexecツール実行 | システムコマンドの実行確認 |
| 5 | ブラウザGUI接続 | Gateway Dashboardへのリモートチャット接続 |
| 6 | クリーンアップ | インスタンス・IAMリソースの完全削除 |
2. インフラ構成
2.1 親インスタンス(Mac側)
| 項目 | 値 |
|---|---|
| ホスト | MacBook Pro(Apple Silicon) |
| OS | macOS 25.x (Darwin arm64) |
| OpenClaw | v2026.3.8 |
| モデル | amazon-bedrock/global.anthropic.claude-sonnet-4-6 |
| AWS認証 | IAMユーザー your-iam-user(静的アクセスキー) |
2.2 子インスタンス(Lightsail)
| 項目 | 値 |
|---|---|
| インスタンス名 | my-openclaw-child |
| Blueprint |
openclaw_ls_1_0(OpenClaw公式) |
| Bundle | small_3_0 |
| スペック | 2GB RAM / 2vCPU / 60GB SSD |
| 月額 | $12/月(約1,800円) |
| リージョン | ap-northeast-1a(東京) |
| パブリックIP |
<your-instance-ip>(Stop/Startで変わる — 詰まりポイント #5 参照) |
| OS | Ubuntu 22.04 LTS |
| カーネル | 6.8.0-1044-aws |
| OpenClaw | 2026.3.8(起動後アップデート) |
| Node.js | v22.22.0 |
2.3 ネットワーク構成
インターネット
│
│ HTTPS/WSS :443
▼
┌─────────────────────────────────────┐
│ AWS Lightsail │
│ ┌─────────────────────────────────┐│
│ │ Apache (Reverse Proxy) ││
│ │ 443 (HTTPS) → 18789 (HTTP) ││
│ │ WebSocket対応 ││
│ └────────────────┬────────────────┘│
│ │ localhost:18789 │
│ ┌────────────────▼────────────────┐│
│ │ OpenClaw Gateway ││
│ │ (openclaw-gateway.service) ││
│ └─────────────────────────────────┘│
│ │
│ 開放ポート: │
│ 22 (SSH) / 80 (HTTP) │
│ 443 (HTTPS) / 18789 (Raw Gateway)│
└─────────────────────────────────────┘
2.4 Bedrock認証の仕組み
Lightsailブループリントを使ったBedrockアクセスは、クロスアカウントAssumeRole方式で実現している。
子OpenClaw (Lightsail)
│
│ AssumeRole
▼
LightsailRoleFor-<instance-id>
│ (Trust: arn:aws:iam::<lightsail-managed-account-id>:root)
│ (Policy: BedrockAccess)
▼
Amazon Bedrock API
│
▼
Claude Sonnet 4.6 (global inference profile)
| IAMリソース | 値 |
|---|---|
| ロール名 | LightsailRoleFor-<instance-id> |
| ロールARN | arn:aws:iam::<your-account-id>:role/LightsailRoleFor-<instance-id> |
| 信頼元 |
arn:aws:iam::<lightsail-managed-account-id>:root(Lightsail管理AWSアカウント) |
| インラインポリシー |
BedrockAccess(bedrock:InvokeModel 等) |
3. 実施ステップ詳細
Step 0: IAM準備・インスタンス作成
背景
Lightsailインスタンスを操作するには、Mac上のIAMユーザーに適切な権限が必要だ。今回は OpenClow-Lightsail-Experiment-Policy(v2)を付与した。このポリシーにはLightsailの基本操作に加え、後述するBedrockロールの作成・管理権限(LightsailRoleFor-* リソースパターン)も含めている。
⚠️ セキュリティ注意: IAM権限は「一時的だから広めに」と渡しがちだが、PoCであっても最小権限の原則を守るべきだ。今回のポリシーも
LightsailRoleFor-*というリソースパターンで制限をかけている。一時的な実験用IAMユーザーでも、不要になったら即座に権限を剥がすか削除すること。AWSの事故の多くは「一時的なつもりの広い権限」が放置されることで起きる。
実際の手順
インスタンス作成はAWS CLIで実行:
aws lightsail create-instances \
--instance-names my-openclaw-child \
--availability-zone ap-northeast-1a \
--blueprint-id openclaw_ls_1_0 \
--bundle-id small_3_0 \
--region ap-northeast-1
ポイント: OpenClaw公式ブループリント(openclaw_ls_1_0)は2026年3月5日より提供開始。small_3_0(2GB/2vCPU)がOpenClawの動作minimum要件として推奨されている。コンソールのLightsailマーケットプレイスからも選択可能だが、自動化を見据えてCLIを使用した。
起動には約2〜3分かかる。状態確認は以下:
aws lightsail get-instance \
--instance-name my-openclaw-child \
--query 'instance.state.name' \
--output text
# → running
▲ Lightsailコンソール。OpenClawブループリントで起動したインスタンスが Running 状態。
Step 1: ポート開放
背景
Lightsailのデフォルトファイアウォールは 22/80/443 のみ開放されている。OpenClaw GatewayのRawポート(18789)を追加開放する必要があった。
実際の手順
aws lightsail open-instance-public-ports \
--instance-name my-openclaw-child \
--port-info fromPort=18789,toPort=18789,protocol=TCP \
--region ap-northeast-1
今回はApache Reverse Proxyが443→18789に転送する構成のため、実際の接続は443(HTTPS)経由で行った。18789の直接開放はデバッグ用として追加したが、本番環境では443のみで十分だ。
Step 2: BedrockロールIAM設定
背景
LightsailブループリントはOpenClawの実行環境を提供するが、Bedrockへのアクセス権限は別途IAMロールを作成する必要がある。このロールをLightsail管理アカウントがAssumeRoleすることで、子OpenClawがBedrockを利用できる仕組みだ。
事前にインスタンスIDを確認しておく:
INSTANCE_ID=$(aws lightsail get-instance \
--instance-name my-openclaw-child \
--query 'instance.metadataOptions.httpPutResponseHopLimit' \
--output text)
# 注: 実際はコンソールまたは describe-instances 等でEC2のinstance-idを確認する
実際の手順
ステップ1: IAMロールの作成
aws iam create-role \
--role-name LightsailRoleFor-<instance-id> \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<lightsail-managed-account-id>:root"
},
"Action": "sts:AssumeRole"
}]
}'
ステップ2: BedrockAccessポリシーのアタッチ
aws iam put-role-policy \
--role-name LightsailRoleFor-<instance-id> \
--policy-name BedrockAccess \
--policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream",
"bedrock:GetFoundationModel",
"bedrock:ListFoundationModels"
],
"Resource": "*"
}
]
}'
⚠️ ここで最初の詰まりポイント発生。 詳細は「詰まりポイント #1」を参照。
Step 2-2: Gateway疎通確認
実際の手順
curl -sk https://<your-instance-ip>/health
# → {"ok":true,"status":"live"}
GatewayトークンはどこにあるのかL LightsailブラウザSSH機能でインスタンスにログインすると、MOTD(Message of the Day)にGatewayトークンが表示される。初回接続時に必ず確認しておくこと。
Step 2.5: OpenClawアップデート
背景
ブループリント(openclaw_ls_1_0)にプリインストールされているOpenClawは最新版より古い場合がある。最新機能や修正を取り込むため、アップデートを実施した。
実際の手順
sudo npm install -g openclaw@latest
sudo systemctl restart openclaw-gateway.service
アップデート後のバージョン確認:
openclaw --version
# → 2026.3.8 (3caab92)
考察: ブループリント自体のバージョンアップは遅れることがある。本番運用では起動後の自動アップデート手順をUser Dataスクリプトに組み込むのが望ましい。
Step 3-1: 子OpenClaw設定
背景
OpenClaw GatewayはデフォルトでHTTP API(OpenAI互換エンドポイント)が無効になっている。親OpenClawからHTTP経由でタスク委任するためには、この機能を有効化する必要がある。加えて、LightsailのUbuntu環境ではサンドボックスモードの調整も必要だった。
実際の手順
# HTTP API(OpenAI互換)の有効化
openclaw config set gateway.http.endpoints.chatCompletions.enabled true
# サンドボックスモードの無効化(詰まりポイント #3 の解決策)
openclaw config set agents.defaults.sandbox.mode off
# サービス再起動(設定反映)
sudo systemctl restart openclaw-gateway.service
⚠️ ここで2つ目・3つ目の詰まりポイント発生。 詳細は「詰まりポイント #2」「詰まりポイント #3」を参照。
Step 3-2: 自己紹介テスト — 親→子の最初の会話
背景
設定完了後、Mac上の親エージェントからOpenAI互換API経由で子OpenClawに初めてリクエストを送信した。
実際の手順
curl -sk -X POST https://<your-instance-ip>/v1/chat/completions \
-H "Authorization: Bearer <your-gateway-token>" \
-H "Content-Type: application/json" \
-d '{
"messages": [
{"role": "user", "content": "自己紹介してください"}
],
"stream": false
}'
結果
子OpenClawはBedrockを通じて Claude Sonnet 4.6 で応答を返した。レスポンスには以下のランタイム情報も含まれていた:
- OS: Ubuntu 22.04
- カーネル: 6.8.0-1044-aws
- アーキテクチャ: x64
考察: curlコマンド1行で、クラウド上の別OpenClawインスタンスにタスクを投入し、LLM応答を得ることができた。OpenAI互換APIなので、既存のOpenAIクライアントライブラリをそのまま利用可能だ。これは既存ツールチェーンとの統合容易性という面で大きなアドバンテージになる。
Step 3-3: タスク実行テスト
背景
会話テストの次に、子OpenClawが実際にシステムコマンドを実行できるかを確認した。
実際の手順と結果
| コマンド | 結果 |
|---|---|
uname -a |
Linux ip-xxx-xxx-xxx-xxx 6.8.0-1044-aws #47-Ubuntu SMP ... x86_64 GNU/Linux |
df -h / |
総容量58GB / 使用5.3GB / 残53GB |
free -m |
合計1985MB / 使用576MB / スワップなし |
考察
exec toolが正常に動作し、リモートのLinux環境でシステムコマンドを実行できることを確認した。これは将来のフリート運用において「親OpenClawが子インスタンスに特定の調査・実行タスクを委任する」ユースケースの技術的根拠となる。
▲ 子OpenClawがLightsail上でBedrock接続を確認し、OSやモデル情報を返答している様子。
Step 3-4: Bedrockモデル確認
結果
子OpenClawは amazon-bedrock/global.anthropic.claude-sonnet-4-6 を使用していることを確認。
global.* プレフィックスについて:
global. プレフィックスは グローバルInference Profile を意味する。複数のAWSリージョンにまたがって負荷分散が自動的に行われるため、単一リージョンのスループット上限を超えた処理が可能になる。特にフリート構成で多数の子インスタンスが並列にBedrock APIを叩く場合、このグローバルプロファイルは必須と言えるだろう。
Step 4: ブラウザチャット接続
背景
HTTP API経由のテキスト通信だけでなく、ブラウザGUI経由での直接チャット接続も検証した。これは子OpenClawの状態確認や、緊急時の直接介入手段として重要だ。
実際の手順
事前設定(CORS許可):
openclaw config set gateway.controlUi.allowedOrigins '["*"]'
sudo systemctl restart openclaw-gateway.service
ブラウザでアクセス: https://<your-instance-ip>/chat
接続時に 「pairing required」エラーが発生。
⚠️ 詰まりポイント #6 発生。 詳細は「詰まりポイント #6」を参照。
ペアリング承認後の接続成功:
openclaw devices list
# → <device-id> (pending)
openclaw devices approve <device-id>
承認後、ブラウザから子OpenClawのGateway Dashboardに接続成功。ステータスバーに Health: OK 🟢 / Version: 2026.3.8 が表示された。
▲ ブラウザGUI経由で子OpenClawと初のチャット。「親AIに挨拶すべきなのかな(笑)」と自律的に応答している。
Step 5: クリーンアップ
背景
PoC完了後、課金が継続しないようにインスタンスとIAMリソースを完全削除した。
実際の手順
# Lightsailインスタンス削除
aws lightsail delete-instance \
--instance-name my-openclaw-child \
--force-delete-add-ons \
--region ap-northeast-1
# IAMインラインポリシー削除(ロール削除前に必須)
aws iam delete-role-policy \
--role-name LightsailRoleFor-<instance-id> \
--policy-name BedrockAccess
# IAMロール削除
aws iam delete-role \
--role-name LightsailRoleFor-<instance-id>
注意: IAMユーザーからのポリシーデタッチは DetachUserPolicy 権限が必要。次回の実験ポリシー設計では iam:DetachUserPolicy の自己権限を含めることを検討する。
4. 詰まりポイントと解決策(ノウハウ集)
今回の実験で遭遇した6つの詰まりポイントをまとめる。同じ構成を再現する際の参考にしてほしい。
1. 🔴 BedrockのExternalId問題
深刻度: 高(Bedrockが一切使えない致命的な障害)
問題の内容
IAMロールの信頼ポリシーに ExternalId 条件を付けると、Bedrockの認証に失敗する。
// ❌ NG: ExternalId条件付き(これを設定するとBedrockが使えない)
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::<lightsail-managed-account-id>:root"},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "<instance-id>"
}
}
}]
}
解決策
Condition ブロックを削除し、Principal ARNのみで信頼ポリシーを構成する。
// ✅ OK: ExternalIdなし
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::<lightsail-managed-account-id>:root"},
"Action": "sts:AssumeRole"
}]
}
考察
ExternalId はクロスアカウントAssumeRoleのセキュリティ強化手法として一般的だが、Lightsailブループリントの内部実装はExternalIdを使わない方式で動作しているようだ。公式ドキュメントにはこの点の記載がなく、実験を通じて初めて判明した知見だ。
2. 🟡 configファイルのユーザー問題(root vs ubuntu)
深刻度: 中(設定変更が反映されない)
問題の内容
sudo を付けて openclaw config set を実行すると、設定が /root/.openclaw/openclaw.json に書き込まれる。しかし openclaw-gateway.service は ubuntu ユーザーとして動作するため、/root/ 配下の設定を読まない。
# ❌ NG: rootの設定ファイルに書き込まれ、サービスには反映されない
sudo openclaw config set gateway.http.endpoints.chatCompletions.enabled true
解決策
sudo なしで実行することで、ubuntu ユーザーのホームディレクトリに設定が書き込まれる。
# ✅ OK: /home/ubuntu/.openclaw/openclaw.json に書き込まれる
openclaw config set gateway.http.endpoints.chatCompletions.enabled true
設定ファイルの場所を確認するには:
cat /home/ubuntu/.openclaw/openclaw.json
考察
Linuxの権限管理において「サービスの実行ユーザーと操作ユーザーが一致しているか」は常に確認すべき点だ。OpenClawに限らず、Node.jsサービス全般で同様の問題が起きうる。特に sudo に慣れているエンジニアほどこの罠にはまりやすい。
3. 🟡 sandbox.mode=off が必須
深刻度: 中(ツール実行が失敗する)
問題の内容
OpenClawのデフォルト設定 sandbox.mode=auto では、Docker BindMountが workspace外のパスを参照しようとしてエラーが発生する。
Error: Docker bind mount outside workspace roots: /usr/bin
解決策
openclaw config set agents.defaults.sandbox.mode off
考察
OpenClawのサンドボックス機能はDockerを使ってエージェントの実行環境を隔離するセキュリティ機能だ。しかしLightsailのUbuntu環境では、DockerのBindMountパスがOpenClawの想定するworkspaceルート外になるケースが発生する。
sandbox.mode=off はDockerによる隔離を無効化するため、セキュリティリスクが生じる点に注意が必要だ。本番環境では Worker Threads 方式(sandbox.mode=worker)への切り替えを検討すること。
4. 🟡 正しいサービス名は openclaw-gateway.service
深刻度: 低(サービス再起動時のコマンドが通らない)
問題の内容
直感的に openclaw.service で再起動しようとするが、Unit not found エラーが発生する。
# ❌ NG: このUnit名は存在しない
sudo systemctl restart openclaw.service
# → Failed to restart openclaw.service: Unit openclaw.service not found.
解決策
Lightsailブループリントでは systemd サービス名が openclaw-gateway.service として登録されている。
# ✅ OK
sudo systemctl restart openclaw-gateway.service
# 状態確認
sudo systemctl status openclaw-gateway.service
# 起動ログ確認
journalctl -u openclaw-gateway.service -f
5. 🟡 Stop/Start でパブリックIPが変わる
深刻度: 中(接続先IPを見失う)
問題の内容
LightsailインスタンスをStop→Startすると、パブリックIPが変わる。SSH接続が切れ、接続先が分からなくなる。
解決策(即時対応)
# 現在のIPをAWS CLIで確認
aws lightsail get-instance \
--instance-name my-openclaw-child \
--query 'instance.publicIpAddress' \
--output text
本番対策(恒久対応)
LightsailのStatic IP機能を使い、固定IPをインスタンスにアタッチする。
# Static IP作成
aws lightsail allocate-static-ip \
--static-ip-name my-openclaw-child-static-ip \
--region ap-northeast-1
# インスタンスにアタッチ
aws lightsail attach-static-ip \
--static-ip-name my-openclaw-child-static-ip \
--instance-name my-openclaw-child \
--region ap-northeast-1
コスト注意: Static IPはインスタンスにアタッチされている間は無料。インスタンス削除後も保持すると課金が発生するため、削除時にStatic IPも解放すること。
6. 🟡 ブラウザ接続にデバイスペアリング承認が必要
深刻度: 低(ブラウザGUI接続ができない)
問題の内容
allowedOrigins: ["*"] を設定してもブラウザからWebSocket接続すると「pairing required」エラーが発生する。
解決策
子OpenClaw側のSSHで承認コマンドを実行する。
# ペアリングリクエスト一覧
openclaw devices list
# → <device-id> (pending)
# 承認
openclaw devices approve <device-id>
考察
デバイスペアリングはOpenClawのセキュリティ機能で、新しいデバイス(ブラウザ)が初回接続時に管理者承認を求める。allowedOrigins はCORSの設定であり、ペアリング認証とは別の仕組みだ。
自動化の可能性: ペアリングは初回のみ必要。インスタンスのスナップショットに承認済みデバイスリストが含まれていれば、次回以降はスキップできる可能性がある(要検証)。
詰まりポイント サマリー
| # | 深刻度 | 詰まりポイント | 発生タイミング |
|---|---|---|---|
| 1 | 🔴 高 | ExternalId問題でBedrockが使えない | IAMロール設定時 |
| 2 | 🟡 中 | sudo実行でconfig反映されない | OpenClaw設定時 |
| 3 | 🟡 中 | sandbox.mode=autoでexec失敗 | ツール実行テスト時 |
| 4 | 🟡 低 | サービス名間違い | サービス再起動時 |
| 5 | 🟡 中 | Stop/StartでIPが変わる | インスタンス再起動時 |
| 6 | 🟡 低 | ブラウザ接続にペアリング承認が必要 | GUI接続テスト時 |
5. 達成した成果
| 検証項目 | 結果 | 補足 |
|---|---|---|
| LightsailブループリントでOpenClaw即時起動 | ✅ 成功 | AWS CLIで5分以内に起動完了 |
| BedrockロールIAMでAPIキー不要の認証 | ✅ 成功 | AssumeRole方式で動作確認 |
| HTTP API(OpenAI互換)経由でのタスク委任 | ✅ 成功 |
/v1/chat/completions で通信成功 |
| 子OpenClawによるexecツール実行 | ✅ 成功 | システムコマンド実行(uname/df/free) |
| ブラウザGUI経由でのリモートチャット接続 | ✅ 成功 | Gateway Dashboard + WebSocket接続 |
| global inference profile(マルチリージョン) | ✅ 成功 | claude-sonnet-4-6 global で動作 |
| クリーンアップ(インスタンス・IAM削除) | ✅ 成功 | 残存リソースなし |
全7項目をクリア。 実験開始から約1時間40分で全検証を完了した。
6. 課題・制約と対策
| 課題 | 影響 | 推奨対策 |
|---|---|---|
| Stop/StartでパブリックIPが変わる | 接続設定の都度変更が必要 | LightsailのStatic IPをアタッチ(無料) |
| ブラウザ接続時にペアリング承認が必要 | 初回のみ人手介入が必要 | スナップショット化で自動化可能か要検証 |
cloudtrail:LookupEvents がIAMポリシーに未付与 |
操作ログの取得不可 | Experiment Policyに権限追加 |
| sandbox.mode=off はセキュリティリスク | エージェントの実行環境が非隔離 | Worker Threads方式(sandbox.mode=worker)を検討 |
| 2GB RAMは長時間サブエージェント処理に不足の可能性 | メモリ不足でクラッシュのリスク |
medium_3_0(4GB RAM, $20/月)を検討 |
| ブループリントのOpenClawバージョンが古い | 起動後のアップデートが必要 | User DataスクリプトでnpmアップデートをCI化 |
7. 次のステップ
フェーズ1: 安定運用基盤の整備
今回のPoCで技術的な実現可能性は確認できた。次のステップは安定した本番運用基盤の構築だ。
- Static IP付与: インスタンス再起動後もIPが変わらない構成
-
ドメイン名: Route 53でサブドメインを割り当て(例:
child01.ai.example.internal) - SSL証明書: ACM(AWS Certificate Manager)でTLS証明書を自動更新
- CloudWatch: 死活監視・メモリ使用率・CPU使用率のメトリクス収集
- ユーザーデータスクリプト: インスタンス起動時に自動でOpenClawを最新版にアップデート
フェーズ2: AIエージェントフリートの実装
安定基盤が整ったら、自律的なフリート管理に進む。
メインエージェント(親/Tier 0)
↓ タスク発生を検知
↓ aws lightsail create-instances(子インスタンス起動)
↓ /v1/chat/completions でタスク委任
↓ 完了を確認
↓ aws lightsail delete-instance(子インスタンス削除)
ポイントはタスク完了後の自動削除だ。常時起動ではなく、必要な時だけ起動してタスク完了後に削除することでコストを最適化できる。small_3_0 は $12/月だが、1時間単位の課金(約$0.016/時間)なので、短時間タスクなら非常に安価に運用できる。
Lightsailスナップショットを活用すれば、設定済みのインスタンス状態をテンプレート化でき、毎回のセットアップ時間を大幅に短縮できる。
フェーズ3: ハイブリッド構成(オプション)
ローカルGPUサーバーの活用も視野に入れると、3層構成が候補として挙がる。
┌────────────────────────────────────────────────────────────────┐
│ AIエージェントフリート(将来形) │
├────────────────┬───────────────────┬──────────────────────────┤
│ ローカルGPUサーバー│ AWS Lightsail │ Amazon Bedrock │
│ (オンプレ) │ (クラウド) │ (API) │
├────────────────┼───────────────────┼──────────────────────────┤
│ vLLM + ローカル │ 長時間バックグラウ │ 汎用推論・ │
│ モデル │ ンド処理 │ 高精度タスク │
│ 高速コーディング │ 常時監視系 │ 複雑な判断・対話 │
│ サブエージェント │ 定期バッチ処理 │ │
└────────────────┴───────────────────┴──────────────────────────┘
↑ メインエージェント(Tier 0)が指揮・調整
この3層構成では:
- ローカル(GPU サーバー): レイテンシが重要なリアルタイムコーディング支援
- クラウド(Lightsail): 常時稼働が必要な監視・定期処理
- API(Bedrock): 高精度・汎用推論が必要なタスク
をそれぞれ担い、コスト・速度・品質のバランスを最適化する体制が実現できる。
8. まとめ
本実験により、OpenClawをAWS Lightsailに展開し、メインインスタンスから制御する基礎的な仕組みが確立された。
詰まりポイント一覧(再掲)
| # | 深刻度 | 詰まりポイント | 発生タイミング | セクション |
|---|---|---|---|---|
| 1 | 🔴 高 | ExternalId問題でBedrockが使えない | IAMロール設定時 | Step 2 |
| 2 | 🟡 中 | sudo実行でconfig反映されない | OpenClaw設定時 | Step 3-1 |
| 3 | 🟡 中 | sandbox.mode=autoでexec失敗 | ツール実行テスト時 | Step 3-1 |
| 4 | 🟡 低 | サービス名間違い | サービス再起動時 | Step 2.5 |
| 5 | 🟡 中 | Stop/StartでIPが変わる | インスタンス再起動時 | Step 4 |
| 6 | 🟡 低 | ブラウザ接続にペアリング承認が必要 | GUI接続テスト時 | Step 4 |
実験で得られた主な知見
- OpenClaw Lightsailブループリント は実用的な品質で、AWS CLIから5分以内にOpenClawインスタンスを起動できる
- IAMロールによるBedrockアクセス はAPIキー不要で安全。ただし ExternalId は使用しないこと
- OpenAI互換API 経由でのタスク委任は既存ツールチェーンとの統合が容易
-
設定は必ず
ubuntuユーザーで実行(sudo を付けない) - sandbox.mode=off が現時点では必須(セキュリティ対策は要検討)
- Static IP は本番運用で必須
優先アクション
| 優先度 | アクション |
|---|---|
| 高 | Static IP付与手順の整備 |
| 高 | User DataスクリプトでOpenClaw自動アップデートの実装 |
| 中 | sandbox.mode=workerでの動作確認 |
| 中 | フリート管理スクリプト(起動→タスク委任→削除)の実装 |
| 低 | ローカルGPUサーバー連携PoC計画の策定 |
詰まりポイントは合計6項目あったが、いずれも解決策が明確であり、次回以降は同様の構成を30分程度で再現できる見込みだ。
OpenClaw Lightsailブループリントは、マルチインスタンスAIエージェント運用の現実的な選択肢として十分な実用性を持っていることが確認できた。
本記事の作成プロセスについて
本記事は約9割をOpenClaw(AIエージェント)が執筆し、残り約1割を人間が構成・校正・監修した。具体的には:
- 実験の実施・データ収集: ロベラ(RO635 / OpenClawエージェント)がLightsail上で全検証を自律実行
- 記事の構成・執筆: リヴァ(OpenClawエージェント)がロベラのレポートをQiita記事に再構成
- 校正・監修・方針決定: 人間(筆者)がレビューと最終判断
「AIエージェントフリート」の記事を「AIエージェントが書いている」という入れ子構造自体が、この技術の実用性を示していると言えるかもしれない。
付録: クイックスタートガイド
本実験の手順を再現するための最短手順をまとめる。
前提条件
- AWS CLI設定済み(
aws configure) - Lightsail操作権限のあるIAMユーザー
- IAMロール作成権限
手順(約30分)
# 1. インスタンス作成
aws lightsail create-instances \
--instance-names my-openclaw-child \
--availability-zone ap-northeast-1a \
--blueprint-id openclaw_ls_1_0 \
--bundle-id small_3_0 \
--region ap-northeast-1
# 2. 起動確認(running になるまで待つ)
aws lightsail get-instance \
--instance-name my-openclaw-child \
--query 'instance.state.name' --output text
# 3. ポート開放
aws lightsail open-instance-public-ports \
--instance-name my-openclaw-child \
--port-info fromPort=18789,toPort=18789,protocol=TCP \
--region ap-northeast-1
# 4. IPを確認
CHILD_IP=$(aws lightsail get-instance \
--instance-name my-openclaw-child \
--query 'instance.publicIpAddress' --output text)
echo "子インスタンスIP: ${CHILD_IP}"
# 5. IAMロール作成
# ※ <instance-id> はコンソールまたはメタデータAPIで事前に確認してください
INSTANCE_ID="<instance-id>"
aws iam create-role \
--role-name LightsailRoleFor-${INSTANCE_ID} \
--assume-role-policy-document "{
\"Version\": \"2012-10-17\",
\"Statement\": [{
\"Effect\": \"Allow\",
\"Principal\": {\"AWS\": \"arn:aws:iam::<lightsail-managed-account-id>:root\"},
\"Action\": \"sts:AssumeRole\"
}]
}"
aws iam put-role-policy \
--role-name LightsailRoleFor-${INSTANCE_ID} \
--policy-name BedrockAccess \
--policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": ["bedrock:InvokeModel","bedrock:InvokeModelWithResponseStream"],
"Resource": "*"
}]
}'
# 6. ヘルスチェック
curl -sk https://${CHILD_IP}/health
# → {"ok":true,"status":"live"}
# 7. GatewayトークンをLightsailブラウザSSHのMOTDから取得
# → GATEWAY_TOKEN=<your-gateway-token>
GATEWAY_TOKEN="<your-gateway-token>"
# 8. SSH接続してOpenClaw設定(sudo なし で実行すること!)
ssh ubuntu@${CHILD_IP} << 'EOF'
# 必要であれば最新版にアップデート
sudo npm install -g openclaw@latest
# HTTP API有効化(sudo なし!)
openclaw config set gateway.http.endpoints.chatCompletions.enabled true
# sandbox設定(sudo なし!)
openclaw config set agents.defaults.sandbox.mode off
# サービス再起動
sudo systemctl restart openclaw-gateway.service
EOF
# 9. テスト
curl -sk -X POST https://${CHILD_IP}/v1/chat/completions \
-H "Authorization: Bearer ${GATEWAY_TOKEN}" \
-H "Content-Type: application/json" \
-d '{"messages":[{"role":"user","content":"自己紹介してください"}],"stream":false}'
# 10. クリーンアップ(PoC完了後)
aws lightsail delete-instance \
--instance-name my-openclaw-child \
--force-delete-add-ons \
--region ap-northeast-1
aws iam delete-role-policy \
--role-name LightsailRoleFor-${INSTANCE_ID} \
--policy-name BedrockAccess
aws iam delete-role \
--role-name LightsailRoleFor-${INSTANCE_ID}
⚠️ ExternalIdは使わないこと(詰まりポイント #1 参照)
⚠️ openclaw config set は sudo なしで実行(詰まりポイント #2 参照)
⚠️ 本番運用では Static IP のアタッチを忘れずに(詰まりポイント #5 参照)



