AWS + Terraform – ALBのエラーを CloudWatch メトリクスで検知して通知する
標準メトリクス
CloudWatch > メトリクス にいろんな標準メトリクスがある
ALBだけでも相当色々な数があるが「リージョン別のメトリクス」とか「ALB単位のメトリクス」とかに分かれているようだ
アラームの作成
CloudWatch > アラーム から新しいアラームを作成できる
ここで好きなメトリクスを選んでしきい値などを設定すれば良い
ALB (ELB) の500系エラーの説明
ALBの層で起こるエラーと、ターゲット内(アプリケーション層とか)で起こるエラーはメトリクスの種類が分かれているようだ
HTTPCode_ELB_5XX_Count
ロードバランサーから送信される HTTP 5XX サーバーエラーコードの数。この数には、ターゲットによって生成される応答コードは含まれません。
HTTPCode_Target_5XX_Count
ターゲットによって生成された HTTP 応答コードの数。これには、ロードバランサーによって生成される応答コードは含まれません。
通知の設定
メトリクスの作成・編集でSNSトピックとの連携ができるので、SNSトピックを設定してサブスクリプションも設定する
例えばLambdaスクリプトを使う場合は
CloudWatchメトリクス -> ALARM -> SNSトピック -> サブスクリプション -> Lambda
という経路になる (長い)
ログはどこに?
ALBのログはS3に保存されているようだ
CloudWatchでは見られない ( 2023/09/20 現在)
落とし穴
エラーを発生させてもメトリクスのページでどのエラーの回数も最大1までにしかならない
他のタブにしれっと「平均」とか「合計」の選択が紛れ込んでいた
ここを合計にすると(当たり前だが)合計値が見やすい
<img width="563" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/66b26c2f-6c98-4eb2-967f-28c09cca5b2b">
Terraform
標準メトリクスを指定してアラームを作れるようなので、公式説明を参考に metric_name
などを指定すれば良さそう
metric_name と namespace はそれぞれ存在する正しい指定にしないといけないようだ
あとALBの指定も必要
resource "aws_cloudwatch_metric_alarm" "foobar" {
alarm_name = "terraform-test-foobar5"
comparison_operator = "GreaterThanOrEqualToThreshold"
metric_name = "メトリクスの名前"
namespace = "AWS名前空間"
evaluation_periods = 2
period = 60
statistic = "Sum"
threshold = 10
alarm_description = "Alarm!"
insufficient_data_actions = []
dimensions = {
LoadBalancer = "<ALB_PATH>"
}
}
- periods : チェック期間の秒数、デフォルトは60秒=1分
- threshold : チェックのしきい値 (上のコード例であれば、期間内にエラーが10回以上起きた場合を検知したい場合は5にする)
- evaluation_periods : 何回の繰り返しを検知するか ( 2にした場合は periods/treadshold などで指定したエラーが2回繰り返された場合にALARM扱いにする )
LoadBalancerにはALBのARNでもなく一部のパスを渡す必要がありそうだ
たとえばARNが以下なら
arn:aws:elasticloadbalancing:<REGION>:<ACCOUNT>:loadbalancer/app/alb-name/1234567890
以下の部分
app/alb-name/1234567890
どうやって500系エラーを起こすか
ALBのリスナーのルールで、てきとうに500系のエラーを起こすルールを作っておけば確認しやすい
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。
公開日時
2023-09-20
Discussion