Cron ジョブを Lambda Scheduled Event に置き換えてサーバーレスを目指す
Posted on
- #aws
AWS re:Invent 2015 で Lambda のアップデートが発表されました。 Lambda の欠点が見事に改善されて、ますます使いやすくなりました!
この中でも特に待ちわびていたのが Scheduled Event です。これまでは S3, SNS, Kinesis など外部からのアクションに応じたイベントドリブンな使い方しかできませんでしたが、スケジュール機能が使えるようになったことで新たな使い方ができるようになりました。
Cron ジョブの問題点
日次バックアップなど時間ベースのジョブを実現するには、EC2 上の Cron に処理させるのが手っ取り早い方法でした。 AWS CLI とシェルスクリプトを組み合わせれば大抵のことは実現できます。
この方法には 2 つの問題があります。
- Cron のためだけに EC2 を起動しておかないといけない(コストもそうですが、何より運用するサーバは増やしたくない)
- この EC2 が単一障害点になってしまい全体の可用性を落とす(Cron でクラスタを組む手もありますが現実的じゃない)
1 つ目はまだ目をつぶれますが、2 つ目は無視できない問題です。 Lambda の Scheduled Event を使えば、この問題が解決します。
- コードが実行された分だけ課金され、インフラは AWS が面倒を見てくれる
- Lambda は複数の AZ に配置され 99.99% の可用性がある
さらに Python 2.7 がサポートされたことで、シェルスクリプトで書いたコードを簡単に移植できるようになりました(これまでの経験によると思いますが、シェルスクリプトを Node.js や Java に書き直すのは結構つらいです)。
Scheduled Event を設定してみる
ドキュメントを参考に Scheduled Event を設定してみます。
Event sources から Add event source をクリック、Event source type で Scheduled Event を選択すると設定画面が表示されます。
この画面では「月曜日から金曜日の 9 時」に batch という名前のスケジュールを設定しています(時刻は UTC ベースなのでマイナス 9 時間してください)。 Unix 系の crontab とは書式が違っていて、月初や年指定ができて便利です。
cron(Minutes Hours Day-of-month Month Day-of-week Year)
このエントリーを書いている時点では、API や CLI はまだ未対応なので Management Console から設定する必要があります。
まとめ
スケジュール機能が使えるようになったおかげで、Lambda を活用するシーンが一気に広がったと思います。実行時間の延長や VPC サポートなども嬉しい改善もあり、サーバーレスアーキテクチャをより一段と進められそうです :-)