AWS Lambdaを1分間隔でスケジュール実行する #reinvent

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS Lambdaのアップデートにより、本記事のワークアラウンドを用いなくても、 
rate(1 minute)
とすることで、1 分間隔を指定できるようになっています。(2015年4月25日現在)。
Announcement: Scheduled Events now support 1-minute granularity

はじめに

re:invent 2015でLambdaにスケジュール化されたファンクション(Cron)機能が追加されました。
スケジュールの指定は

rate(5 minutes)

のように間隔を指定する方法と

cron(*/5 * * * ? *)

の用にcron形式で指定する方法があります。
Walkthrough 5: Using Lambda Functions to Process Scheduled Events (Python)

ただし、スケジュールの最短間隔は5分のため、それ以下で指定するとエラーが発生してしまいます。
例えば、毎分実行される用に設定しようとしても
WS000006

エラーが出て登録できません。
WS000007

今回は力技で解決してみました。

設定と結果

イベントソースとして下記のような設定のスケジューラを作成しました。

  • cron(*/5 * * * ? *)
  • cron(1,6,11,16,21,26,31,36,41,46,51,56 * * * ? *)
  • cron(2,7,12,17,22,27,32,37,42,47,52,57 * * * ? *)
  • cron(3,8,13,18,23,28,33,38,43,48,53,58 * * * ? *)
  • cron(4,9,14,19,24,29,34,39,44,49,54,59 * * * ? *)

5分間隔のスケジューラーを5つ作ることで結果として1分ずつ実行されるようにしています。

WS000010

CloudWatchでInvocation数を確認したところ、ちゃんと毎分実行されていました。
WS000012

最後に

5分よりも短い間隔で頻繁にLambda実行したい場合はイベントソースを増やすことで対応できそうです。

AWS Lambdaのスケジュール実行の活用例は本ブログでもいくつか紹介しているので、こちらもご参照ください。
LambdaのScheduleイベントでEC2を自動起動&自動停止してみた#reinvent
AWS LambdaからPythonでEC2のインスタンスを起動するスケジュールを設定してみた #reinvent