5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【お手軽エラー監視】AWS CloudWatchからSNSでメール通知する

Last updated at Posted at 2024-10-16

はじめに

アラート監視体制は、小規模なサービスや開発初期でも信頼性向上や障害発生時の迅速な対応のために無くてはならないものです。
ただ、人数やスケジュールが限られているとどうしても後回しにしがちな部分でもあります。
そこで、今回はAWSで普段使用するであろうCloudWatchに対して、特別な設定なくLambdaとSNSを組み合わせることで簡単にアラートのメール送信を実現できたので、その際使用した方法を載せます。

まずは簡単なとこらからでも、少しずつ少しずつ積み重ねることでプロダクトの信頼性は着実に向上していきます!

アラートを送信するLambda関数の作成

今回はPythonを使って関数を作成します。
AWSコンソールでLambda > 関数 > 関数の作成を選択し、関数を作ります。
ランタイムはPythonで任意のバージョンを選択すればOKです。

コード例

import base64
import json
import zlib
import os
import boto3

def lambda_handler(event, context):
  errorLog = zlib.decompress(base64.b64decode(event['awslogs']['data']), 16+zlib.MAX_WBITS)

  try:
    sns = boto3.client('sns')
    
    #SNS Publish
    publishResponse = sns.publish(
      TopicArn = os.environ['SNS_TOPIC_ARN'],
      Message=errorLog,
      Subject='hogehoge',
    )
    
  except Exception as e:
    print(e)

SNS_TOPIC_ARN には後ほど設定するSNSトピックの環境変数を設定します。

Lambda関数にアタッチされたIAMロールには、アラート関数自体のログ出力のためlogs:CreateLogGroup, logs:CreateLogStreamと、SNSからのメール送信のためsns:Publishあたりの許可が必要になります。

CloudWatchのサブスクリプションフィルターを設定する

先ほど作った関数を起動するキッカケを設定します。
関数のコンソールで、トリガーを追加を選択します。
CleanShot 2024-10-16 at 18.29.28@2x.png

ロググループにはアラートを監視したいロググループを選択します。もし複数ある場合は、ロググループごとにトリガーを追加します。
フィルターパターンで、正規表現を使って監視したい文字列を指定しましょう。(例:アプリケーションから吐かれるエラーにERRORという文字が必ず含まれているなら ?ERRORを設定)

ここまで完了すれば、CloudWatchにエラーログが吐かれたタイミングで、Lambda側でログを受取っていることを確認することができます。

SNSトピックを設定する

メール送信のため、SNS > トピック > トピックを作成からトピックを作成します。
タイプはスタンダードを選択し、その他設定はデフォルトでOKです。
作成したトピックで、サブスクリプションの作成を選択しプロトコルはEメールで送信先のメールアドレス全て追加します。

最後に、作成したLambda関数の詳細画面で、設定 > 環境変数 > 編集からSNS_TOPIC_ARNを追加し、値にはSNSトピックのarnを設定します。

これで、お手軽アラートのメール監視実装完了です!

補足
ただし、このやり方ですと、Lambdaで受け取れるログは、CloudWatchのサブスクリプションフィルタに該当した1ブロック分に限られるので、例えば同じリクエストの別ログも参照したい場合は、下記の例のようにCloudWatchに検索をかける必要があります。

logs_client = boto3.client('logs')
anotherLogs = logs_client.filter_log_events(
    logGroupName=log_group,
    logStreamNames=[log_stream],
    filterPattern=f'"{request_id}"',
    limit=5
  )
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?