モチベーション
zatsu_monitorはシンプルなURL監視ツールです。crontab等で定期的に指定したURLにリクエストを送信し、ステータスコードに変化があれば通知してくれます。詳しくは作者の id:sue445 氏の記事をご覧ください。
手軽に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コンソールから設定内容を確認することができません。
おわりに
サーバーレス元年ということで、便利なツールがサーバーレス環境で動くように改造するのもよいかもしれません。