にゃみかんてっくろぐ

猫か百合を見守る壁になりたい

個人開発サービスのログをぜんぶ CloudWatch Logs にまとめた

3 行でまとめると

  • ログを CloudWatch Logs に集約した
  • Metric filter でエラー数をメトリクス化した
  • CloudWatch Alarms ではなく Lambda でエラーを Slack 通知させるようにした

CloudWatch Logs にログを集約した

zenrei.nyamikan.net をすべて Docker 化した のに続いて、 P2P 地震情報にゃみかんの個人開発サービスのログを CloudWatch Logs に集約しました。

むかし

これまでは MonitXymon (旧 Hobbit ) を使ったログ監視を行っていました。

f:id:no_clock:20200531163107p:plain
旧構成

ログファイルとアラート対象のキーワードを指定するシンプルな仕組みでしたが、 長期運用するには少し面倒 でした。あと使っているものが古い 。

  • ディスクフル。気がつくとログがいっぱいになりがち。ログは残しておきたいので logrotate で消すわけにもいかず、定期的に退避する仕組みを用意するのも面倒で、手で退避させる作業を時々やっていた。
  • 再設定の手間Debian GNU/Linux の LTS リリースの度にサーバを構築し直しているが、 2 年に 1 回なのでいつも設定方法を忘れて四苦八苦していた。

いま

いまは CloudWatch へ集約した形にしました(その他、大部分を Docker コンテナ化してポータビリティを高めています)。

f:id:no_clock:20200531151932p:plain
新構成

ログ収集

CloudWatch エージェント もしくは "awslogs" Docker ログドライバ を用いて CloudWatch Logs にログを集約します。この際、サーバ起動時に logs.*.amazonaws.com が解決できない問題にハマりました。 Docker サービス起動前に 30 秒のスリープを入れる雑な方法で対処しています。

エラーの検出

エラー検出には、 CloudWatch のメトリクスフィルタを使用しています。特定のキーワードがあると、メトリクスがカウントされます。

f:id:no_clock:20200531171226p:plain
エラーがメトリクスでカウントされている様子

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)

f:id:no_clock:20200531172812p:plain
ゆかりさんが Slack にエラー発生を通知してくれている図

おねだん

気になるお値段はざっとこんな感じです。

サービス 月額料金 備考
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 もログが発生していることに初めて気づいた