In Amazon EventBridge Rules and EventBridge Scheduler, the precision of time is one minute. This is the same as the usual cron jobs.
... the minimum precision for a schedule is one minute. Your scheduled rule runs within that minute, but not on the precise 0th second. (aws-doc)
Sometimes we want to trigger precisely at zero seconds, for example, at
In this post, I share the way to trigger precisely using the Lambda function with the EventBridge Schedule.
EventBridge invokes the Lambda function 1 minute before the desired trigger time
00:00:00. That means the EventBridge Schedule is set to invoke the Lambda function at
23:59. As written above, we don't know what seconds in 23:59 the time Lambda function will be invoked. (It might be 23:59:16 or 23:59:38...)
The Lambda function calculates the time left to
00:00:00and sleeps until then.
00:00:00, the Lambda function triggers some actions, events or resources.
Here is the example code for the Python Lambda function. You can just create a new function and paste this.
Note that the timeout of the Lambda function should be more than 1 minute.
import time from datetime import datetime, timedelta def lambda_handler(event, context): time_called = datetime.now() print("time_called", time_called) # ceiling minute target = time_called - timedelta( minutes=-1, seconds=time_called.second, microseconds=time_called.microsecond ) diff = target - time_called wait_sec = diff.seconds + diff.microseconds / 1000000 time.sleep(wait_sec) time_zero_sec = datetime.now() print("time_zero_sec", time_zero_sec) # Write here what you want to trigger at xx:xx:00.
print() are used to compare the times before and after wait.
Let's try and see the result. At this time, desired time is 23:00. EventBridge Scheduler was set to invoke the Lambda function at 22:59.
Here is the capture of CloudWatch logs of the Lambda function.
22:59:16.345072is from first print(), when EventBridge triggered the Lambda function.
2022-11-25 23:00:00.044251is from second print(), when the Lambda function waited until
Good! This is what I wanted to do here.
I've shared how to trigger events precisely in second order using EventBridge and Lambda.
There is a parameter
at expression at(yyyy-mm-ddThh:mm:ss) in EventBridge Scheduler cli/boto3, but
ss part does not work.