Skip to content

infra(scheduling): EventBridge Scheduler で dev ECS + RDS 稼働時間切替(平日19:00-02:00 + 土日10:00-02:00、S3Infra-4) #620

Description

@win2cot

背景 / 目的

dev 環境の AWS コストを副業稼働時間に合わせて圧縮する。EventBridge Scheduler で dev の ECS Service の desiredCountRDS インスタンスの起動/停止を時間帯で切り替え、稼働外は落とす。設計上は 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:StartDBInstancerds: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 ストレージ課金は停止中も発生するため削減対象外(コンピュートのみ削減)

受け入れ条件

  • EventBridge Scheduler 3 cron(平日19:00起動 / 週末10:00起動 / 毎日02:00停止)を Terraform で定義、timezone=Asia/Tokyo
  • Lambda が ECS(UpdateService)と RDS(Start/Stop)の双方を操作、tasks-webapi + keycloak-custom 両 service + dev RDS 対応
  • 起動時は RDS available 後に ECS を起動する順序を保証(またはリトライ吸収を明記)、停止時は ECS→RDS の順
  • Lambda 実行ロールの IAM が対象 ECS Service ARN / dev RDS インスタンス ARN にスコープ(ワイルドカード action なし、Terraform規約準拠)
  • terraform fmt / validate / plan が通る
  • dev のみ対象(stg/prd 不変)、NAT は不変であることを plan 差分で確認
  • apply 後の実機検証手順(時間帯で ECS desiredCount と RDS 状態が切替わること)を PR 本文 or runbook に記載
  • infrastructure-plan.md の S3Infra-4 行に Issue 番号を追記し、「RDS は最大7日制約のため停止せず常時稼働」の記述を訂正(日次停止では7日制約は無関係、RDS も対象/削減~$11月=コンピュート約60%)

参照

Closes は PR 側に記載。

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/infraAWS インフラ(ECS Fargate / RDS / Keycloak / IAM)変更priority/p1High。現スプリント内で完了必須task-type:implコード実装が主体のタスク

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions