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

104 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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コンソール操作のため、ユーザー側作業。手順:
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ードと揃えるか、都度指定か→ 実装時に既存ノードのスペック確認して決定