LoginSignup
33
33

More than 5 years have passed since last update.

Lambda を cron 的に使う Ver 2015.09

Last updated at Posted at 2015-09-09

先日の "JAWS-UG 千葉支部 Vol.5 ~秋のAWS Lambda & API Gateway 祭り!!~" の懇親会で飛び入りLTさせて頂いた内容です。

これまでのLambda を cron 的に使う試み

AWS Lambdaをcronの代わりに使ってみるよ

S3のEventから起動され、S3のobjectを作成する事でループする手法

s3-lambda-s3

もしLambdaからS3にobjectを入れるのに失敗すると、そこでループが途切れてしまう、また頻度は最長でも1分に1回程度

Azure Job Scheduler + AWS Lambdaで夢のサーバレス定期ジョブを実現する

azure-s3-lambda

自分もこの記事を見て、同じ形で長らく使っていました(無料枠でも1時間に1度なら使用できます)。

どうにかしてAWSのサービスのみで実装できないだろうか?

■ 実験1 Dead Dead Queue DeDeDeDe-Destruction パティーン

最初はSQSを2つ作って Dead Queue として指定したらお互いにメッセージを投げ合えないだろうか?と考えてみました。

sqs-sqs

→ 一度も受信されなかったメッセージは Dead Queue には入らなかった...

#LambdaでSQSを読み捨てするのもアリかと思ったけど、失敗した時に途切れるのでボツ

■ 実験2 Return to myself パティーン

Alarm を設定しているうちに、ふと SQS は SNS Topic を Subscribe できる事に気付いたので、以下の手順で定期的に SNS Alarm を鳴らす事に成功した。

  1. SQS のキューを作成する(その際にメッセージ保持期間を繰り返したい時間-5分とかに設定する)
  2. SQSにメッセージがない状態(ApproximateNumberOfMessagesVisible<=0)が一定時間(5分)続いたら、CloudWatch Alarm から SNS Topic へアラートを送る
  3. 上記 SNS Topic には 上記の SQS Queue を Subscribe させておく

これによって、メッセージがないというアラートがSQSメッセージとして同じキューに届き、メッセージ保持期間を過ぎたらまたアラートが飛んでメッセージが届く、というループ状態になる。

これを使用して、SNS Topic に Lambda function を指定しておくと、一定時間に1度 Lambda function が実行される状態となる。

sqs-sns-lambda

SNS から SQS へのアラートが失敗する事はリスクとして存在するが、例えば1時間以上0が続いたらアラートが鳴るような設定を追加する事で、何か問題が発生しても1時間でリトライがかかるようになる。

ただ、SQS の ApproximateNumberOfMessagesVisible メトリックはメッセージが入れられてから数字が検知されるまでに間があるので、メッセージ保持期間は10分未満には設定しない方がよいと思われる。

まとめ

汎用のスケジューラ( REST の URL や AWS の API コールが行えるもの)があるといいのですが!

33
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
33