Amazon EventBridgeのCronを使用してAWS Lambdaを実行していますが、設定時刻と起動時刻に誤差があるのはなぜか教えてください

2022.07.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていること

ルール名「samplecron」のイベントスケジュールにおいて、Cron 式 「20/30 * * * ? *」の設定をしています。
上記設定のCron式のとおり、毎時20分00秒にトリガーさせています。

ところが、CloudWatchのログイベントを確認したところ、AWS Lambdaが起動しているのは20分41秒となってます。 この41秒の誤差があるのはなぜでしょうか、教えてください。

どう対応すればいいの?

結論から言うと、Amazon EventBridgeのCron式の精度は分単位です。
なので、Amazon EventBridgeにおいて、最大で59秒の遅延が発生するものであり、遅延の秒数も一定ではないものとなります。

以下、公式ドキュメントにも同様に記載されています。

CloudWatch Events は、スケジュール式で秒レベルの精度を提供しません。Cron 式を使用した最小の解決は分です。CloudWatch Events とターゲットサービスが持つ分散性の特質により、スケジュールされたルールがトリガーされてから、ターゲットサービスがターゲットリソースの実行を優先するまでの遅延は、数秒となる可能性があります。スケジュールされたルールは、その分のうちにトリガーされますが、正確に 0 秒にトリガーされません。

以上より、Cronが通常使われるような定期的な処理では、誤差があっても問題がない前提のもとでCron設計するのがベストプラクティスとなります。

補足

なお、厳密な起動時間にする場合はCron以外のデーモンを作成するか、Cronで1分前に起動されてから、想定の時間まで待機させるなどの方法は考えられます。

参考資料

ルールのスケジュール式-AmazonCloudWatchイベント