lambda_whenever
is a Ruby gem that allows you to create schedules with AWS EventBridge Scheduler targeting Lambda functions using the same syntax as the whenever
gem.
This gem simplifies the management of cron job configurations and enables event-driven batch processing.
Add this line to your application's Gemfile:
gem 'lambda_whenever'
Or install it manually with Bundler in your Gemfile:
$ gem install lambda_whenever
You can use it almost like Whenever. However, please note that you must specify a --lambda-name
and --iam-role
.
$ lambda_whenever --help
Usage: lambda_whenever [options]
--dryrun dry-run
--update Creates and deletes tasks as needed by schedule file
-c, --clear Clear scheduled tasks
-l, --list List scheduled tasks
-v, --version Print version
-s, --set variables Example: --set 'environment=staging'
--lambda-name name Lambda function name
--scheduler-group group_name Optionally specify event bridge scheduler group name
-f, --file schedule_file Default: config/schedule.rb
--iam-role name IAM role name used by EventBridgeScheduler.
--rule-state state The state of the EventBridgeScheduler Rule. Default: ENABLED
--region region AWS region
-V, --verbose Run rake jobs without --silent
Lambda Whenever supports setting variables via the --set
option, similar to how Whenever does.
Example:
lambda_whenever --set 'environment=staging&some_var=foo'
if @environment == 'staging'
every '0 1 * * *' do
rake 'some_task_on_staging'
end
elsif @some_var == 'foo'
every '0 10 * * *' do
rake 'some_task'
end
end
The @environment
variable defaults to "production"
.
Lambda Whenever creates an EventBridge Scheduler schedule for each every
block. Each schedule can have multiple commands.
For example, the following input will generate one schedule with two commands:
every '0 0 * * *' do
rake "hoge:run"
command "echo 'you can use raw cron syntax too'"
end
This will result in:
cron(0 0 * * ? *) { commands: [["bundle", "exec", "rake", "hoge:run", "--silent"], ["echo", "'you", "can", "use", "raw", "cron", "syntax", "too'"]] }
In this example, one EventBridge Scheduler schedule is created, containing both the rake task and the command. The scheduled task's name is a digest value calculated from an cron expression, commands, and other parameters.
Before using this gem, ensure that you have the necessary IAM policies set up for EventBridge to invoke your Lambda functions.
To use this gem, the executing entity (e.g., GitHub Actions, CI/CD pipelines, or other automated systems) must have the necessary IAM policies to register schedules with EventBridge and obtain Lambda ARNs. The following policy grants the required permissions:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"scheduler:CreateScheduleGroup",
"scheduler:ListSchedules",
"scheduler:GetSchedule",
"scheduler:CreateSchedule",
"scheduler:DeleteSchedule",
"scheduler:UpdateSchedule",
"lambda:ListFunctions",
"lambda:GetFunction"
],
"Resource": "*"
}
]
}
You need an IAM role that allows EventBridge to assume the role and invoke your Lambda functions. The following policy should be attached to the role:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "<your account id>"
}
}
}
]
}
You also need a policy that allows EventBridge to execute your Lambda functions. Attach the following policy to the role:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": [
"<your lambda arn>:*",
"<your lambda arn>"
]
}
]
}
In lambda_whenever
, setting the timezone is slightly different from the traditional whenever
gem.
Instead of using env "CRON_TZ", <zone>
, you should use the set :timezone, <zone>
syntax to specify the timezone for your scheduled tasks.
Example:
set :timezone, "Asia/Tokyo"
Whenever supports custom job types with job_type
, env
, and job_template
methods, but Lambda Whenever does not support these.
Whenever supports the mailto
method, but Lambda Whenever does not.
Amazon EventBridge Scheduler does not natively support email notifications.
As a result, the mailto
option is not available in this gem.
Lambda Whenever processes the frequency passed to the every
block similarly to Whenever.
Whenever supports :reboot
as a cron option, but Lambda Whenever does not support it.
Whenever checks if the application uses Bundler and automatically adds a prefix to commands. However, Lambda Whenever always adds a prefix, assuming the application is using Bundler.
# Whenever
# With bundler -> bundle exec rake hoge:run
# Without bundler -> rake hoge:run
#
# Lambda Whenever
# bundle exec rake hoge:run
#
rake "hoge:run"
If you don't want to add the prefix, set bundle_command
to an empty string as follows:
set :bundle_command, ""
After checking out the repo, run bin/setup
to install dependencies. Then, run rake spec
to run the tests.
You can also run bin/console
for an interactive prompt that will allow you to experiment.
Bug reports and pull requests are welcome on GitHub at https://github.com/toshichanapp/lambda_whenever.
The gem is available as open-source under the terms of the MIT License.
This gem is inspired by and built upon the work of the whenever and elastic_whenever gems. We would like to express our gratitude to the developers and contributors of these projects for their foundational work and contributions to the Ruby community.