- 1 マルチAIエージェントをクラウドで動かす — tmux × Claude Code CLIをEC2で常時稼働させるハンズオン
- 1.1 はじめに
- 1.2 Section 1: multi-agent-shogunとは
- 1.3 Section 2: なぜクラウドへ移行するのか
- 1.4 Section 3: アーキテクチャ概要
- 1.5 Section 4: スタンダード構成ハンズオン — Phase 1〜3(EC2起動〜環境構築〜multi-agent-shogunセットアップ)
- 1.6 Section 5: スタンダード構成ハンズオン — Phase 4〜7(systemd・ttyd/Nginx・Cloudflare Tunnel・Grafana/Loki)
- 1.7 Section 6: Cloudflare Access(Zero Trust)セキュリティ詳細設定
- 1.8 Section 7: Terraform IaC — スタンダード構成の全リソース定義
- 1.9 Section 8: ミニマル構成ハンズオン(差分手順)
- 1.10 Section 9: バックアップ設定
- 1.11 Section 10: コスト最適化・今後の展望・まとめ
マルチAIエージェントをクラウドで動かす — tmux × Claude Code CLIをEC2で常時稼働させるハンズオン
本記事は、おしお氏(@shio_shoppaize)が公開するオープンソースのマルチエージェントシステム
multi-agent-shogunをAWS EC2上でクラウド稼働させるハンズオンです。
ttydでブラウザからtmuxセッションを操作し、Cloudflare AccessでZero Trust認証、
Grafana+Lokiでログを可視化します。
3構成パターン($40〜$115/月)をコンソール操作とTerraformの両方で実践します。
公開日: 2026-04-14
難易度: 中級
所要時間: 約120〜180分
タグ: AWS, EC2, Claude Code, tmux, Cloudflare, Grafana, Terraform, ハンズオン, マルチエージェント
はじめに
「AIエージェントに仕事をさせたい。でも、Macを閉じたらエージェントが止まってしまう」
Claude Code CLIを使ったマルチエージェントシステムを運用していると、必ずこの壁にぶつかります。自宅のMac Miniで動かしているシステムは、再起動・スリープ・停電のたびにtmuxセッションが消え、すべてのエージェントが止まります。復旧には手動でログインして、セッションを張り直す必要があります。
この問題を根本的に解決するのが、AWS EC2への移行です。
本記事では、tmux × Claude Code CLIで構築するマルチAIエージェントシステム「multi-agent-shogun」をAWS EC2上に移植し、以下をすべて実現するハンズオンを実践します。
- 常時稼働: systemd
Restart=always+ EC2 Auto Recoveryで自動復旧 - リモートアクセス: ttyd + Cloudflare Tunnelでどこからでもブラウザでtmuxセッション操作
- Zero Trust認証: Cloudflare Access(MFA対応・無料)でセキュリティを担保
- ログ可視化: Grafana + Lokiでエージェントの動作をリアルタイムに監視
- 自動バックアップ: EBSスナップショット + GitHub cronで多層バックアップ
コスト帯別に3つの構成パターン($40〜$115/月)を用意しており、コンソール操作とTerraform IaCの両方で構築手順を解説します。
Section 1: multi-agent-shogunとは
1-1. おしお氏のmulti-agent-shogunプロジェクト紹介
multi-agent-shogunは、おしお氏(@shio_shoppaize)が公開するオープンソースのマルチAIエージェントシステムです。tmux + Claude Code CLIを組み合わせ、1台のLinuxマシン上で複数のClaudeインスタンスを並列稼働させ、役割分担しながら自律的にタスクを処理します。
このシステムの詳細は以下で公開されています:
- Zenn(解説記事): https://zenn.dev/shio_shoppaize
- GitHub(ソースコード): https://github.com/yohey-w/multi-agent-shogun
本記事では、このmulti-agent-shogunをAWS EC2上に移植し、常時稼働・リモートアクセス・自動復旧を実現するハンズオンを実践します。
1-2. システム構成(tmuxセッション・エージェント役割・通信方式)
tmuxセッション構成
multi-agent-shogunは2つのtmuxセッションで動作します。
| セッション | 内容 | ペイン数 |
|---|---|---|
shogun | 将軍(Shogun)エージェント | 1 |
multiagent | 家老・足軽・軍師エージェント | 9 |
multiagentセッションの内訳:
| ペイン番号 | エージェント名 | 役割 |
|---|---|---|
| 0 | 家老(Karo) | タスク管理・品質管理・足軽への指揮 |
| 1〜7 | 足軽1〜7(Ashigaru 1-7) | 実作業(記事執筆・コード実装等)並列処理 |
| 8 | 軍師(Gunshi) | 技術調査・canonical spec作成・QCレビュー |
エージェント役割一覧
| エージェント | 和名 | Claude モデル | 主な責務 |
|---|---|---|---|
| Shogun(将軍) | 殿 | claude-opus-4-6 | 戦略立案・コマンド発令・最終承認 |
| Karo(家老) | 家老 | claude-opus-4-6 | タスク分解・品質管理・足軽への指示 |
| Gunshi(軍師) | 軍師 | claude-opus-4-6 | 技術調査・canonical spec作成・QCレビュー |
| Ashigaru(足軽) | 足軽 | claude-sonnet-4-6 | 実際の執筆・コーディング・投稿作業 |
将軍・家老・軍師は意思決定に強いOpusを使用し、量的作業をこなす足軽はコスト効率の良いSonnetを使用します。これによりコストを抑えながら品質を維持します。
ファイルベース通信方式
各エージェントはClaude Code CLIとして動作し(claude --model opus/sonnet)、以下の3層構造でメッセージをやり取りします。
Layer 1: メッセージ書き込み(inbox_write.sh)
送信エージェントが bash scripts/inbox_write.sh <宛先> "<メッセージ>" <タイプ> <送信元> を実行します。flockによる排他制御で queue/inbox/{エージェント名}.yaml に安全に書き込みます。
Layer 2: ファイル監視(inbox_watcher.sh)
inotifywait がinboxファイルの変更を検知し、宛先エージェントのtmuxペインにNudge文字列(inbox1 等)を送信します。
Layer 3: メッセージ読み取り(エージェント本体)
エージェントはNudgeを受け取るとinboxファイルを読み込み、read: false のメッセージを処理して read: true に更新します。メッセージ本文はすべてファイル経由で伝達されるため、tmuxのペインバッファに機密情報が残りません。
この設計により、エージェント間の通信はすべてファイルシステムを通して行われ、tmuxセッションの状態(スクロールバッファ・コンソール表示)に依存しない堅牢なメッセージングを実現しています。
1-3. エージェント通信フロー図

