ken_nogi/NodeSrv/docs/superpowers/specs/2026-08-10-lightsail-cli-design.md
Kenichiro NOGI ce58cb4be4 初回コミット: dev配下(NodeSrv/Pleasanter等)をGitea管理下に統合
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>
2026-09-04 15:37:06 +09:00

4.5 KiB
Raw Blame History

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-lightsailapps/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コンソール操作のため、ユーザー側作業。手順:

  1. IAMコンソール → ユーザー作成(例: lightsail-api-bot
  2. アクセスキー種別「プログラムによるアクセス」
  3. AmazonLightsailFullAccessポリシーをアタッチ
  4. アクセスキー発行、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ードと揃えるか、都度指定か→ 実装時に既存ノードのスペック確認して決定