AWS Lambdaスケジュールされたタスク


145

AmazonはAWS Lambda(http://aws.amazon.com/lambda/)を発表しました。

製品の説明は次のとおりです。

スケジュールされたタスク

AWS Lambda関数は外部イベントタイマーによってトリガーできるため、定期的にスケジュールされたメンテナンス時間または非ピーク時に関数を実行できます。たとえば、AWS Lambda関数をトリガーして、忙しくない時間に毎晩アーカイブのクリーンアップを実行できます。

これを読んだとき、私はようやく「cronのような」タスクを一貫して実行する方法があることが理解できました。特定のクエリを毎日午後5時に実行したいとしましょう。

ただし、これはドキュメントのどこにもありません。彼らは、プログラム上のイベント、または他のAWSサービスからのイベントのトリガーについてのみ言及しています。

誤解しましたか?または、誰かが私にドキュメントを指摘できますか?

回答:


159

2015年10月8日に追加されたスケジュールされたイベントのネイティブサポート:

このAWSブログ投稿で発表されているように、スケジューリングは「CloudWatchイベント-スケジュール」と呼ばれるイベントソースタイプ(トリガーとも呼ばれます)としてサポートされ、レートまたはcron式として表すことができます。

スケジュールされたイベントを新しいラムダに追加する

作成の「トリガーの構成」ステップに移動し、「CloudWatchイベント-スケジュール」トリガーを指定します。以下の設定例:

UTC午後5時にスケジュールされたイベントを作成するための構成を示す画像。

スケジュールされたイベントを既存のラムダに追加する

ラムダの[トリガー]タブに移動し、[トリガーの追加]を選択して、[CloudWatchイベント-スケジュール]トリガーを指定します。SNSトリガーを備えた既存のラムダがあるスクリーンショットの例:

LambdaコンソールからナビゲートしてトリガーUIを追加する方法を示す画像。

ロードされると、このトリガーを構成するためのUIは、上記の「新しいラムダにスケジュールされたイベントを追加する」セクションのスクリーンショットと同じです。

討論

あなたの例の場合、のcron()代わりに使用したいと思うでしょうrate()。ラムダのCron式はすべてのフィールドを必要とし、UTCで表現されます。したがって、毎日午後5時(UTC)に関数を実行するには、次のcron式を使用します。

cron(0 17 * * ? *)

さらなるリソース

ノート

  • この機能の最初のリリース以降、このイベントタイプの名前は「スケジュールされたイベント」から「CloudWatchイベント-スケジュール」に変更されました。
  • この機能がリリースされる前は、この問題に対する推奨される解決策(「AWS Lambdaの開始」による42分50秒)は、SWFを使用してタイマーを作成するか、外部アプリケーションでタイマーを作成することでした。
  • Lambda UIは、予定されているイベントのブログ投稿が公開されて以来、全面的に見直されており、スクリーンショットは正確ではなくなっています。最新の改訂版については、2017年3月10日の上記のスクリーンショットの更新を参照してください。

1分間の精度サポートに希望があるかどうか知っていますか。
カプタン2016年

2
これは少しハックですが、1分の頻度でこれを行うことができますyoutube.com/watch?v=FhJxTIq81AU
ingh.am

4
イベントソースタイプは「CloudWatchイベント-スケジュール」になりました
Guy Daher

@GuyDaherありがとう、私はそれに応じて私の答えを更新しました。
Anthony Neace 2016年

3
現在、1分の速度をサポートしています。docs.aws.amazon.com/lambda/latest/dg/...
advncd

18

:この記事の時以来、別の解決策に上昇しているように思わスケジュールザ・信頼できないタウンクロック(UTC)AWSラムダ呼び出しでの定期的な著者は、SNSのトピックにサブスクライブを提案した信頼性の低いタウンクロックを。私はSWFもSNSも使用していませんが、SNSソリューションの方がシンプルなようです。これは記事の抜粋です

信頼できない町時計(UTC)

Unreliable Town Clock(UTC)は、無料のパブリックSNSトピック(Amazon Simple Notification Service)で、「チャイム」メッセージを15分ごとにすべてのサブスクライバーにブロードキャストします。チャイムをAWS Lambda関数、SQSキュー、メールアドレスに送信できます。

チャイム属性を使用して、15分ごとにコードを実行したり、1時間に1回だけ(たとえば、minute == "00"のとき)または1日に1回(たとえば、hour == "00"およびminute =のときに)コードを実行できます。 = "00")またはその他の一連の間隔。

将来の特定の時間に1回だけ実行したい関数をサブスクライブすることもできます。必要な時間が経過するまで関数がすべての呼び出しを無視するようにします。時間が来ると、ジョブを実行し、SNSトピックから自分自身の登録を解除できます。

コードをUnreliable Town Clockに接続するのは速くて簡単です。申請プロセスやアカウント作成は必要ありません


9
もう有効な答えではありません。Unreliable Town Clockは利用できなくなりました
blueskin

15

新しいソリューション:Lambdaのスケジュールされたジョブ

Werner Vogelが今夜(10/08)re:InventでAWS Lambdaに独自のスケジューラーがあることを発表しました。

Seの2015年10月8日にAWSラムダリリースノート

