AWS Lambda Scheduled Tasks
Asked Answered
S

16

174

Amazon announced AWS Lambda (http://aws.amazon.com/lambda/).

The product description includes:

Scheduled Tasks

AWS Lambda functions can be triggered by external event timers, so functions can be run during regularly scheduled maintenance times or non-peak hours. For example, you can trigger an AWS Lambda function to perform nightly archive cleanups during non-busy hours.

When I read this, I understood I could finally have a way to consistently do "cron-like" tasks. I want to run a specific query everyday at 5PM let's say.

However I do not find this anywhere in the documentation. They only mention triggers on programatical events, or events from other AWS services.

Did I misunderstand? Or can someone point me to the documentation?

Sueannsuede answered 9/12, 2014 at 15:0 Comment(0)
D
177

Native Support for Scheduled Events added October 8, 2015:

As announced in this AWS blog post, scheduling is now supported as an event source type (also called triggers) called "CloudWatch Events - Schedule", and can be expressed as a rate or a cron expression.

Add Scheduled Event to a new lambda

Navigate to the 'Configure triggers' step of creation, and specify the 'CloudWatch Event - Schedule' trigger. Example configuration below:

Image that shows configuration for creating a scheduled event at 5pm UTC.

Add Scheduled Event to an existing lambda

Navigate to the 'Triggers' tab of your lambda, select 'Add Trigger', and specify the 'CloudWatch Event - Schedule' trigger. Example screenshot where I have an existing lambda with an SNS trigger:

Image that shows how to navigate to add trigger UI from Lambda console.

Once loaded, the UI to configure this trigger is identical to the screenshot in the above "Add Scheduled Event to a new lambda" section above.

Discussion

For your example case, you'll want to use cron() instead of rate(). Cron expressions in lambda require all fields and are expressed in UTC. So to run a function every day at 5pm (UTC), use the following cron expression:

cron(0 17 * * ? *)

Further Resources

Notes

  • The name of this event type has changed from "Scheduled Event" to "CloudWatch Events - Schedule" since this feature was first released.
  • Prior to the release of this feature, the recommended solution to this issue (per "Getting Started with AWS Lambda" at 42min 50secs) was to use SWF to create a timer, or to create a timer with an external application.
  • The Lambda UI has been overhauled since the scheduled event blog post came out, and the screenshots within are no longer exact. See my updated screenshots above from 3/10/2017 for latest revisions.
Decoct answered 9/12, 2014 at 15:11 Comment(2)
It's a bit of a hack but you can do this for a 1 min frequency youtube.com/watch?v=FhJxTIq81AUTamtam
It does support 1min rate now. docs.aws.amazon.com/lambda/latest/dg/…Grus
L
19

Since the time of this post, there seems to have risen another solution: Schedule Recurring AWS Lambda Invocations With The Unreliable Town Clock (UTC) in which the author proposes subscribing to the SNS topic Unreliable Town Clock. I've used neither SWF nor SNS, but it seems to me that the SNS solution is simpler. Here's an excerpt from the article

Unreliable Town Clock (UTC)

The Unreliable Town Clock (UTC) is a new, free, public SNS Topic (Amazon Simple Notification Service) that broadcasts a “chime” message every quarter hour to all subscribers. It can send the chimes to AWS Lambda functions, SQS queues, and email addresses.

You can use the chime attributes to run your code every fifteen minutes, or only run your code once an hour (e.g., when minute == "00") or once a day (e.g., when hour == "00" and minute == "00") or any other series of intervals.

You can even subscribe a function you only want to run only once at a specific time in the future: Have the function ignore all invocations until it’s after the time it wants. When it is time, it can perform its job, then unsubscribe itself from the SNS Topic.

Connecting your code to the Unreliable Town Clock is fast and easy. No application process or account creation is required

Ligetti answered 11/7, 2015 at 7:9 Comment(1)
Not a valid answer anymore. The Unreliable Town Clock is not available anymoreFormate
C
17

NEW SOLUTION: Lambda Scheduled Jobs

Werner Vogel has announced tonight (10/08) at re:Invent that AWS Lambda now has it's own scheduler.

Se the AWS Lambda release note on 2015-10-08 :

You can also set up AWS Lambda to invoke your code on a regular, scheduled basis using the AWS Lambda console. You can specify a fixed rate (number of hours, days, or weeks) or you can specify a cron expression. For an example, see Walkthrough 5: Using Lambda Functions to Process Scheduled Events (Python).


OLD SOLUTION: Scheduling with AWS Data Pipeline

You can use AWS Data Pipeline to schedule a task with a given period. The action can be any command when you configure your Pipeline with the ShellCommandActivity.

You can for example run an AWS CLI command to:

  • Put a message to SQS
  • or directly invoke a Lambda function (see invoke)

You can easily create the AWS Data Pipeline scheduled task directly within AWS console (e.g. with an AWS CLI command) :

enter image description here

You can also use the API to define your scheduling:

{
 "pipelineId": "df-0937003356ZJEXAMPLE",
 "pipelineObjects": [
    {
      "id": "Schedule",
      "name": "Schedule",
      "fields": [
        { "key": "startDateTime", "stringValue": "2012-12-12T00:00:00" }, 
        { "key": "type", "stringValue": "Schedule" }, 
        { "key": "period", "stringValue": "1 hour" }, 
        { "key": "endDateTime", "stringValue": "2012-12-21T18:00:00"  }
       ]
     }, {
      "id": "DoSomething",
      "name": "DoSomething",
      "fields": [
        { "key": "type", "stringValue": "ShellCommandActivity" },
        { "key": "command", "stringValue": "echo hello" },
        { "key": "schedule", "refValue": "Schedule" }
      ]
    }
  ]
}

Limits: Minimum scheduling interval is 15 minutes.
Pricing: About $1.00 per month.

Challah answered 21/8, 2015 at 11:15 Comment(0)
G
9

Here is how I do it:

  • Create Lambda which:

  • Create CloudWatch Alarm for: ApproximateNumberOfMessagesVisible > 0 for 1 minute

  • Subscribe SNS Topic to the Alarm
  • Subscribe Lambda to SNS Topic

Now you have a timer with approximately 15 minutes resolution.

Then other Lambda functions are subscribed to SNS Topic and called every 15 minutes.

Gooseberry answered 14/7, 2015 at 19:7 Comment(3)
This answer is basically instructions for one mechanism that can implement the Unreliable Town Clock described in Shadi's Answer. Given that the author of UTC warns that it " may disappear without warning at any time" , your approach is probably far superior.Haemolysin
First implementation - 1 message - works couple of days and stops. It looks like periodically message is just not delivered to SQS. Added 2 more messages (3 in sum) - now it works already a week. In CloudWatch I see periodic misses - just 2 messages delivered, still timer ticks fine. Gist has been updated gist.github.com/mikeplavsky/5ffe7e33e0d70a248537Gooseberry
@Haemolysin As the author of the Unreliable Town Clock (townclock.io) I would agree that running your own gives you more control than depending on some stranger (me). In fact, I encourage folks to run their own Unreliable Town Clock and have published the source on GitHub: github.com/alestic/alestic-unreliable-town-clockInfantryman
S
4

Since it is now easily possible to trigger lambda functions over HTTP (e.g. using GET or curl) a simple solution is to use a managed CRON like easycron: https://www.easycron.com/ to trigger your lambda function into running.

We had the same problem and ended up running a cron service on Google App Engine in python since this allowed for more flexibility and complexity in the CRON job itself.

Spout answered 30/7, 2015 at 6:59 Comment(1)
Times have changed and Lambda now support cron-type scheduling out the box docs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.htmlSpout
A
3

In the Function page, Add trigger, you can add a CloudWatch Events, and make it as a schedule type

enter image description here

Argus answered 3/8, 2019 at 5:9 Comment(0)
S
3

Posted - 27 June 2021

You can schedule AWS Lambda functions using Amazon EventBridge Here I am using AWS Management Console

  1. Select your Lambda function and in configuration select "Triggers" enter image description here

  2. Select EventBridge(CloudWatch Events) - Basically this is the latest version of one of the popular answers(using CloudWatch triggers). enter image description here

  3. Create a new rule - Add details. My lambda will be triggered at 4pm UTC everdayenter image description here.

Sanjuana answered 26/6, 2021 at 20:37 Comment(0)
C
3

AWS Recently(10-Nov-2022) launched a new service called EventBridge Scheduler or you can choose EventBridge Rules for this as well. As per your example here I'm going to trigger an event every day at 5.00 A.M. As you can see it shows us the next 10 trigger dates and times as well, this will really help us to manually check our cron before doing anything.

Please note, if you want to start this schedule on a specific date and time, please choose EventBridge Scheduler for that. It has a Timeframe option. If you want to know more information about Timeframeplease have look at this answer.

enter image description here

In the target section, you can select 35 AWS Lambda function options.

enter image description here

Hope this will help you.

Constriction answered 13/11, 2022 at 23:19 Comment(0)
E
2

Run as cron in AWS

An example to setup cloudwatch schedule event trigger for you lambda using cloudformation.


  LambdaSchedule:
    Type: "AWS::Events::Rule"
    Properties:
      Description: A schedule for the Lambda function..
      ScheduleExpression: rate(5 minutes)
      State: ENABLED
      Targets:
        - Arn: !Sub ${LambdaFunction.Arn}
          Id: LambdaSchedule

  LambdaSchedulePermission:
    Type: "AWS::Lambda::Permission"
    Properties:
      Action: 'lambda:InvokeFunction'
      FunctionName: !Sub ${LambdaFunction.Arn}
      Principal: 'events.amazonaws.com'
      SourceArn: !Sub ${LambdaSchedule.Arn}

  LambdaFunction:
    Type: "AWS::Lambda::Function"
    Properties:
      Description: Scheduled lambda to run every 5 minutes
      CodeUri: ./build/package.zip
      Handler: index.lambda_handler
      MemorySize: 128
      Runtime: python3.6
Epithet answered 20/8, 2020 at 20:45 Comment(0)
L
1

You could schedule it with cloudWatch events too. Create rule -> attach target (lambda) and set up cron/rate wise schedule on your rule.

Ludvig answered 28/6, 2016 at 14:41 Comment(0)
P
1

The web-console way is pretty straightforward. Just create a CloudWatch rule for the lambda and add it in the lambda's Triggers tab.

For those who needs to automate that with aws cli, we can

  1. create the function,
  2. create the rule,
  3. grant the permission,
  4. link rule and function

Create function

aws lambda create-function --function-name ${FUNCTION-NAME} \
--runtime java8 \
--role 'arn:aws:iam::${Account}:role/${ROLE}' \
--handler org.yourCompany.LambdaApp \
--code '{"S3Bucket":"yourBucket", "S3Key": "RC/yourapp.jar"}' \
--description 'check hive connection' \
--timeout 180 \
--memory-size 384 \
--publish \
--vpc-config '{"SubnetIds": ["subnet-1d2e3435", "subnet-0df4547a"], "SecurityGroupIds": ["sg-cb17b1ae", "sg-0e7ae277"]}' \
--environment Variables={springEnv=dev}

Create rules

## create
aws events put-rule --name ${ruleName} \
--schedule-expression 'rate(5 minutes)' \
--state ENABLED \
--description 'check hive connection'

# grant permission to the Rule to allow it to trigger the function
aws lambda add-permission --function-name ${functionName} \
--statement-id 123 \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-east-1:acc:rule/${ruleName}

# link rule and function
aws events put-targets --rule ${ruleName} \
--targets '[{"Id":"1", "Arn":"arn:aws:lambda:us-east-1:acc:function:RC-checkhive"}]'
Paff answered 13/2, 2017 at 22:33 Comment(0)
C
1

simple way to run your query in lambda for particular time interval is to set rule for your lambda function. for that after creating lambda function go to cloudwatch>>rules>>schedule. and define cron expression and in the target section select lambda function which you want to trigger.

Cleveland answered 8/3, 2019 at 10:29 Comment(0)
A
1

EventsBridge (CloudWatch) Solution:

You can create an AWS Events Bridge Rule and set a Lambda function as the target using its ARN. You can specify a rate or cron schedule expression. For example, the following expression will run your Lambda function after every ten minutes on all weekdays.

schedule = "cron(0/10 * ? * MON-FRI *)"

Note that your EventsBridge role will also require the lambda:InvokeFunction permission so EventsBridge can trigger your Lambda function.

Here's a full tutorial for the Terraform setup for this architecture: https://medium.com/geekculture/terraform-setup-for-scheduled-lambda-functions-f01931040007

Antiphlogistic answered 28/8, 2022 at 19:18 Comment(0)
M
0

While creating the lambda function create trigger "CloudWatch Events - Schedule"

Now you can either use AWS presets in schedule expression like rate = 15 min or you can use a cron expression.

enter image description here

For your requirement the Cron Schedule is "0 0 17 1/1 * ? *"

Metaphor answered 29/1, 2017 at 18:25 Comment(0)
T
0

Here's an example of deploying up a Scheduled Lambda to run every 10 minutes using Serverless. The function handler is located at src/scheduled/index.handler and the rate is specified in the Lambda's settings. AWS uses EventBridge now to control when the Lambda should be invoked. That is all setup automatically for you when using Serverless. You can see the setup in the AWS console by viewing the Lambda or by looking at the "default" EventBridge in the EventBridge section.

https://carova.io/snippets/serverless-aws-lambdafunction-scheduled-cronjob

Trophozoite answered 18/8, 2022 at 2:33 Comment(0)
U
-1

Diksha is AWS Lambda Scheduler based on AWS SWF Trigger as recommended by AWS Team. One can schedule jobs using cron expressions and can also specify how many time you want to run, when to start or when to end. You can view status as well as history of scheduled jobs. Security is managed by AWS policies.

Once you set up diksha engine, you can schedule functions using cron expression in following way:

java -jar diksha-client-0.0.1.jar -lcfg cf1 -cj "jobName|functionName|context|0 0-59 * * * *|10"

In this job job will run every minute for 10 times. AWS SWF will trigger function by itself.

Details: https://github.com/milindparikh/diksha

Disclaimer: I am contributor to the project.

Use answered 14/8, 2015 at 13:45 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.