3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS小ネタ】無効化している1回限りのEventBridgeスケジュールを実行時刻を過ぎてから有効化すると即発火する

3
Last updated at Posted at 2026-07-12

はじめに

伝えたいことはタイトルの通りです。

先日、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関数を選択
  • 他はデフォルト

設定

  • スケジュールの状態: オフ(無効)
  • 他はデフォルト

image.png

動作確認

有効化する前の状態を確認

Lambdaはまだ一度も呼ばれていないので、LambdaのCloudWatch Logsを見ても、ログは出ていません。

202607122307.png

スケジュールを有効化する

作成したスケジュールを選択し、有効化をクリックします。

CloudWatch Logsを確認

スケジュールを有効化したら、LambdaのCloudWatch Logsを確認してみます。
指定した過去日時ではなく、有効化した時刻でLambdaが呼び出されているログが出ていれば、今回の仕様が再現できたことになります。

実際に、ロググループが作成され、有効化した時刻でのログを確認できました。

202607122314.png

Lambda関数が呼び出されました! 実行時刻(JST): 2026-07-12 23:12:30

EventBridgeスケジュールの有効化により、Lambda関数が呼び出されていることが分かりました。

なぜこうなるのか(推測)

以下は公式ドキュメントには記載がなく、挙動からの筆者の推測です。

EventBridgeの1回限りのスケジュールは、内部的に「この時刻に1回実行する」という予約情報を持っているのだと思われます。
無効化している間はその実行が止められているだけで、予約自体は消えていないのではないでしょうか。

指定時刻を過ぎた状態で有効化したときに、「本来もう実行しているべきなのに、まだ実行していない」と判断され、有効化されたタイミングで(取り戻すように)ターゲットを呼び出す、という挙動を起こすのかなと推測しています。

対策

この仕様に対する対策はいくつか考えられます。

  • 過去日時になってしまった1回限りのスケジュールは、日付と時刻を変更してから有効化する

  • スケジュール完了後のアクションをDELETEに設定し、再利用しないようにする
    image.png

  • どうしても有効/無効を切り替えて運用したい場合は、1回限りのスケジュールではなく定期的なスケジュールを利用し、cron式で日時を指定する

おわりに

今回は、EventBridgeの1回限りスケジュールを過去日時で有効化すると即発火する、という小ネタを実際に試してみました。
一度動くと取り消せない処理をターゲットにしている場合は要注意ですね。
ドキュメントにもしっかり書いてある挙動ではありますが、実際にやらかすまで気づけなかったので、同じところでハマる人が減れば嬉しいです。
最後まで読んでいただきありがとうございました!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?