上図は将軍から足軽へのコマンド伝達フローと、足軽から家老への報告フローを示しています。指揮系統(将軍→家老→足軽)と報告系統(足軽→軍師→家老)が明確に分離されています。
本記事では、これをAWS EC2に移行する手順を解説します。
移行後もtmuxセッション構成・通信方式・ファイル構造は完全に同一です。
「どのマシンで動くか」だけが変わります。
Section 2: なぜクラウドへ移行するのか
2-1. Mac Mini現状の課題
現在、multi-agent-shogunはMac Mini(Apple Silicon)上でローカル稼働しています。24時間×365日の自律稼働を目指すうえで、以下の課題があります。
| 課題 | 内容 |
|---|---|
| 電源断リスク | 停電・再起動でtmuxセッションが消失。手動復旧が必要 |
| リモートアクセス不可 | 自宅外からtmuxセッションを操作できない(VPN/SSHが必要で操作性が悪い) |
| スリープによる停止 | macOSのスリープ制御が干渉し、長時間稼働中にセッションが消失することがある |
| スケーラビリティの限界 | Mac Miniのハードウェアリソース上限(16GB RAM)に縛られる |
| バックアップ不備 | GitHub pushが手動依存で、作業途中のデータが失われるリスクがある |
| 可観測性の欠如 | エージェントのログやメトリクス収集の仕組みが限定的 |
特に電源断リスクは深刻です。tmuxセッションが消失すると、実行中のタスクがすべて失われ、エージェントの復旧には手動介入が必要になります。AIエージェントによる自律処理の継続性を損なう最大の課題です。
2-2. クラウド移行で得られるもの
AWS EC2への移行により、上記の課題をすべて解消できます。
| メリット | 説明 |
|---|---|
| 常時稼働 | systemd Restart=always + EC2 Auto Recoveryで自動復旧 |
| リモートアクセス | ttyd + Cloudflare Tunnelでブラウザからどこでも操作可能 |
| 自動バックアップ | EBSスナップショット(DLM日次)+ GitHub cronでバックアップ |
| 監視・可観測性 | Grafana + Lokiでログ・メトリクスをリアルタイム表示 |
| スケーリング容易 | インスタンスタイプ変更でリソース調整(ダウンタイム最小) |
| セキュリティ強化 | Cloudflare AccessでZero Trust認証(MFA対応・無料)。SGインバウンド全閉鎖可能 |
| コスト可視化 | AWS BudgetsでEC2コスト + API利用量を追跡 |
EC2の自動復旧(Restart=always)により、万が一エージェントプロセスが異常終了しても30秒以内に自動再起動します。停電後もEC2が再起動すればsystemdが自動でエージェントを起動します。
2-3. 要件一覧(A〜L)
multi-agent-shogunをクラウドで稼働させるための要件を12項目に整理します。
| ID | 要件 | 説明 |
|---|---|---|
| A | コンピュート | EC2でtmux + Claude Code CLI 10並列稼働 |
| B | Web UI | ブラウザからtmuxセッション操作(ttyd) |
| C | MD保存・プレビュー | Markdownファイルの管理・閲覧(GitHubリポジトリ経由) |
| D | スマホ通知 | ntfy連携によるプッシュ通知(既実装済み、URL変更のみ) |
| E | 自動復旧 | systemd + EC2 Auto Recovery(StatusCheckFailed時) |
| F | ダッシュボード | Grafana + Lokiリアルタイムログ表示 |
| G | コスト監視 | AWS Budgets + Claude API利用量追跡 |
| H | ログビューア | Grafana Lokiでエージェントログ検索・フィルタリング |
| I | GitHub連携 | SSH key + gh CLI 自動push・PR作成 |
| J | スケジューラ | cron / systemd timer(バックアップ・メトリクス収集) |
| K | セキュリティ | 4パターン比較(K1〜K4、後述) |
| L | バックアップ | GitHub自動push(30分ごと)+ EBSスナップショット(DLM日次) |
そのため、
ECS FargateやAWS LambdaではなくEC2を使います。Fargateはptyアクセス不可、Lambdaは15分実行上限かつステートレスのため、
tmux + Claude Code CLIの常時稼働構成には対応できません。
また、Linuxでは
inotifywait(inotify-tools)を使用します(macOS向けfswatchとは異なります)。Section 3: アーキテクチャ概要
本記事ではスタンダード構成($50/月)を実践します。ミニマル構成($40/月)との差分手順はSection 8で別途解説します。
3-1. 3構成パターン比較表
目的・予算・セキュリティ要件に応じて3つの構成パターンから選択できます。
| 項目 | ミニマル | スタンダード ★推奨 | フル |
|---|---|---|---|
| 月額コスト | $40 | $50 | $115 |
| EC2インスタンス | t3.large | m5.large | m5.xlarge |
| vCPU / メモリ | 2vCPU / 8GB | 2vCPU / 8GB | 4vCPU / 16GB |
| EBS | gp3 30GB | gp3 50GB | gp3 100GB |
| Web UI | ttyd + Nginx | ttyd + Cloudflare Tunnel | ttyd + ALB |
| 認証 | Basic認証(K1) | Cloudflare Access(K2) | Cognito + ALB(K3) |
| MFA | × | ○(無料) | ○($16/月〜) |
| 監視 | Node.js簡易 | Grafana + Loki | Grafana + Loki + Prometheus |
| 通知 | ntfy.sh | ntfy.sh | ntfy セルフホスト |
| バックアップ | GitHub push | GitHub + EBS DLM | GitHub + EBS + S3 |
| 適したケース | 個人・開発用 | 本番・推奨 | エンタープライズ |
このハンズオンではスタンダード構成($50/月)を実践します。 ミニマル構成への切替差分はSection 8で解説します。
各パターンの推奨ケース:
- ミニマル($40/月): 個人利用・コスト最優先・外部アクセスが少ない場合
- スタンダード($50/月): 本番利用・セキュリティ重視・Grafana監視が欲しい場合
- フル($115/月): 10エージェント同時稼働・エンタープライズグレード・チーム利用
3-2. コンピュートオプション比較
EC2インスタンスタイプ比較:
| タイプ | vCPU | メモリ | 月額 (On-Demand) | 月額 (SP 1年) | 評価 | 備考 |
|---|---|---|---|---|---|---|
| t3.medium | 2 | 4GB | $30 | $18 | △ | テスト・開発用。10並列には不足 |
| t3.large | 2 | 8GB | $60 | $36 | ○ | バースト性能あり。5〜7エージェント向け |
| m5.large | 2 | 8GB | $70 | $42 | ○★ | バースト制限なし。安定稼働。スタンダード推奨 |
| m5.xlarge | 4 | 16GB | $140 | $84 | ◎ | 10並列に十分なリソース。フル構成向け |
| c5.xlarge | 4 | 8GB | $124 | $74 | △ | CPU最適化だがメモリ不足の可能性 |
t3系はバーストクレジットを消費し切ると性能が大幅低下します。Claude Code CLIは継続的にCPUを使うため、バースト制限のないm5系を推奨します。
EC2 Savings Plans(1年コミット)を購入すると月額が約40%割引になります。m5.largeは$70→$42(月$28節約、年$336節約)。長期稼働を前提とする場合は必ず検討してください。購入手順はSection 10で解説します。
ECS Fargate / LambdaがNGな理由:
| サービス | 不適理由 |
|---|---|
| ECS Fargate | tmuxセッション + インタラクティブCLI(pty)と非互換。コンテナにptyアクセス不可 |
| AWS Lambda | 15分実行上限・ステートレス・pty不可。常時稼働・状態保持の要件に完全非対応 |
Claude Code CLIは対話型ターミナル(pty)が必須のため、サーバーレスサービスは利用できません。EC2が最適解です。
他クラウドとの比較(参考):
| クラウド | スペック | 月額 | 評価 |
|---|---|---|---|
| AWS EC2 m5.large(東京) | 2vCPU, 8GB | $42(SP適用後) | ★★★★★ |
| GCP e2-standard-2(東京) | 2vCPU, 8GB | $65 | ★★★★☆ |
| GCP e2-standard-2(us-central1) | 2vCPU, 8GB | $49 | ★★★★☆ |
| Azure B2s(東日本) | 2vCPU, 4GB | $30程度 | ★★★☆☆ |
| AWS Lightsail 4GB | 2vCPU, 4GB | $40 | ★★★☆☆ |
| Hetzner Cloud CPX31 | 4vCPU, 8GB | €14(約$15) | ★★★☆☆ |
AWSが東京リージョンの安定性・AWSサービス連携(CloudWatch, Budgets, DLM等)で最優位です。
3-3. セキュリティ4パターン比較(K1〜K4)
ttydによるtmux Web UIは外部公開するため、適切な認証が必要です。4つのパターンを比較します。
| パターン | 方式 | 対応クラウド | MFA | 月額 | 推奨度 |
|---|---|---|---|---|---|
| K1 | Nginx + Basic認証 + Let’s Encrypt | 全環境 | × | 無料 | ★★★★☆ ミニマル |
| K2 | Cloudflare Access + Tunnel | 全環境 | ○ | 無料(50ユーザー) | ★★★★★ スタンダード★ |
| K3 | AWS Cognito + ALB | AWS限定 | ○ | $16/月〜 | ★★★☆☆ フル(AWS) |
| K4 | OAuth2 Proxy + GitHub/Google | 全環境 | ○(IdP側) | 無料 | ★★★★☆ 代替 |
K1: Nginx + Basic認証 + Let’s Encrypt(ミニマル構成用)
最もシンプルな構成。Nginxリバースプロキシ + htpasswdによるBasic認証 + certbotでTLS証明書を取得します。
- 長所: セットアップが最も簡単・追加コストゼロ・全クラウド対応
- 短所: Basic認証のセキュリティは限定的(パスワード漏洩リスク)・MFA不可・DDoS対策なし
- 適用: ミニマル構成、社内限定・個人開発サーバー
K2: Cloudflare Access(Zero Trust)+ Cloudflare Tunnel(スタンダード構成★推奨)
EC2からCloudflare EdgeへのアウトバウンドTunnelを確立します。インバウンドポートの開放が不要で、Cloudflare Accessで認証(Google/GitHubアカウント + MFA)します。
- 長所: ポート開放不要(SG完全閉鎖可能)・無料枠あり(50ユーザー)・MFA対応・DDoS防御付き
- 短所: Cloudflare依存(Cloudflareが落ちるとアクセス不可)・独自ドメインが必要
- 適用: スタンダード/フル構成推奨。本番サーバーの認証はこれを推奨
K3: AWS Cognito + ALB(フル構成用)
AWSネイティブのフルマネージド認証。ALBがOAuth2フローを処理し、Cognitoユーザープールで認証管理します。
- 長所: AWSネイティブ統合・MFA対応・ユーザー管理UI付き・企業ユースに対応
- 短所: AWS限定・ALBコスト($16/月〜)・Cognitoセットアップが複雑
- 適用: フル構成(AWS予算$115/月)・企業ユース
K4: OAuth2 Proxy + GitHub/Google OAuth(K2代替)
oauth2-proxy(Go製)をNginxと組み合わせます。GitHub OrganizationやGoogle WorkspaceのIdPで認証制限が可能です。
- 長所: GitHub/Googleアカウントで認証・GitHub Org制限可・MFA対応(IdP側)
- 短所: セットアップやや複雑・外部IdP依存
- 適用: K2の代替(独自ドメインなし等の場合)
3-4. コスト試算表
インフラコスト一覧:
| コンポーネント | ミニマル($40/月) | スタンダード($50/月) | フル($115/月) |
|---|---|---|---|
| EC2(Savings Plans 1年) | t3.large $36 | m5.large $42 | m5.xlarge $84 |
| EBS gp3 | 30GB / $2.4 | 50GB / $4 | 100GB / $8 |
| ALB | — | — | $16 |
| Cloudflare(Access + Tunnel) | — | $0(無料枠) | — |
| AWS Cognito | — | — | $0(50,000 MAUまで) |
| EBSスナップショット(DLM日次) | — | $1 | $2 |
| S3バックアップ | — | — | $1 |
| データ転送 | $1 | $2 | $3 |
| 合計 | ≈ $40/月 | ≈ $50/月 | ≈ $115/月 |
Claude API利用コスト試算(重要):
インフラコストの見積もりだけでなく、Claude APIの利用コストを必ず計算してください。インフラより API費用が大幅に上回る場合があります。
| 項目 | 概算 |
|---|---|
| 1タスクあたり | 約500K〜1M input tokens + 200K〜500K output tokens |
| 10エージェント × 8時間稼働/日 × 30日 | 月間50M〜100M tokens |
| Opus料金 | $15/1M input + $75/1M output |
| Sonnet料金 | $3/1M input + $15/1M output |
| 混合使用(Opus 2割 + Sonnet 8割)概算 | $300〜800/月 |
Max plan($200/月固定)との比較:
| 方式 | 月額 | 向いているケース |
|---|---|---|
| Claude API直接 | 従量課金($300〜800/月) | 使用量が多く予測可能な場合 |
| Claude Max plan | $200/月(固定) | 使用量が中程度の場合 |
インフラの$50/月に対し、Claude API費用は$300〜800/月と6〜16倍に達する場合があります。
Max plan($200/月固定)の方がコスト効率が良い場合もあります。
まず1〜2週間API直接利用で実際の使用量を計測し、Max planと比較することを推奨します。
3-5. 全体アーキテクチャ図(スタンダード構成)

