背景 / 目的
dev 環境の AWS コストを副業稼働時間に合わせて圧縮する。EventBridge Scheduler で dev の ECS Service の desiredCount と RDS インスタンスの起動/停止を時間帯で切り替え、稼働外は落とす。設計上は S3Infra-4(infrastructure-plan.md)。tracker #206 の Phase 1 Sprint 3 Infra 項目だが、先行実装として Sprint 3 Iteration で起票。
削減見込み: ECS 約 $18/月($30→$12)+ RDS 約 $11/月(db.t4g.micro Single-AZ コンピュートの約60%、東京 ~$0.026/h × 24/7 730h ≈ $19 → 稼働率約40%で ~$7.6)。合計 月 $30 弱。
補足(当初の誤記訂正): RDS を外す根拠とされていた「停止は最大7日まで(7日後に自動再起動)」は、7日以上連続で止めたい場合のみの制約であり、毎日起動し直す日次スケジュールでは到達せず無関係。RDS も日次停止の対象に含める。ストレージ(EBS)課金は停止中も継続するため、削減対象はコンピュート分のみ。
スコープ(dev のみ)
- 対象 1: ECS Service(tasks-webapi + keycloak-custom)の
desiredCount 切替(0 ↔ 1)
- 対象 2: RDS(dev、db.t4g.micro Single-AZ)の start / stop
- 構成: EventBridge Scheduler(cron) → Lambda →
ecs:UpdateService / rds:StartDBInstance・rds:StopDBInstance
- Terraform(
infra/**/*.tf)で IaC 化
スケジュール(timezone = Asia/Tokyo、JST 全層統一方針)
| トリガ |
cron(JST) |
動作 |
| 平日起動 |
月-金 19:00 |
RDS start → ECS desiredCount = 1 |
| 週末起動 |
土日 10:00 |
RDS start → ECS desiredCount = 1 |
| 毎日停止 |
毎日 02:00 |
ECS desiredCount = 0 → RDS stop |
結果稼働: 平日 19:00-02:00 / 土日 10:00-02:00。
起動/停止順序
- 起動: RDS は available まで数分かかるため、RDS を先に起動し、ready 後に ECS を起動する。実装は (a) Lambda 内で RDS start →
DescribeDBInstances でポーリング → ECS update、または (b) RDS 起動スケジュールを数分前倒しのいずれか。dev なので ECS の DB 接続リトライで吸収する選択も可だが、起動失敗ループを避ける配慮を入れる。
- 停止: ECS を 0 にしてから RDS を stop。
実装方針
- Lambda: 引数(対象種別 / cluster / service / RDS instance id / desired action)を受け、ECS / RDS を操作。複数 service 対応。
- IAM(最小権限・Terraform規約準拠): Lambda 実行ロールに以下を対象リソース ARN スコープで付与。ワイルドカード action 禁止、IAM は同 PR 内で定義。
ecs:UpdateService(対象 ECS Service ARN)
rds:StartDBInstance / rds:StopDBInstance(対象 dev RDS インスタンス ARN)
rds:DescribeDBInstances(read 系、ready ポーリング用)
- EventBridge Scheduler: 上記 cron、
ScheduleExpressionTimezone = Asia/Tokyo。
- apply は人手 2 段: ADR-0026 の plan→承認→apply に従う(本 Issue は IaC 記述まで)。
対象外
- NAT Gateway は常時稼働(止められない固定コスト)
- stg / prd は対象外(dev のみ)
- RDS ストレージ課金は停止中も発生するため削減対象外(コンピュートのみ削減)
受け入れ条件
参照
Closes は PR 側に記載。
背景 / 目的
dev 環境の AWS コストを副業稼働時間に合わせて圧縮する。EventBridge Scheduler で dev の ECS Service の
desiredCountと RDS インスタンスの起動/停止を時間帯で切り替え、稼働外は落とす。設計上はS3Infra-4(infrastructure-plan.md)。tracker #206 の Phase 1 Sprint 3 Infra 項目だが、先行実装として Sprint 3 Iteration で起票。削減見込み: ECS 約 $18/月($30→$12)+ RDS 約 $11/月(db.t4g.micro Single-AZ コンピュートの約60%、東京 ~$0.026/h × 24/7 730h ≈ $19 → 稼働率約40%で ~$7.6)。合計 月 $30 弱。
スコープ(dev のみ)
desiredCount切替(0 ↔ 1)ecs:UpdateService/rds:StartDBInstance・rds:StopDBInstanceinfra/**/*.tf)で IaC 化スケジュール(timezone = Asia/Tokyo、JST 全層統一方針)
desiredCount = 1desiredCount = 1desiredCount = 0→ RDS stop結果稼働: 平日 19:00-02:00 / 土日 10:00-02:00。
起動/停止順序
DescribeDBInstancesでポーリング → ECS update、または (b) RDS 起動スケジュールを数分前倒しのいずれか。dev なので ECS の DB 接続リトライで吸収する選択も可だが、起動失敗ループを避ける配慮を入れる。実装方針
ecs:UpdateService(対象 ECS Service ARN)rds:StartDBInstance/rds:StopDBInstance(対象 dev RDS インスタンス ARN)rds:DescribeDBInstances(read 系、ready ポーリング用)ScheduleExpressionTimezone = Asia/Tokyo。対象外
受け入れ条件
UpdateService)と RDS(Start/Stop)の双方を操作、tasks-webapi + keycloak-custom 両 service + dev RDS 対応terraform fmt/validate/planが通る参照
docs/architecture/infrastructure-plan.md(S3Infra-4)docs/specs/Terraform規約.md(IAM 最小権限)