EC2 + RDS 自動停止・起動(コードなし)ハンズオン

EventBridge Scheduler の Universal target で Lambda 不要・コードゼロの定時自動化を実現する

Amazon EventBridge Scheduler Amazon EC2 Amazon RDS コードなし 入門 所要時間 30〜45 分 v1.0

📋 概要

このハンズオンでは、EventBridge Scheduler の Universal target(ユニバーサルターゲット) 機能を使い、Lambda 関数を一切作らずに EC2・RDS の定時停止・起動を実現します。Scheduler が AWS SDK の API(ec2:StopInstances / rds:StartDBInstance など)を直接呼び出すため、コードを書く必要がありません。

項目内容
所要時間30〜45 分
難易度入門
主要サービスEventBridge Scheduler、EC2、RDS
Lambda が不要な理由Scheduler の Universal target が AWS API を直接呼び出せるため

3 つのアプローチ比較

アプローチコードScheduler 数順序制御向いている用途
このハンズオン
Scheduler 単体
不要4 つなしとにかくシンプルに止めたい
Scheduler + LambdaPython2 つログ・エラー処理が欲しい
Scheduler + Step FunctionsPython + ASL2 つ完全起動完了を確認してから次へ進みたい

🏗️ 構成図

Scheduler ① cron(0 22 ? * MON-FRI *) Asia/Tokyo
ec2:StopInstances
Scheduler ② cron(0 22 ? * MON-FRI *) Asia/Tokyo
rds:StopDBInstance
Scheduler ③ cron(0 8 ? * MON-FRI *) Asia/Tokyo
ec2:StartInstances
Scheduler ④ cron(0 8 ? * MON-FRI *) Asia/Tokyo
rds:StartDBInstance
ℹ️ Universal target とは

EventBridge Scheduler の Universal target は、任意の AWS SDK API を Scheduler のターゲットとして直接指定できる機能です(2022 年 11 月リリース)。Lambda などの中間処理を挟まず、JSON 形式のリクエストパラメータを直接 AWS API に渡します。

⚠️ 順序保証なし

4 つの Scheduler は独立して動作するため、EC2 と RDS の停止・起動が厳密に同じ時刻に発火します。「EC2 が起動してから RDS を起動する」のような依存関係が必要な場合は Step Functions 版を使ってください。

✅ 前提条件

🔧 ステップ 1: IAM ロールの作成

Scheduler が EC2・RDS の API を直接呼び出すための IAM ロールを 1 つ作成します。4 つの Scheduler でこのロールを共有します。

1-1. IAM ポリシーの作成

手順
  1. IAM コンソール → 「ポリシー」→「ポリシーを作成」→ JSON タブに以下を貼り付け
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:StartInstances",
        "ec2:StopInstances",
        "rds:StartDBInstance",
        "rds:StopDBInstance"
      ],
      "Resource": "*"
    }
  ]
}
ポリシー名
handson-direct-scheduler-policy

1-2. IAM ロールの作成

手順
  1. IAM コンソール → 「ロール」→「ロールを作成」
  2. 信頼されたエンティティタイプ: 「カスタム信頼ポリシー」 を選択
  3. 以下の信頼ポリシーを貼り付ける
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "scheduler.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
アタッチするポリシー
handson-direct-scheduler-policy
ロール名
handson-direct-scheduler-role
ℹ️ カスタム信頼ポリシーが必要な理由

IAM ロール作成時の「AWS のサービス」一覧に「EventBridge Scheduler」が表示されない場合があります。その場合は「カスタム信頼ポリシー」を選択し、プリンシパルに scheduler.amazonaws.com を直接指定してください。

🔧 ステップ 2: EC2 停止スケジューラーの作成

手順
  1. AWS コンソールで「EventBridge」を検索して開く
  2. 左メニュー → 「Scheduler」→「スケジュール」→「スケジュールを作成」

スケジュール設定

スケジュール名
handson-direct-stop-ec2
スケジュールタイプ
Cron ベース
Cron 式
0 22 ? * MON-FRI *
タイムゾーン
Asia/Tokyo
フレキシブルタイムウィンドウ
オフ

ターゲット設定(Universal target)

手順
  1. 「次へ」でターゲット設定へ進む
  2. 「すべての API」(All APIs)タブを選択
  3. AWS のサービス: 「EC2」 を検索して選択
  4. API アクション: 「StopInstances」 を選択
  5. 入力 JSON に以下を入力(インスタンス ID を実際の値に変更)
{
  "InstanceIds": ["i-0abc1234567890def"]
}

アクセス許可設定

実行ロール
既存のロールを使用 → handson-direct-scheduler-role

「次へ」→「スケジュールを作成」をクリックします。

✅ 確認

スケジュール一覧に handson-direct-stop-ec2 が「有効」で表示されれば完了です。

🔧 ステップ 3: RDS 停止スケジューラーの作成

ステップ 2 と同じ手順で作成します。異なる箇所のみ記載します。

スケジュール設定

