EventBridge Scheduler の Universal target で Lambda 不要・コードゼロの定時自動化を実現する
このハンズオンでは、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 を直接呼び出せるため |
| アプローチ | コード | Scheduler 数 | 順序制御 | 向いている用途 |
|---|---|---|---|---|
| このハンズオン Scheduler 単体 | 不要 | 4 つ | なし | とにかくシンプルに止めたい |
| Scheduler + Lambda | Python | 2 つ | △ | ログ・エラー処理が欲しい |
| Scheduler + Step Functions | Python + ASL | 2 つ | 完全 | 起動完了を確認してから次へ進みたい |
EventBridge Scheduler の Universal target は、任意の AWS SDK API を Scheduler のターゲットとして直接指定できる機能です(2022 年 11 月リリース)。Lambda などの中間処理を挟まず、JSON 形式のリクエストパラメータを直接 AWS API に渡します。
4 つの Scheduler は独立して動作するため、EC2 と RDS の停止・起動が厳密に同じ時刻に発火します。「EC2 が起動してから RDS を起動する」のような依存関係が必要な場合は Step Functions 版を使ってください。
i-0abc1234567890def)handson-db)Scheduler が EC2・RDS の API を直接呼び出すための IAM ロールを 1 つ作成します。4 つの Scheduler でこのロールを共有します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:StartInstances",
"ec2:StopInstances",
"rds:StartDBInstance",
"rds:StopDBInstance"
],
"Resource": "*"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
IAM ロール作成時の「AWS のサービス」一覧に「EventBridge Scheduler」が表示されない場合があります。その場合は「カスタム信頼ポリシー」を選択し、プリンシパルに scheduler.amazonaws.com を直接指定してください。
{
"InstanceIds": ["i-0abc1234567890def"]
}
「次へ」→「スケジュールを作成」をクリックします。
スケジュール一覧に handson-direct-stop-ec2 が「有効」で表示されれば完了です。
ステップ 2 と同じ手順で作成します。異なる箇所のみ記載します。
入力 JSON:
{
"DBInstanceIdentifier": "handson-db"
}
RDS の API パラメータのキー名は DBInstanceIdentifier(D・B ともに大文字)です。DbInstanceIdentifier や dbInstanceIdentifier では API 呼び出しが ValidationException で失敗します。EC2 の InstanceIds とあわせて大文字・小文字を正確に入力してください。
{
"InstanceIds": ["i-0abc1234567890def"]
}
{
"DBInstanceIdentifier": "handson-db"
}
スケジュール一覧に以下の 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)スケジュール時刻まで待たずに、「一度だけ実行」スケジュールを作って即時テストします。
handson-direct-test-stop-ec2EC2 が stopped になれば Universal target の動作確認完了です。同様に StartInstances のテスト Scheduler を作って起動も確認しましょう。RDS も同じ手順でテストできます。
| エラー | 原因と対処 |
|---|---|
| AccessDenied | IAM ロールに権限が不足。ポリシーのアクション名(StopInstances など)を確認 |
| InvalidInstanceID | 入力 JSON のインスタンス ID が誤り。EC2 コンソールで ID を再確認 |
| ValidationException (RDS) | JSON キー名が誤り。DBInstanceIdentifier(DB は大文字)の大文字・小文字を確認 |
| 実行されない | Scheduler の有効・無効設定を確認。タイムゾーンが Asia/Tokyo になっているか確認 |
handson-direct-* を全選択 → 「削除」
handson-direct-scheduler-role → 削除handson-direct-scheduler-policy → 削除
Scheduler 一覧から handson-direct-* が消えていれば完了です。Lambda や Step Functions は作成していないため、それ以外の削除は不要です。
このハンズオンで作成した 4 つの Scheduler はそのまま本番運用に使えます。複数インスタンスを対象にする場合は InstanceIds 配列に複数の ID を追加できます(例: ["i-aaa", "i-bbb"])。ただし全インスタンスが同じスケジュールになるため、インスタンスごとに異なるスケジュールが必要な場合は Scheduler を追加作成してください。