web-dev-qa-db-ja.com

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

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

製品の説明には以下が含まれます。

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

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

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

しかし、私はドキュメントのどこにもこれを見つけません。プログラマティックイベント、または他のAWSサービスからのイベントのトリガーのみに言及しています。

誤解しましたか?または、誰かがドキュメントを教えてくれますか?

127
Nathan H

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

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

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

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

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

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

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

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

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

討論

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

cron(0 17 * * ? *)

さらなるリソース

ノート

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

新しいソリューション:Lambda Scheduled Jobs

Werner Vogelは今夜(10/08)re:Inventで、AWS Lambdaが独自のスケジューラーを持つようになったことを発表しました。

AWS Lambdaリリースノート2015-10-08

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


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

AWS Data Pipelineを使用して、特定の期間のタスクを schedule にできます。 ShellCommandActivity でPipelineを構成する場合、アクションは任意のコマンドにできます。

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

  • SQSにメッセージを入力する
  • または直接Lambda関数を呼び出しますinvoke を参照)

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

enter image description here

APIを使用して define スケジューリングを行うこともできます。

{
 "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ドル。

14
Yves M.

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

  • 次のLambdaを作成します。

  • 以下のCloudWatchアラームを作成:1分間のメッセージの概数> 0

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

これで、約15分の解像度のタイマーができました。

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

7
maplpro

簡単に可能 HTTP経由でラムダ関数をトリガーする(たとえば、GETまたはcurlを使用する)ため、簡単な解決策はeasycronのようなマネージドCRONを使用することです: https://www.easycron。 com / ラムダ関数の実行をトリガーします。

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

4

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

1
PKP

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
LeOn - Han Li

ラムダ関数の作成中にトリガー「CloudWatch Events-Schedule」を作成します

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

enter image description here

要件については、Cronスケジュールは「0 0 17 1/1 *?*」です。

0
AMS

CloudWatchイベントでもスケジュールできます。ルールを作成->ターゲット(ラムダ)をアタッチし、ルールにcron/rate賢明なスケジュールを設定します。

0
johnny

[関数]ページの[トリガーの追加]で、CloudWatchイベントを追加し、スケジュールタイプとして作成できます。

enter image description here

0
Vicky