一定時間以上稼働している ECS タスクを検知する
はじめに
atama plusではAWS ECSを様々なケースで利用しています。サービスの基盤としてはもちろん、タスクをCIから実行することでデータベースのマイグレーションを行ったり、運用作業の一環として手動でタスクを実行したりすることもあります。
この記事ではECSタスクが意図せず起動し続けてしまうという問題に直面したので、その検知方法と調査過程での学びを紹介します。
ECSのタスクが意図せず長時間起動している
ある時CIのマイグレーションのジョブが失敗したため再実行をしました。その後ジョブは正常に終了したのですが、失敗したジョブで実行されたタスクが終了しておらず起動したままになっているのを2日後に発見しました。
具体的に問題が発生していたわけではありませんが、このままでは次のような問題を引き起こす可能性があります。
- インフラコストの増加
- データベースの競合状態
- データ不整合
また、他の環境も調べてみると運用上の利用で手動実行されたタスクがいくつか起動し続けていることも分かりました。
弊社ではサービスで利用しているタスクは日次で再起動をしているので、24時間以上起動しているタスクを異常とみなし検知する仕組みを実装することにしました。
検知方法の調査
弊社ではDatadogを利用しているのでDatadogに送信されているメトリクスからモニターを作成し監視することをまずは考えました。ただ、ECSのメトリクスにはタスクの起動時間を計るものがなかったので以下の代替案を検討しました。
- LambdaとEventBridgeを用いて、ECSのdescribe tasksのAPIを定期的に呼び出し、タスク毎に
startedAt
プロパティが24時間以上経過しているかどうかを確認
しかし、やりたいことに対し実装がオーバースペックに感じたためこちらの案は一旦見送りとしました。
さらに調査していった結果、以下の案も出たのですがまた後日に詳細に実装方法の検討をすることになりました。
- Docker integrationを有効化してdocker.uptimeメトリクスを監視する
- CloudWatch Agentを使って
/proc/uptime
をカスタムメトリクスとしてDatadogに送信
解決へのアプローチと検知方法の決定
後日調査を進める中で、ECSタスクの起動時間に関するメトリクスが本当に取れていないのか、DatadogのQuick Graphsを使ってメトリクスを確認してみました。すると、ECSタスク内の各コンテナについてcontainer.uptimeが取得できていることが分かりました。
container.uptime
はDatadogのContainer Integrationにより取得できるメトリクスでECS上では自動的に有効になっており取得できていました。
Container is a core Datadog Agent check and is automatically activated if any supported container runtime is detected.
Quick Graphsでグラフ化して見ても意図通りのメトリクスが取れていることが分かります。
max.container.uptime{task_name: 監視したいタスク定義の名前} by {task_arn}
よって、このcontainer.uptime
を監視するモニターを作成し24時間以上起動しているタスクを検知することに決めました。
調査に時間を要してしまった原因
最初の調査時にDockerのメトリクスのドキュメントを確認していたのですがcontainer.uptime
のメトリクスを見つけることができませんでした。container.uptime
は日本語のページには記載がなく英語のページにのみ記載があったため見落としてしまいました。他のクラウドのドキュメントでもよくありますが、英語のドキュメントを第一に確認すれば情報の抜け漏れは防げると学びました。
また最初からQuick Graphsで実際に取得できているメトリクスを確認していたらcontainer.uptime
に気づけたかもしれません。ドキュメントの確認だけで判断せずに、実際にメトリクスデータを確認して使えそうなメトリクスがあるかを判断すべきでした。
まとめ
ECSタスクの起動時間を監視するために、container.uptime
メトリクスを利用し、24時間以上稼働しているタスクを検知できる仕組みを構築しました。これにより、インフラのコスト増加やデータベースの競合などのリスクを未然に防ぎやすくなりました。
今回の調査で、ドキュメントだけに頼らず、実際のメトリクスを確認することの重要性を学びました。また、英語版ドキュメントを優先的に確認することで情報漏れを防ぐことができるということも再認識できました。
We're hiring!
atama plusは教育を一緒にテクノロジーで解決していけるエンジニアを探しています!
興味があればぜひご応募ください!
Discussion