私が歌川です

@utgwkk が書いている

AWS Lambda + DynamoDBでzatsu_monitorをサーバーレスで動かす

モチベーション

zatsu_monitorはシンプルなURL監視ツールです。crontab等で定期的に指定したURLにリクエストを送信し、ステータスコードに変化があれば通知してくれます。詳しくは作者の id:sue445 氏の記事をご覧ください。

sue445.hatenablog.com

手軽にURLを監視したいけどサーバーの管理はしたくない、というモチベーションで実装を進めることにしました。

方針

ここではAWSを使うことにします。GCPなど他のクラウドサービスにも対応するコンポーネントがあると思うので、適宜読み替えたら再現できると思います。

サーバーレスといえばLambda、ということでzatsu_monitorをLambdaで定期実行する大方針を固めます。単に実行するだけなら main 関数をちょっと差し替えればできます。ところで、zatsu_monitorはファイルシステム上に状態*1を持っているので、これをLambdaでどう扱うか考えなければいけません。

ぱっと思いつく方針としては以下があります。

  • LambdaからEFSをマウントする
  • DynamoDBに状態を持つように修正する

コードを修正する量を考えると、LambdaからEFSをマウントするほうが手間が少ないかもしれません。しかし、EFSの容量や料金を気にするよりは、もっとサーバーレスに寄せたストレージに書き込む方がよさそう*2、と判断してDynamoDBを使うようにコードを書き換えることにしました。

完成品

forkしたリポジトリの dynamodb ブランチに実装をpushしています。大きなみどころは以下の2つです。

DynamoDBのテーブルを作って、LambdaのトリガーにEventBridge (CloudWatch Events)を設定し、5分おきに関数を実行するようにして完成です。テーブル構成は本当にシンプルなkey-value storeになっています。

改善したい点

Lambda関数のzipに設定ファイルを同梱してデプロイする形なので、zatsu_monitorの設定を修正する場合はデプロイが必要になります。また、LambdaのWebコンソールから設定内容を確認することができません。

おわりに

サーバーレス元年ということで、便利なツールがサーバーレス環境で動くように改造するのもよいかもしれません。

*1:前回リクエスト時のステータスコード

*2:DynamoDBを触ってみたかった、という裏テーマもある