スケジュール名
handson-direct-stop-rds
Cron 式
0 22 ? * MON-FRI *
タイムゾーン
Asia/Tokyo

ターゲット設定

AWS のサービス
RDS
API アクション
StopDBInstance

入力 JSON:

{
  "DBInstanceIdentifier": "handson-db"
}
実行ロール
handson-direct-scheduler-role
⚠️ JSON キー名に注意

RDS の API パラメータのキー名は DBInstanceIdentifierD・B ともに大文字)です。DbInstanceIdentifierdbInstanceIdentifier では API 呼び出しが ValidationException で失敗します。EC2 の InstanceIds とあわせて大文字・小文字を正確に入力してください。

🔧 ステップ 4: EC2 起動スケジューラーの作成

スケジュール設定

スケジュール名
handson-direct-start-ec2
Cron 式
0 8 ? * MON-FRI *
タイムゾーン
Asia/Tokyo

ターゲット設定

AWS のサービス
EC2
API アクション
StartInstances
{
  "InstanceIds": ["i-0abc1234567890def"]
}
実行ロール
handson-direct-scheduler-role

🔧 ステップ 5: RDS 起動スケジューラーの作成

スケジュール設定

スケジュール名
handson-direct-start-rds
Cron 式
0 8 ? * MON-FRI *
タイムゾーン
Asia/Tokyo

ターゲット設定

AWS のサービス
RDS
API アクション
StartDBInstance
{
  "DBInstanceIdentifier": "handson-db"
}
実行ロール
handson-direct-scheduler-role
✅ 4 つの Scheduler 確認

スケジュール一覧に以下の 4 つが「有効」で表示されていれば設定完了です。

  • handson-direct-stop-ec2(22:00 / StopInstances)
  • handson-direct-stop-rds(22:00 / StopDBInstance)
  • handson-direct-start-ec2(08:00 / StartInstances)
  • handson-direct-start-rds(08:00 / StartDBInstance)

🔧 ステップ 6: 動作確認(手動テスト実行)

スケジュール時刻まで待たずに、「一度だけ実行」スケジュールを作って即時テストします。

6-1. テスト用 Scheduler(一度だけ実行)を作成

手順
  1. Scheduler → 「スケジュールを作成」
  2. スケジュール名: handson-direct-test-stop-ec2
  3. オカレンス: 「1 回限りのスケジュール」 を選択
  4. 日時: 現在時刻の 2〜3 分後を指定(UTC 注意:入力欄横のタイムゾーンを Asia/Tokyo に変更)
  5. ターゲット: EC2 → StopInstances → インスタンス ID を入力
  6. 実行ロール: handson-direct-scheduler-role
  7. 「スケジュールを作成」→ 2〜3 分後に EC2 が停止することを確認

6-2. EC2 停止の確認

手順
  1. EC2 コンソール → インスタンス → 対象インスタンスの状態が 「stopped」 になるまで待つ(1〜2 分)
  2. Scheduler コンソール → テスト用 Scheduler の「最後の実行」列に日時が入っていれば実行済み
✅ 確認ポイント

EC2 が stopped になれば Universal target の動作確認完了です。同様に StartInstances のテスト Scheduler を作って起動も確認しましょう。RDS も同じ手順でテストできます。

6-3. 実行ログの確認

手順
  1. Scheduler コンソール → 対象の Scheduler をクリック
  2. 「実行ログ」タブ → 実行履歴と成功/失敗のステータスが確認できる
  3. 失敗した場合は「エラー詳細」に理由が表示される(IAM 権限不足など)
⚠️ よくある失敗パターン
エラー原因と対処
AccessDeniedIAM ロールに権限が不足。ポリシーのアクション名(StopInstances など)を確認
InvalidInstanceID入力 JSON のインスタンス ID が誤り。EC2 コンソールで ID を再確認
ValidationException (RDS)JSON キー名が誤り。DBInstanceIdentifier(DB は大文字)の大文字・小文字を確認
実行されないScheduler の有効・無効設定を確認。タイムゾーンが Asia/Tokyo になっているか確認

🧹 クリーンアップ

削除手順

  1. Scheduler の削除(4 つ + テスト用)
    EventBridge → Scheduler → スケジュール一覧 → handson-direct-* を全選択 → 「削除」
  2. IAM ロール・ポリシーの削除
    IAM → ロール: handson-direct-scheduler-role → 削除
    IAM → ポリシー: handson-direct-scheduler-policy → 削除
✅ 削除確認

Scheduler 一覧から handson-direct-* が消えていれば完了です。Lambda や Step Functions は作成していないため、それ以外の削除は不要です。

ℹ️ 本番運用で使い続ける場合

このハンズオンで作成した 4 つの Scheduler はそのまま本番運用に使えます。複数インスタンスを対象にする場合は InstanceIds 配列に複数の ID を追加できます(例: ["i-aaa", "i-bbb"])。ただし全インスタンスが同じスケジュールになるため、インスタンスごとに異なるスケジュールが必要な場合は Scheduler を追加作成してください。