GitHub(nextgroup2706/ken_nogi)は今後使わず自社Gitea運用に切替え。 NodeSrvは旧リポジトリの履歴を破棄しファイルのみ統合(Dokploy用サービスアカウントは 別途mygit-admin/NodeSrv.gitに履歴あり)。notepmエクスポート(12GB)とPleasanter インストーラzip(208MB)はサイズが大きいため.gitignoreで除外。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
4.5 KiB
4.5 KiB
Lightsail CLI制御基盤 設計
作成日: 2026-08-10 背景: XWiki用ノード増設判断(既存Dokploy/Lightsail構成)検討中に発生。Claude Codeから直接AWS Lightsailインスタンスを操作したい要望。
1. 目的
AWS Lightsail操作(インスタンス一覧・作成削除・起動停止・スナップショット)をClaude CodeからCLI経由で実行可能にする。人間がAWSコンソール開かず、Claude Codeへの指示だけでノード管理完結させる。
2. スコープ
初期実装(今回)
- インスタンス一覧・状態取得
- インスタンス作成・削除
- 起動/停止/再起動
- スナップショット作成・一覧・削除
対象外(随時追加)
静的IPアタッチ/デタッチ、ファイアウォール(ポート開放)設定、ディスクアタッチ・追加ブロックストレージ、DNS管理、インスタンス名変更等。必要になった時点で関数・CLIコマンド追加。
3. アーキテクチャ
apps/app-portal/
src/lightsailClient.js # AWS SDKラッパー(dokployClient.js同型)
scripts/lightsail-cli.js # Claude Code実行用CLIエントリ
test/lightsailClient.test.js
deploy/
lightsail.env.example # 新規
lightsail.env # 実値(gitignore済み)
- 依存追加:
@aws-sdk/client-lightsail(apps/app-portal/package.json) lightsailClient.js: 関数ごとに1操作。getConfig()でenv読込→LightsailClient生成→コマンド実行。既存dokployClient.jsのパターンを踏襲scripts/lightsail-cli.js:node scripts/lightsail-cli.js <command> [args]形式。結果をJSON整形出力- 既存app-portal Webアプリとは独立実行。サーバー常時起動不要、都度node実行
4. 認証情報
専用IAMユーザー作成、AmazonLightsailFullAccessポリシーをアタッチ。
deploy/lightsail.env.example:AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY/AWS_REGION(項目のみ、値は空)deploy/lightsail.env: 実値格納、gitignore済み(dokploy.envと同列運用)- リージョン:
ap-northeast-1(東京)固定。既存Dokploy稼働Lightsailと同一リージョン
IAMユーザー作成はAWSコンソール操作のため、ユーザー側作業。手順:
- IAMコンソール → ユーザー作成(例:
lightsail-api-bot) - アクセスキー種別「プログラムによるアクセス」
AmazonLightsailFullAccessポリシーをアタッチ- アクセスキー発行、
deploy/lightsail.envに格納
5. CLIコマンド体系
| CLIコマンド | lightsailClient.js関数 | AWS SDKコマンド |
|---|---|---|
list |
listInstances() |
GetInstances |
status <name> |
getInstance(name) |
GetInstance |
create <name> --bundle <id> --blueprint <id> --az <zone> |
createInstance(opts) |
CreateInstances |
delete <name> |
deleteInstance(name) |
DeleteInstance |
start <name> |
startInstance(name) |
StartInstance |
stop <name> |
stopInstance(name) |
StopInstance |
reboot <name> |
rebootInstance(name) |
RebootInstance |
snapshot create <instance> <snapshotName> |
createSnapshot(instance, snapshotName) |
CreateInstanceSnapshot |
snapshot list |
listSnapshots() |
GetInstanceSnapshots |
snapshot delete <snapshotName> |
deleteSnapshot(snapshotName) |
DeleteInstanceSnapshot |
6. 破壊的操作の扱い
delete系(インスタンス削除・スナップショット削除)はCLI内部に確認プロンプトを実装しない。CLIは薄く保つ。実行判断はClaude Code側(会話上でユーザーに確認取ってから実行)に委ねる。既存の「破壊的操作は事前確認」運用ルールでカバー。
7. エラーハンドリング
AWS SDKが投げる例外をそのままthrow。dokployClient.js同様、ラップしない。
8. テスト方針
LightsailClientインスタンスを関数の外側からDI可能にする。引数省略時は本物のSDKクライアント生成、テスト時はモッククライアントを注入しclient.sendをスタブ。dokployClient.jsのglobal.fetchモック方式と同じ発想。node:test使用(既存app-portalと統一)。
9. 未決事項
- IAMアクセスキー発行(ユーザー側作業、未実施)
createコマンドのbundle/blueprint/azデフォルト値(既存Dokployノードと揃えるか、都度指定か)→ 実装時に既存ノードのスペック確認して決定