ブログ・ア・ラ・クレーム

技術的なメモとかライフログとか。

AWS Lambda と CloudWatch を使ってローカルで動かしていたcronの処理をサーバレスにする

普通に生きていると「あっこのバッチ処理定期的に動かしたいな」と思うことがあると思われます。 自分もご多分に漏れずそうだったのですが、私物 PC で cron で回すのも煩わしい(外出中はスリープさせたいので)し、 VPS などでインスタンス借りるのも目的に対してやり過ぎ感があります。 というわけで今回は AWS Lambda + CloudWatch を使って置き換えてみました

前提として

最初は Google Cloud Functions でやろうと思っていたのですが、ただ cron の代替としてちょっとした処理を動かしたい為に結構な労力を払わされそうに見受けられました。

https://developers-jp.googleblog.com/2017/04/how-to-schedule-cron-jobs-with-cloud.html

AWS であれば自分にとって必要最小限のサービスで構成できそうなので乗り換えた次第です。 要件によっては GCP で構成しても良さそうかな・・・と思います。

手順

以下の順序で cron の処理の置き換えをしました。

  • バッチ処理を Node.js で再実装

    • 元々 10 数分で書いたシェルスクリプトだったのですが Lambda でサポートしている言語で再実装しておきました
    • Lambda で実行可能なコードであれば他の言語でも別に良い
  • CloudWatch にイベント登録

    • 以下画面からルールの追加画面に遷移し・・・

f:id:syu_cream:20171009231543p:plain

  • スケジュールをお好みの形で設定

f:id:syu_cream:20171009231655p:plain

  • 後は Lambda で関数が定期的に呼び出されていることを確認

    • 自分が書いた CloudWatch の設定では 1h に一回呼び出されることを想定したものであり、以下のような呼び出し回数グラフが得られました

f:id:syu_cream:20171009231901p:plain

料金

以上で実現したバッチ処理の置き換えですが、料金はどのくらいになるのでしょうか。 自分が書いた Lambda の関数呼び出しは大体 7s 前後で終わっているようで、これを 1h に一回呼び出す状態で運用しています。 この結果、 AWS 請求画面でレポートされる請求に関する情報は以下のとおりになりました。

f:id:syu_cream:20171009232144p:plain

無料枠に収まっているというか全然使いこなせていない感があります。