はじめに
伝えたいことはタイトルの通りです。
先日、EventBridgeスケジュールのある仕様を知らなかったばかりに、ちょっとしたやらかしをしてしまいました。同じところでハマる人が一人でも減るといいなと思い、記事に残しておきます。
元のスケジュールされた時刻が経過した後に1回限りのスケジュールを再度有効にすると、スケジュールはすぐにターゲットを呼び出すことがあります。これは、スケジュールが元の実行時間より前に無効になっていても発生する可能性があります。
昔利用した1回限りのEventBridgeスケジュールを再利用するために有効化したら、
有効化と同時にターゲットが呼び出されてしまった、というのがやらかしの内容です。
検証してみる
実際に何が起きたかを再現してみようと思います。
今回はEventBridgeスケジュールからLambda関数を呼び出すシンプルな構成で試してみます。
Lambda関数の作成
Lambda関数は呼び出された時刻をログに出すだけのシンプルなものにしています。
Lambda関数のコード
import json
from datetime import datetime, timezone, timedelta
# 日本時間(JST)のタイムゾーン
JST = timezone(timedelta(hours=9))
def lambda_handler(event, context):
# 呼び出された瞬間の時刻を記録
invoked_at = datetime.now(JST).strftime("%Y-%m-%d %H:%M:%S")
print(f"Lambda関数が呼び出されました! 実行時刻(JST): {invoked_at}")
print(f"受け取ったイベント: {json.dumps(event, ensure_ascii=False)}")
return {
"statusCode": 200,
"body": json.dumps(
{"message": "呼び出し成功", "invoked_at": invoked_at},
ensure_ascii=False,
),
}
EventBridgeスケジュールの作成
続いて、Lambdaを呼び出すEventBridgeスケジュールを作ります。
スケジュールの詳細の指定
- スケジュールのパターン:
1回限りのスケジュール - 日時と時刻:過去の日時を指定
- タイムゾーン:
(UTC+09:00) Asia/Tokyo - 他はデフォルト
ターゲットの選択
- ターゲットAPI:
AWS Lambda Invoke - Lambda関数:先ほど作成したLambda関数を選択
- 他はデフォルト
設定
- スケジュールの状態:
オフ(無効) - 他はデフォルト
動作確認
有効化する前の状態を確認
Lambdaはまだ一度も呼ばれていないので、LambdaのCloudWatch Logsを見ても、ログは出ていません。
スケジュールを有効化する
作成したスケジュールを選択し、有効化をクリックします。
CloudWatch Logsを確認
スケジュールを有効化したら、LambdaのCloudWatch Logsを確認してみます。
指定した過去日時ではなく、有効化した時刻でLambdaが呼び出されているログが出ていれば、今回の仕様が再現できたことになります。
実際に、ロググループが作成され、有効化した時刻でのログを確認できました。
Lambda関数が呼び出されました! 実行時刻(JST): 2026-07-12 23:12:30
EventBridgeスケジュールの有効化により、Lambda関数が呼び出されていることが分かりました。
なぜこうなるのか(推測)
以下は公式ドキュメントには記載がなく、挙動からの筆者の推測です。
EventBridgeの1回限りのスケジュールは、内部的に「この時刻に1回実行する」という予約情報を持っているのだと思われます。
無効化している間はその実行が止められているだけで、予約自体は消えていないのではないでしょうか。
指定時刻を過ぎた状態で有効化したときに、「本来もう実行しているべきなのに、まだ実行していない」と判断され、有効化されたタイミングで(取り戻すように)ターゲットを呼び出す、という挙動を起こすのかなと推測しています。
対策
この仕様に対する対策はいくつか考えられます。
-
過去日時になってしまった1回限りのスケジュールは、日付と時刻を変更してから有効化する
-
どうしても有効/無効を切り替えて運用したい場合は、1回限りのスケジュールではなく定期的なスケジュールを利用し、cron式で日時を指定する
おわりに
今回は、EventBridgeの1回限りスケジュールを過去日時で有効化すると即発火する、という小ネタを実際に試してみました。
一度動くと取り消せない処理をターゲットにしている場合は要注意ですね。
ドキュメントにもしっかり書いてある挙動ではありますが、実際にやらかすまで気づけなかったので、同じところでハマる人が減れば嬉しいです。
最後まで読んでいただきありがとうございました!