AWS Lambdaコンソールを使用して、定期的にスケジュールされたコードを呼び出すようにAWS Lambdaを設定することもできます。固定レート(時間数、日数、週数)を指定することも、cron式を指定することもできます。例については、「チュートリアル5:Lambda関数を使用してスケジュールされたイベントを処理する(Python)」を参照してください。


古いソリューション:AWS Data Pipelineを使用したスケジュール

AWS Data Pipelineを使用して、特定の期間でタスクをスケジュールできます。ShellCommandActivityを使用してパイプラインを構成する場合、アクションは任意のコマンドにすることができます。

たとえば、AWS CLIコマンドを実行して次のことができます。

  • SQSにメッセージを書き込む
  • またはLambda関数を直接呼び出すinvokeを参照)

AWSコンソール内で直接AWS Data Pipelineスケジュールタスクを簡単に作成できます(例:AWS CLIコマンドを使用)。

ここに画像の説明を入力してください

APIを使用して、スケジュールを定義することもできます。

{
 "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" }
      ]
    }
  ]
}

制限:最小のスケジュール間隔は15分です。
価格:月額約1.00ドル。


9

ここに私がそれをする方法があります:

  • Lambdaを作成します。

  • 次のCloudWatchアラームを作成します:ApproximateNumberOfMessagesVisible> 0 1分間

  • SNSトピックをアラームに登録する
  • LambdaをSNSトピックにサブスクライブする

これで、約15分の分解能を持つタイマーができました。

次に、他のLambda関数がSNSトピックにサブスクライブされ、15分ごとに呼び出されます。


4
この回答は、基本的には、Shadiの回答で説明されている信頼できないタウンクロックを実装できる1つのメカニズムの説明です。UTCの作者が「いつでも警告なしに消える可能性がある」と警告していることを考えると、あなたのアプローチはおそらくはるかに優れています。
ブライアン

最初の実装-1つのメッセージ-数日間機能して停止します。定期的にメッセージがSQSに配信されないようです。さらに2つのメッセージ(合計3つ)を追加しました-現在は1週間で動作します。CloudWatchで定期的なミスが見られます。配信されるメッセージは2つだけですが、それでもタイマーティックは問題ありません。Gistが更新されましたgist.github.com/mikeplavsky/5ffe7e33e0d70a248537
maplpro 2015

@Brian Unreliable Town Clock(townclock.io)の作者として、自分で実行すると、見知らぬ人(私)に頼るよりも自分でコントロールできるようになることに同意します。実際、私は人々が自分のUnreliable Town Clockを実行することを奨励し、GitHubでソースを公開しています:github.com/alestic/alestic-unreliable-town-clock
Eric Hammond

4

それが今であるので、容易に可能:(たとえば、GETまたはカールを使用して)HTTPを介してトリガラムダ関数に簡単な解決策はeasycronのように管理CRONを使用することですhttps://www.easycron.com/実行しているにあなたのラムダ関数をトリガします。

同じ問題があり、CRONジョブ自体の柔軟性と複雑性が向上したため、PythonのGoogle App Engineでcronサービスを実行することになりました。


時代は変わったとラムダは現在、ボックスの外のcron型スケジューリングをサポートdocs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html
ディルク・コンラッドCoetsee

2

[Function]ページの[Add trigger]では、CloudWatchイベントを追加して、それをスケジュールタイプとして作成できます

ここに画像の説明を入力してください


1

cloudWatchイベントでもスケジュールできます。ルールを作成->ターゲット(lambda)をアタッチし、ルールにcron / rateごとのスケジュールを設定します。


1

Webコンソールの方法は非常に簡単です。CloudWatchラムダのルールを作成して、ラムダのTriggersタブに追加するだけです。

それをで自動化する必要がある人のためにaws cli

  1. 関数を作成し、
  2. ルールを作成し、
  3. 許可を与える、
  4. リンクのルールと機能

関数を作成する

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
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"}]'

1

特定の時間間隔でラムダでクエリを実行する簡単な方法は、ラムダ関数のルールを設定することです。そのためには、ラムダ関数を作成した後、cloudwatch >> rules >> scheduleに移動します。そしてcron式を定義し、ターゲットセクションでトリガーしたいラムダ関数を選択します。


0

ラムダ関数の作成中にトリガー「CloudWatchイベント-スケジュール」を作成する

これで、rate = 15 minなどのスケジュール式でAWSプリセットを使用するか、cron式を使用できます。

ここに画像の説明を入力してください

あなたの要件では、cronスケジュールは「0 0 17 1/1 *?*」です


-1

ディクシャは、AWSチームが推奨するAWS SWFトリガーに基づくAWS Lambdaスケジューラーです。cron式を使用してジョブをスケジュールし、実行する時間、開始するタイミング、または終了するタイミングを指定することもできます。スケジュールされたジョブのステータスと履歴を表示できます。セキュリティはAWSポリシーによって管理されます。

dikshaエンジンをセットアップしたら、次のようにcron式を使用して関数をスケジュールできます。

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

このジョブでは、ジョブは毎分10回実行されます。AWS SWFはそれ自体で機能をトリガーします。

詳細:https : //github.com/milindparikh/diksha

免責事項:私はプロジェクトに貢献しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.