2020/10/05
[EKS+CloudWatch]CloudWatchを使ってPythonエラーを検知
概要
アプリケーションのエラー検知ですが、通常であれば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で実行してエラー検知メールが送信されていることを確認しました。
参考
- https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html
- https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html
以上です。
関連する記事
[Python]ハイフンなし電話番号からハイフン付きに復元
Pythonでハイフンなしの日本の電話番号をハイフン付きのものに変換する
EKSのロードバランサーでIPアドレスのアクセス制限を設定する
EKSで構築しているネットワークロードバランサータイプのServiceにIP Whitelistを設定しました。
EKSのバージョンをアップグレードする
開発に利用しているEKSのバージョンをアップグレードしました
[Python]BeautifulSoup4でhtmlの解析
BeautifulSoup4というPythonのライブラリを使って、特定のURLのコンテンツを取得し、タイトルや説明文を取得できるようにしました。