スタンダード構成の主要コンポーネントと役割:
| コンポーネント | 用途 | ホスト先 |
|---|---|---|
| EC2 m5.large | tmuxセッション + 全エージェントをホスト | AWS ap-northeast-1 |
| ttyd | tmuxセッションをWebブラウザで操作可能にするTerminal-over-HTTP | EC2上(ポート7681) |
| Nginx | ttydへのリバースプロキシ(WebSocket対応) | EC2上(ポート8080) |
| cloudflared(Cloudflare Tunnel) | EC2→Cloudflare間のアウトバウンドTunnel | EC2上(outbound only) |
| Cloudflare Access | Zero Trust認証(MFA対応・無料) | Cloudflare Edge |
| Grafana + Loki | エージェントログのリアルタイム可視化 | EC2上(Docker Compose) |
| EBSスナップショット | 日次自動スナップショット(DLM) | AWS EBS |
| GitHub | ソースコード・記事ファイルの自動バックアップ | GitHub.com |
通信フロー(ブラウザ → tmux):
ブラウザ → Cloudflare Access(認証・MFA)→ Cloudflare Tunnel → EC2 Nginx(127.0.0.1:8080)→ ttyd(:7681)→ tmux multiagent
EC2のセキュリティグループはインバウンドを完全に閉鎖できます(Cloudflare Tunnelはアウトバウンド接続のみ使用)。
- EC2: m5.large(2vCPU, 8GB)— Amazon Linux 2023
- セキュリティ: K2 — Cloudflare Access + Tunnel(MFA対応・ポート開放不要)
- 監視: Grafana + Loki(Docker Compose)
- バックアップ: GitHub自動push(30分ごと)+ EBSスナップショット(DLM日次)
- 月額コスト目安: ≈ $50/月(EC2 Savings Plans適用後)
ミニマル構成($40/月)との差分手順はSection 8で解説します。
Section 4: スタンダード構成ハンズオン — Phase 1〜3(EC2起動〜環境構築〜multi-agent-shogunセットアップ)
4-0. ハンズオン全体フロー
本ハンズオンでは7つのPhaseに分けてスタンダード構成を構築します。各Phaseの内容と目安時間を以下に示します。
| Phase | 内容 | 目安時間 |
|---|---|---|
| Phase 1 | EC2インスタンス起動 | 10分 |
| Phase 2 | 環境セットアップ | 15分 |
| Phase 3 | multi-agent-shogunセットアップ | 10分 |
| Phase 4 | systemdサービス登録 | 5分 |
| Phase 5 | ttyd + Nginx設定 | 10分 |
| Phase 6 | Cloudflare Tunnel + Access | 20分 |
| Phase 7 | Grafana + Loki監視 | 15分 |
合計所要時間の目安は約85分です。AWS初心者の方は余裕を持って2〜3時間を確保することをおすすめします。
Section 4ではPhase 1〜3、Section 5ではPhase 4〜7を扱います。
4-1. Phase 1: EC2インスタンス起動
AWSコンソールからEC2インスタンスを起動します。
コンソール操作手順
- AWSマネジメントコンソールにサインインし、リージョンを アジアパシフィック(東京)ap-northeast-1 に切り替えます
- 検索バーに「EC2」と入力し、EC2コンソールを開きます
- 左メニューの「インスタンス」→「インスタンスを起動」をクリックします
名前とタグ:
– Name: multi-agent-shogun
AMI(Amazonマシンイメージ)の選択:
– クイックスタートの「Amazon Linux」を選択
– AMI: Amazon Linux 2023 AMI(al2023-ami-2023.*-x86_64)を選択します
– アーキテクチャ: x86_64(Arm版ではなく通常版を選択)
このハンズオンでは
dnfパッケージマネージャを使用するAmazon Linux 2023を前提にしています。Amazon Linux 2(yumを使用)は2025年6月にEOLを迎えるため、AL2023を選択してください。インスタンスタイプの選択:
– インスタンスタイプ: m5.large(2vCPU, 8GB RAM)
Claude Code CLIは1エージェントあたり約500MB〜1GBのメモリを使用します。8エージェント同時稼働には最低8GBが必要なため
m5.largeを推奨します。コスト優先ならt3.large(ミニマル構成)も可能ですが、CPUバースト制限に注意してください。キーペアの設定:
1. 「新しいキーペアの作成」をクリック
2. キーペア名: multi-agent-key
3. キーペアのタイプ: RSA
4. プライベートキーファイルの形式: .pem(Mac/Linux向け)
5. 「キーペアを作成」をクリック → .pemファイルが自動でダウンロードされます
ネットワーク設定:
1. 「編集」をクリックしてネットワーク設定を展開します
2. VPC: デフォルトVPC(vpc-xxxxxxxx)を選択
3. サブネット: 任意のアベイラビリティーゾーンを選択
4. パブリックIPの自動割り当て: 有効化
5. ファイアウォール(セキュリティグループ): 「セキュリティグループを作成する」を選択
– セキュリティグループ名: multi-agent-sg
– 説明: Security group for multi-agent-shogun
6. インバウンドセキュリティグループのルール:
– タイプ: SSH、プロトコル: TCP、ポート: 22
– ソース: マイIP(自分のIPアドレスのみを許可)
Phase 6でCloudflare Tunnelを設定したあと、SSHポートを含むすべてのインバウンドルールを削除します。現時点では初期セットアップのためにSSHのみ許可しておきます。
ストレージ(ボリューム)の設定:
1. 「1x」ボリュームを展開します
2. ストレージのサイズ: 50 GiB
3. ボリュームタイプ: gp3
インスタンスの起動:
– 「インスタンスを起動」ボタンをクリックします
– 起動成功のメッセージが表示されたら「すべてのインスタンスを表示」をクリックします
– インスタンスのステータスが「実行中」になるまで待ちます(1〜2分程度)
SSH接続の確認
インスタンスが起動したら、SSH接続を確認します。
# ダウンロードしたキーファイルの権限を変更(Mac/Linux)chmod 400 ~/Downloads/multi-agent-key.pem# EC2インスタンスのパブリックIPアドレスを確認(コンソールで確認)# 以下のコマンドでSSH接続ssh -i ~/Downloads/multi-agent-key.pem ec2-user@<PUBLIC_IP>接続成功すると以下のようなプロンプトが表示されます。
, #_~\_ ####_ Amazon Linux 2023 ~~ \_#####\ ~~ \###| AL2023 ~~ \#/ ___~~ V~' '-> ~~~/~~._._/_/ _/ _/m/'[ec2-user@ip-xxx-xxx-xxx-xxx ~]$4-2. Phase 2: 環境セットアップ
EC2インスタンスに必要なパッケージをすべてインストールします。
全パッケージの一括インストール
以下のコマンドをSSH接続したEC2インスタンスで実行します。
# システム更新(最初に必ず実行)sudo dnf update -y# 基本ツール一括インストールsudo dnf install -y git tmux jq curl wget unzip# inotify-tools(エージェント間通信の要)sudo dnf install -y inotify-toolsinotifywaitコマンドはinbox_watcher.shがファイル変更を検知するために使用します。インストールを忘れるとエージェント間通信が完全に停止します。必ず確認してください。# Node.js 20.x(Claude Code CLI の依存)curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -sudo dnf install -y nodejs# Claude Code CLI(公式パッケージ)sudo npm install -g @anthropic-ai/claude-code# Docker(Grafana + Loki用)sudo dnf install -y dockersudo systemctl enable dockersudo systemctl start dockersudo usermod -aG docker ec2-user# ※ グループ変更を反映するにはSSH再接続が必要# docker-compose v2(プラグイン方式)sudo mkdir -p /usr/local/lib/docker/cli-pluginssudo curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 \ -o /usr/local/lib/docker/cli-plugins/docker-composesudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose# Nginx(リバースプロキシ)sudo dnf install -y nginx# ttyd(tmux Web UI)— GitHub Releasesからバイナリ取得TTYD_VERSION=$(curl -s https://api.github.com/repos/tsl0922/ttyd/releases/latest \ | python3 -c "import sys,json; print(json.load(sys.stdin)['tag_name'])")sudo curl -L "https://github.com/tsl0922/ttyd/releases/download/${TTYD_VERSION}/ttyd.x86_64" \ -o /usr/local/bin/ttydsudo chmod +x /usr/local/bin/ttydバージョン確認
インストールが完了したら、各コンポーネントのバージョンを確認します。
node --version # v20.x.xclaude --version# Claude Code x.x.xttyd --version # ttyd/x.x.xdocker --version# Docker version 25.x.xdocker compose version # Docker Compose version v2.x.xtmux -V# tmux 3.xinotifywait --help # inotify-tools のバージョン確認(--help でエラーなければOK)git --version# git version 2.x.xsudo npm install -g @anthropic-ai/claude-code後にclaudeコマンドが見つからない場合は、source ~/.bashrcまたは再ログインを試してください。それでも解決しない場合はwhich claudeでパスを確認し、/usr/local/binにシンボリックリンクを作成します。4-3. Phase 3: multi-agent-shogunセットアップ
GitHubからリポジトリをcloneし、multi-agent-shogunを設定します。
GitHub SSH鍵の設定
# SSH鍵を生成(パスフレーズなし)ssh-keygen -t ed25519 -C "ec2-multi-agent" -f ~/.ssh/id_ed25519 -N ""# 公開鍵を表示cat ~/.ssh/id_ed25519.pub表示された公開鍵(ssh-ed25519 AAAA...で始まる文字列)をコピーし、GitHubに登録します。
GitHubへの登録手順:
1. GitHub.com → 右上のアバター → Settings
2. 左サイドバー → SSH and GPG keys → 「New SSH key」
3. Title: ec2-multi-agent、Key type: Authentication Key
4. Key: コピーした公開鍵を貼り付け → 「Add SSH key」
SSH接続の確認:
ssh -T git@github.com# "Hi username! You've successfully authenticated." が表示されれば成功リポジトリのcloneと設定
# multi-agent-shogunリポジトリをclonegit clone git@github.com:yohey-w/multi-agent-shogun.git ~/multi-agent-shoguncd ~/multi-agent-shogun# ディレクトリ構造を確認ls -la設定ファイルの確認・編集:
# 設定ファイルを開くvi config/settings.yaml主な設定項目:
# config/settings.yaml の主要設定(例)agents: ashigaru_count: 7 # 足軽エージェント数(環境に応じて調整)notification: ntfy_url: "https://ntfy.sh/your-topic" # ntfy通知先URLscreenshot: path: "/home/ec2-user/screenshots"APIキーは
~/.bashrcではなく/etc/systemd/system/multi-agent.serviceのEnvironment=ディレクティブで設定することを推奨します(次のPhase 4で説明)。systemdが起動するプロセスはbashrcを読み込まないためです。動作テスト(手動起動)
systemdに登録する前に、手動でtmuxセッションを起動してClaude Code CLIが動作するか確認します。
# Claudeのバージョン確認claude --version# tmuxセッション手動起動テストtmux new-session -d -s test -x 220 -y 50tmux send-keys -t test "echo 'multi-agent-shogun OK'" Entersleep 2tmux capture-pane -t test -p# "multi-agent-shogun OK" が出力されれば成功tmux kill-session -t testClaude Code CLIの認証確認:
# Claude Code CLIの認証状態を確認# (初回はブラウザ認証またはAPIキー設定が必要)claude --dangerously-skip-permissions --versionEC2インスタンスにはブラウザがないため、ブラウザ認証ではなくAPIキーによる認証を使用します。
ANTHROPIC_API_KEY環境変数に有効なAPIキーを設定することで認証が完了します。Section 5: スタンダード構成ハンズオン — Phase 4〜7(systemd・ttyd/Nginx・Cloudflare Tunnel・Grafana/Loki)
5-1. Phase 4: systemdサービス登録
EC2インスタンスの起動時にmulti-agent-shogunが自動起動するよう、systemdサービスとして登録します。
multi-agent.serviceの作成
# systemdユニットファイルを作成sudo vi /etc/systemd/system/multi-agent.service以下の内容を入力します:
[Unit]Description=Multi-Agent Shogun SystemAfter=network.targetWants=network.target[Service]Type=forkingUser=ec2-userWorkingDirectory=/home/ec2-user/multi-agent-shogunEnvironment=ANTHROPIC_API_KEY=sk-ant-xxxxxEnvironment=HOME=/home/ec2-userEnvironment=PATH=/usr/local/bin:/usr/bin:/binExecStart=/home/ec2-user/multi-agent-shogun/scripts/start_agents.shExecStop=/usr/bin/tmux kill-session -t multiagentRestart=alwaysRestartSec=30TimeoutStartSec=60[Install]WantedBy=multi-user.targetANTHROPIC_API_KEYを正しい値に変更してくださいsk-ant-xxxxxの部分をAnthropicコンソールで発行した実際のAPIキーに置き換えてください。Anthropicコンソール(console.anthropic.com)→ API Keys → 「Create Key」で発行できます。ttyd.serviceの作成
ttydをsystemdサービスとして登録し、multi-agent.service起動後に自動起動させます。
sudo vi /etc/systemd/system/ttyd.service[Unit]Description=ttyd Web Terminal for tmuxAfter=network.target multi-agent.serviceWants=multi-agent.service[Service]Type=simpleUser=ec2-userEnvironment=HOME=/home/ec2-userExecStartPre=/bin/sleep 5ExecStart=/usr/local/bin/ttyd -W -p 7681 tmux attach -t multiagentRestart=alwaysRestartSec=10[Install]WantedBy=multi-user.targetExecStartPre=/bin/sleep 5の意味multi-agent.serviceが起動してtmuxセッションmultiagentが生成されるまでの待機時間です。tmuxセッションが存在しない状態でttydを起動するとエラーになるため、5秒の余裕を設けています。サービスの有効化と起動
# systemdの設定をリロードsudo systemctl daemon-reload# 両サービスを自動起動に設定sudo systemctl enable multi-agent.service ttyd.service# multi-agent.serviceを先に起動sudo systemctl start multi-agent.service# tmuxセッション生成を待つ(30秒)sleep 30# ttyd.serviceを起動sudo systemctl start ttyd.service# 状態確認sudo systemctl status multi-agent.servicesudo systemctl status ttyd.service# ログ確認journalctl -u multi-agent.service -n 50journalctl -u ttyd.service -n 20Restart=alwaysの重要性EC2インスタンスが再起動した場合や、エージェントがクラッシュした場合に自動的に再起動します。
RestartSec=30で30秒後に再試行します。これがクラウド移行で得られる「常時稼働」の核心です。5-2. Phase 5: ttyd + Nginx設定
ttydをNginxのリバースプロキシ経由で公開します。この段階では内部(localhost)への接続のみ許可し、外部アクセスはPhase 6のCloudflare Tunnel経由に限定します。
Nginx設定ファイルの作成
sudo vi /etc/nginx/conf.d/ttyd.confserver { listen 80; server_name _; location / { proxy_pass http://127.0.0.1:7681; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_read_timeout 43200s; proxy_send_timeout 43200s; }}proxy_read_timeout 43200sの設定理由ttydはWebSocketを使用したリアルタイム通信を行います。デフォルトのNginxタイムアウト(60秒)のままだと、操作が止まった状態が60秒続くとセッションが切断されます。
43200s(12時間)に設定することで、長時間のセッションも維持できます。Nginxの起動と確認
# デフォルト設定との競合を避けるため削除sudo rm /etc/nginx/conf.d/default.conf 2>/dev/null || true# 設定ファイルの構文チェックsudo nginx -t# nginx: configuration file /etc/nginx/nginx.conf test is successful# Nginxを自動起動に設定して起動sudo systemctl enable nginxsudo systemctl start nginx# 動作確認(ローカルからHTTPリクエスト送信)curl -s -o /dev/null -w "%{http_code}" http://localhost/# 200 または 101 が返れば成功curl http://localhost/でttydのHTMLが返ってくれば成功です。外部からのアクセスはまだSGでブロックされています(意図的)。次のPhase 6でCloudflare Tunnelを設定してから外部アクセスを開通させます。5-3. Phase 6: Cloudflare Tunnel + Access設定
Cloudflare TunnelでEC2からCloudflare Edgeへのアウトバウンドトンネルを確立し、Cloudflare Accessで認証を設定します。EC2のセキュリティグループにポートを開放する必要はありません。
前提条件:
– Cloudflareアカウント(無料)
– Cloudflareに登録済みのドメイン(例: yourdomain.com)
cloudflaredのインストール(Amazon Linux 2023)
# cloudflared RPMパッケージを直接インストールsudo dnf install -y https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm# バージョン確認cloudflared --version# cloudflared version 2024.x.xCloudflare DashboardでTunnelを作成
- Cloudflare Dashboard(dash.cloudflare.com)にログイン
- 左サイドバー → Zero Trust をクリック
- Networks → Tunnels → 「Create a Tunnel」 をクリック
- コネクタの選択: 「Cloudflared」 を選択 → 「Next」
- Tunnel名:
multi-agent-tunnelと入力 → 「Save Tunnel」 - 「Install and run a connector」画面で 「Debian」 または 「Red Hat」 を選択し、表示されるトークン(
eyJxxx...形式の長い文字列)をコピーします
EC2にTunnelサービスを登録
# コピーしたトークンを使ってsystemdサービスとしてインストールsudo cloudflared service install <TUNNEL_TOKEN># <TUNNEL_TOKEN> をコピーしたトークンに置き換え# サービスの有効化と起動sudo systemctl enable cloudflaredsudo systemctl start cloudflaredsudo systemctl status cloudflared# Active: active (running) が表示されれば成功ホスト名の設定(Cloudflare Dashboard)
- Tunnels一覧 → 作成したTunnel
multi-agent-tunnel→ 「Configure」 をクリック - 「Public Hostname」 タブ → 「Add a public hostname」 をクリック
- 以下の設定を入力:
- Subdomain:
agent - Domain: プルダウンからあなたのドメインを選択
- Service Type: HTTP
- URL:
localhost:80 - 「Save hostname」 をクリック
これで https://agent.yourdomain.com がEC2のlocalhost:80(Nginx → ttyd)に転送されます。
Cloudflare Access(Zero Trust認証)の設定
- Zero Trust → Access → Applications → 「Add an application」
- Type: 「Self-hosted」 を選択
- 以下を入力:
- Application name:
Multi Agent Shogun - Application domain:
agent.yourdomain.com - 「Next」 をクリック
- ポリシーの設定:
- Policy name:
Allow Owner - Action: Allow
- Include: Emails → テキストボックスにあなたのメールアドレスを入力
- 「Next」 → 「Add application」 をクリック
セキュリティグループの全閉鎖
Cloudflare Tunnelが正常に動作していることを確認したあと、EC2のセキュリティグループからSSH(22)を削除します。
- EC2コンソール → セキュリティグループ →
multi-agent-sgを選択 - 「インバウンドルール」 タブ → 「インバウンドのルールを編集」
- SSH(22)のルール行にある 「削除」 をクリック
- 「ルールを保存」 をクリック
セキュリティグループからSSH(22)を削除すると、直接SSHはできなくなります。緊急時はAWSコンソールの「EC2 Instance Connect」(Amazon Linux 2023でデフォルト有効)か、AWS Systems Manager Session Managerを使用してください。
動作確認
# cloudflared接続状態の確認sudo systemctl status cloudflared# HEALTH CHECK に "healthy" が表示されれば成功# ブラウザで以下にアクセス# https://agent.yourdomain.com# → Cloudflare Accessのメールアドレス入力画面# → メールアドレス入力 → ワンタイムコードがメールに届く# → コード入力 → tmuxターミナルが表示される5-4. Phase 7: Grafana + Loki + Promtail(Docker Compose)
Grafana + Loki + Promtailを使い、エージェントのログをリアルタイムで可視化します。
docker-compose.ymlの作成
mkdir -p ~/multi-agent-shogun/monitoringcd ~/multi-agent-shogun/monitoringvi docker-compose.ymlversion: '3.8'services: loki: image: grafana/loki:2.9.0 ports:- "127.0.0.1:3100:3100" volumes:- loki-data:/loki command: -config.file=/etc/loki/local-config.yaml restart: unless-stopped promtail: image: grafana/promtail:2.9.0 volumes:- /home/ec2-user/multi-agent-shogun/queue:/queue:ro- /var/log:/var/log:ro- ./promtail-config.yml:/etc/promtail/config.yml:ro command: -config.file=/etc/promtail/config.yml restart: unless-stopped depends_on:- loki grafana: image: grafana/grafana:10.2.0 ports:- "127.0.0.1:3000:3000" volumes:- grafana-data:/var/lib/grafana environment:- GF_AUTH_ANONYMOUS_ENABLED=false- GF_SECURITY_ADMIN_PASSWORD=changeme_strong_password restart: unless-stopped depends_on:- lokivolumes: loki-data: grafana-data:GF_SECURITY_ADMIN_PASSWORDを必ず変更してくださいchangeme_strong_passwordは必ず強力なパスワードに変更してください。このパスワードはGrafanaの管理者パスワードになります。英数字・記号を含む12文字以上を推奨します。promtail-config.ymlの作成
vi ~/multi-agent-shogun/monitoring/promtail-config.ymlserver: http_listen_port: 9080 grpc_listen_port: 0positions: filename: /tmp/positions.yamlclients: - url: http://loki:3100/loki/api/v1/pushscrape_configs: - job_name: multi-agent-queue static_configs:- targets: - localhost labels: job: multi-agent __path__: /queue/reports30 * * * * /home/ec2-user/multi-agent-shogun/scripts/auto_backup.sh# 1時間ごとにシステムメトリクス記録(オプション)0 * * * * /home/ec2-user/multi-agent-shogun/scripts/collect_metrics.shバックアップ設定を確認します。
crontab -l # cron設定確認tail -f /var/log/multi-agent-backup.log # バックアップログ確認Section 10: コスト最適化・今後の展望・まとめ
10-1. Savings Plans適用手順(EC2コスト約40%削減)
m5.largeの通常料金は約$70/月(オンデマンド)です。Compute Savings Plans(1年コミット)を適用することで約40%削減できます。
| プラン | 料金/時 | 月額換算 | 割引率 |
|---|---|---|---|
| オンデマンド | $0.120 | 約$87 | — |
| Compute Savings Plans(1年) | $0.096 | 約$70 | 約20%※ |
| Compute Savings Plans(3年) | $0.063 | 約$46 | 約47% |
※ 実際の割引率はリージョンとインスタンスファミリーにより異なります。
AWSコンソールでの購入手順:
- Cost Management → Savings Plans → 「Purchase Savings Plans」をクリック
- Savings Plans type: Compute Savings Plans(インスタンスタイプ変更にも対応する柔軟なプラン)
- Term: 1 year
- Payment option: No upfront(前払いなし)
- Hourly commitment: 0.096(m5.largeの1時間料金を入力)
- 「Purchase」をクリック
FargateやLambdaにも適用される柔軟なプランです。将来的にEC2からFargateに移行する場合もSavings Plansが引き続き有効になります。
10-2. Claude APIコスト最適化
インフラコスト($50/月)より、Claude APIの利用コストのほうがはるかに大きくなります。
| モデル | 入力 | 出力 | 推奨用途 |
|---|---|---|---|
| claude-opus-4-6 | $15/MTok | $75/MTok | shogun(意思決定・戦略) |
| claude-sonnet-4-6 | $3/MTok | $15/MTok | karo/gunshi(通常作業) |
| claude-haiku-4-5 | $0.8/MTok | $4/MTok | ashigaru(定型タスク) |
コスト最適化の主な施策:
- Sonnet優先使用: Opus比で1/5のコスト。意思決定が必要なshogunのみOpusを使用
- Prompt Caching: 同一システムプロンプトのキャッシュにより最大90%削減
- Max planとの比較: 月間利用量が少ない場合はMax plan($200/月)のほうが有利な場合もある
インフラコスト$50/月に対して、Claude API利用コストは$300〜800/月が目安です。Max plan($200/月)のほうがコスト効率が良い場合もあります。AWSコスト管理コンソールで使用量を定期的に確認し、最適なプランを選択してください。
10-3. 今後の展望
自己改善・拡張
- HedgeDoc / Outline: チーム向けナレッジベース統合。エージェントが生成したドキュメントをチームで共有
- code-server: ブラウザからVS Codeでエージェントコードを直接編集(ttydと並行運用)
- 複数EC2での分散実行: エージェント数を32→64へ拡張。shogunインスタンスとashigaruインスタンスを分離
マルチクラウド対応
- Hetzner Cloud CAX31: ARM, €14/月。最安クラウド選択肢(ただしAWSサービスは利用不可)
- GCP Cloud VM: 東京リージョンでレイテンシは優秀だが、料金はAWSとほぼ同等
- Azure VM: EntraID統合でエンタープライズ認証を実現
10-4. まとめ
このハンズオンで構築したスタンダード構成の全体像を振り返ります。
構築したもの
| Phase | 内容 | 主要技術 |
|---|---|---|
| Phase 1 | EC2インスタンス起動 | Amazon Linux 2023、m5.large、gp3 50GB |
| Phase 2 | 環境セットアップ | Node.js 20、Claude Code CLI、ttyd、Docker、Nginx |
| Phase 3 | multi-agent-shogunセットアップ | git clone、ANTHROPIC_API_KEY設定、tmux起動確認 |
| Phase 4 | systemdサービス登録 | 自動起動・自動再起動設定 |
| Phase 5 | ttyd + Nginxリバースプロキシ | ブラウザからtmux操作 |
| Phase 6 | Cloudflare Tunnel + Access | Zero Trust認証・全ポート閉鎖 |
| Phase 7 | Grafana + Loki | ログ・メトリクス可視化 |
3構成パターンの選び方:
| 構成 | こんな人に | 月額(目安) |
|---|---|---|
| ミニマル | 個人・まず試してみたい | ~$40 |
| スタンダード ★推奨 | 個人〜小チーム・本格運用 | ~$50 |
| フル | エンタープライズ・高可用性が必要 | ~$115 |
スタンダード構成で得られるもの:
- 常時稼働: systemd + EC2 Auto Recoveryによる自動再起動
- どこからでもアクセス: ttydでブラウザからtmux操作(Cloudflare Access認証付き)
- ログ・メトリクス可視化: Grafana + Lokiでエージェントの動作を可視化
- 自動バックアップ: GitHub自動push + EBSスナップショットの二重化
- Zero Trustセキュリティ: 全ポート閉鎖・Cloudflare Access認証
まずスタンダード構成からスタートし、必要に応じてフル構成へスケールアップすることをお勧めします。
運用開始後のチェックリスト
| 項目 | 確認コマンド |
|---|---|
| エージェント自動起動 | systemctl status multi-agent |
| ttydブラウザアクセス | Cloudflare AccessのURL経由でアクセス |
| Grafanaダッシュボード | :3000 でローカル確認(Tunnel経由でも可) |
| GitHub自動push | tail -f /var/log/multi-agent-backup.log |
| EBSスナップショット | AWSコンソール → EC2 → Snapshots |
10-5. 参考リンク
| リソース | URL |
|---|---|
| おしお氏 Zenn記事 | https://zenn.dev/shio_shoppaize |
| multi-agent-shogun GitHub | https://github.com/yohey-w/multi-agent-shogun |
| ttyd GitHub | https://github.com/tsl0922/ttyd |
| cloudflared インストール | Cloudflare公式ドキュメント参照 |
| Grafana + Loki ドキュメント | Grafana公式ドキュメント参照 |
| Terraform AWS Provider | https://registry.terraform.io/providers/hashicorp/aws/latest |
| AWS EC2 料金 | AWS公式料金ページ参照 |