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.
More to read
Dennis Traub wrote an interesting post on the same topic using StepFunctions.
There is a parameter
at expression at(yyyy-mm-ddThh:mm:ss) in EventBridge Scheduler cli/boto3, but
ss part does not work.
Latest comments (4)
Nice post. Let me see if the cost can be optimized using AWS Step Functions...
Update: I've optimized this a little for cost effectiveness. Check it out: How to invoke an AWS Lambda function at (almost exactly) the top of a minute using AWS Step Functions and let me know if this is helpful.
Thanks, Dennis. I've updated and linked to your post. I'm a kind of using-Lambda-all-the-time, but using stepfunctions is as well nice!
Great, thanks! The link doesn't work, though. Probably a Markdown typo.
Sorry! I've fixed and confirmed this time :)