created: 2020-07-05T11:48:54.000Z

serverless-plugin-aws-alertsでエラーを監視

Serverless Framework を使っている場合、エラーやタイムアウトなどの検知をするためのリソースはプラグインで簡単に簡単に生成できる

たとえば「エラー発生時には通知をうける」といった機能には以下のリソースを作る必要があるが、このプラグインはそれを(けっこう親切に)面倒みてくれる

  • CloudWatch Alarm
  • SNS Topic

CloudWatch Alarm

  • CloudWatchでLambdaのエラーの発生数がわかっている
  • CloudWatch Alarm はその発生数が域値以上かどうかを監視してくれるリソース
  • エラーの発生数が指定以上となった場合にSNSへメッセージを送れる

SNS Topic

  • エラーが発生したときにメッセージがキューに入る
  • キューがどんな処理をキックするかはその先の設定次第
    • だいたいAWSChatBotにSlack通知させることになる

設定例

もともと serverless-plugin-aws-alerts はデフォルトの設定がしっかりしていて、なんも設定を書かなくてもエラーの監視はしてくれるようになっている

ただ、デフォルトだと Duration や Invocation, Throttle など色々な状態を監視するAlarmができてしまうので、エラーだけ監視したいという場合は以下のような塩梅になる

custom:
  # serverless-plugin-aws-alerts用の項目
  alerts:
    # どのstageでアラート用のリソースを作成するか ["prod", "dev"] とかでもよい
    stages: [ "prod" ]
    # ここに記述した数だけSNSTopicが生成される
    topics:
      # 異常が発生した場合にメッセージが送られるトピック
      alarm:
        topic: ${self:service}-prod-alerts-alarm
      # 発生した異常が収束した場合にメッセージが送られるトピック
      ok:
        topic: ${self:service}-prod-alerts-ok
    alarms:
      # ここに書くのは監視する項目のリスト。他にもタイムアウトなどを監視できる
      # 60秒間でエラーが一回以上あれば〜 の60秒のような閾値のデフォルト値はこちら
      # https://github.com/ACloudGuru/serverless-plugin-aws-alerts#default-definitions
      - functionErrors
    # alarmに記述した監視項目のデフォルト設定を上書きするところ
    definitions:
      functionErrors:
        # cronが5分に1回実行される処理なら、チェック間隔も5分に1回でよい
        period: 300
        # 正常に戻った時にも通知が欲しい場合の設定
        topics:
          ok: ${self:service}-prod-alerts-ok

通知について

serverless-plugin-aws-alertsはSNSトピックをつくるところまでしかやってくれないので、そこから先にSlackへの通知は AWS ChatBot を使うと楽である (以前は通知するためのLambdaを実装する必要があった)

AWS ChatBot は2020年7月時点だとコンソールからGUIでしか設定できないので、ポチポチ設定すればよい。ただ、AWSChatBotを利用するためのRoleを作る必要はある (AWSChatBotのコンソール画面内でこの権限の生成が促されている)

参考

CloudWatch Alarm 周りの設定がよくわからなかったので以前に調べたメモ

SLO サービスレベル目標 ―SLI、SLO、エラーバジェット導入の実践ガイド
[ad] SLO サービスレベル目標 ―SLI、SLO、エラーバジェット導入の実践ガイド
Alex Hidalgo, 山口 能迪 (単行本(ソフトカバー))