個人開発サービスのログをぜんぶ CloudWatch Logs にまとめた
3 行でまとめると
- ログを CloudWatch Logs に集約した
- Metric filter でエラー数をメトリクス化した
- CloudWatch Alarms ではなく Lambda でエラーを Slack 通知させるようにした
CloudWatch Logs にログを集約した
zenrei.nyamikan.net をすべて Docker 化した のに続いて、 P2P 地震情報やにゃみかんの個人開発サービスのログを CloudWatch Logs に集約しました。
むかし
これまでは Monit や Xymon (旧 Hobbit ) を使ったログ監視を行っていました。
ログファイルとアラート対象のキーワードを指定するシンプルな仕組みでしたが、 長期運用するには少し面倒 でした。あと使っているものが古い 。
- ディスクフル。気がつくとログがいっぱいになりがち。ログは残しておきたいので logrotate で消すわけにもいかず、定期的に退避する仕組みを用意するのも面倒で、手で退避させる作業を時々やっていた。
- 再設定の手間。 Debian GNU/Linux の LTS リリースの度にサーバを構築し直しているが、 2 年に 1 回なのでいつも設定方法を忘れて四苦八苦していた。
いま
いまは CloudWatch へ集約した形にしました(その他、大部分を Docker コンテナ化してポータビリティを高めています)。
ログ収集
CloudWatch エージェント もしくは "awslogs" Docker ログドライバ を用いて CloudWatch Logs にログを集約します。この際、サーバ起動時に logs.*.amazonaws.com
が解決できない問題にハマりました。 Docker サービス起動前に 30 秒のスリープを入れる雑な方法で対処しています。
→ExecStartPre=/bin/sleep 30 というゴリ押しで暫定対処した
— たいぷらいたー (@no_clock) 2020年3月2日
しっくり来ていない。しかしこの謎を明らかにすべく奥地へと向かう気力はない…
エラーの検出
エラー検出には、 CloudWatch のメトリクスフィルタを使用しています。特定のキーワードがあると、メトリクスがカウントされます。
20 弱あるロググループを手で設定するのは大変なので、 AWS CDK (C#) でコード化しています(参考: AWS CDK for .NET: C# で CloudWatch Metric Filter を設定する - にゃみかんてっくろぐ)。
エラーの通知
ふつうはメトリクスを CloudWatch Alarms で監視させますが、今回は使いませんでした。 CloudWatch Events で Lambda をキックして Slack に通知させています。
- アラームメトリクスあたり $0.1/month で、今後メトリクスを増やすとそこそこのお値段になってしまう。
- 個人開発で Lambda を有効活用してみたい。
合理的というよりは 興味本位 の選択です。
コードは Gist に置いていますが、不慣れな JavaScript && 動けばいいやの精神なので可読性はお察しください → Notify CloudWatch Metrics to Slack (typewriter/metrics-to-slack.js)
おねだん
気になるお値段はざっとこんな感じです。
サービス | 月額料金 | 備考 |
---|---|---|
CloudWatch Logs ログ収集 | $0.76 | 無料枠 5GB/ 月 を超え、毎月 6GB ほどのログを収集している |
CloudWatch Logs ログ保管 | $0.00 | 無料枠 5GB/ 月 以下(まだ運用して 1 ヶ月ほどで蓄積がないため) |
CloudWatch Metrics | $0.00 | 無料枠 10 メトリクス / 月以下。メトリクスフィルタはデータポイントが発生しない部分は課金されない様子 |
CloudWatch Events | $0.04 ? | 無料枠なし。まだ請求に上がって来ていないが、カスタムイベント扱い・毎分実行の場合で計算 |
Lambda | $0.00 | 実行回数 43,200 回(無料枠 1,000,000 回)、実行時間 3,240 GB 秒(無料枠 400,000 GB 秒) |
感想
総合すると、そこそこ楽になりました。
- よいところ
- ディスクフルを気にしなくていい
- 1 箇所に集約されている安心感
- 「とりあえず CloudWatch Logs に流しちゃお」というデフォルトの選択肢が出来た
- わるいところ
- 雑に作った通知がエラー数だけで、エラー内容は見に行かないと行けない
- どちらでもないところ
- 毎月 6GB もログが発生していることに初めて気づいた