2020/10/05

[EKS+CloudWatch]CloudWatchを使ってPythonエラーを検知

ekscloud-watchawspython

概要

アプリケーションのエラー検知ですが、通常であればSentryを使うのですが、
簡易なアプリの場合はログだけで検知したいケースがあります。

今回は

「CloudWatchでエラーログを監視して、エラーログを検出したらアラートする」

という方針で対応したので、その作業ログです。

前提

  • ApplicationログはCloudWatchにすでに自動で収集されるようにしてあります

こちらの記事にあるように
EKSでデプロイしたアプリのログをCloudWatchに送信できるように設定してあります。

手順

メトリックスフィルターの作成

  • 以下の名前のロググループを選択します

/aws/containerinsights/your-eks-cluster-name/application

  • ログフィルターを定義します

フィルターパターン

{ $.log = "Traceback*" }

Pythonのstacktraceを検知できるようなフィルタにします

EKSのログは以下のような感じで収集されます。

{
    "log": "This is the log output from app.",
    "stream": "stderr",
    "docker": {
        "container_id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    },
    "kubernetes": {
        "container_name": "kube-proxy",
        "namespace_name": "kube-system",
        "pod_name": "kube-proxy-7n8cc",
        "container_image": "your-docker-image-id:tag",
        "container_image_id": "docker-pullable://your-docker-image-id:tag@sha256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
        "pod_id": "XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX",
        "host": "ip-XX-XX-XX-XX.your-region.compute.internal",
        "labels": {
          "app": "your-app-name"
        },
        "master_url": "https://172.20.0.1:443/api",
        "namespace_id": "XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX"
    }
}

jsonフィールドのlogプロパティに実際のログの内容が格納されており、pythonだとstacktraceは Tracebackから始まるため、それをフィルタできるようにしています。

メトリクス値

エラーが発生したことをあとで検知できるように、メトリクス値を 1 にしておきます。 (この数値が1以上だったら異常のようなイメージです。)

まとめると以下のような感じです

Key Value
フィルターパターン { $.log = "Traceback*" }
メトリクス値 1
フィルター名 適当でOK(わかりやすい名前)
メトリクス名 適当でOK(わかりやすい名前)
メトリクス名前空間 適当でOK(わかりやすい名前・プロジェクト名+環境名とか)

アラームの作成

先ほど作成したメトリックスフィルターを選択して、アラームの作成を実施します。

Key Value
統計 合計
期間 5分(1分とか30秒とか短くても問題ないです)
しきい値の種類 静的
アラーム条件 より大きい
しきい値 0
アラーム状態トリガー アラーム状態
SNSトピックの選択 既存のSNSトピックを選択 or 新しいトピックを作成 *
Auto Scaling アクション 設定不要
EC2 アクション 設定不要

* SNSを作成するときに通知したいメールアドレスを入力します。作成後にメールアドレスの認証が必要なので注意が必要です。

こちらで設定は完了です。

動作確認

最後にTestのため、Pythonのエラーを発生させる簡単なscriptをk8sのjobで実行してエラー検知メールが送信されていることを確認しました。

参考

以上です。