AWS Lambda と SNS を利用して CloudWatch Logs のエラーメッセージをメール通知する

1. はじめに

本記事では、AWSのCloudWatch Logsに収集されたログからエラーメッセージを検知し、その内容をメールで通知する方法について説明します。具体的には、AWS LambdaとAmazon SNSを組み合わせることで、エラーメッセージのメール通知を実現します。

2. 事前準備

  1. AWSアカウントを持っていること
  2. Amazon SNSのトピックを作成し、メールアドレスをサブスクライバとして追加しておくこと

3. Lambda関数の実装

まず、以下のコードを参考にして、Lambda関数を実装します。

import base64
import gzip
import json
import boto3

# Amazon SNS サービスのクライアントを初期化します
sns_client = boto3.client('sns')
# あらかじめ作成した SNS トピックのARNを指定します
SNS_TOPIC_ARN = "arn:aws:sns:region:account-id:topicname"

def lambda_handler(event, context):
    # CloudWatch Logsのイベントデータはbase64エンコードされているので、デコードします
    decoded_data = base64.b64decode(event['awslogs']['data'])
    
    # デコードしたデータはgzip圧縮されているので、解凍します
    uncompressed_data = gzip.decompress(decoded_data)
    
    # 解凍したデータはJSON形式なので、Pythonの辞書として読み込みます
    json_data = json.loads(uncompressed_data)
    
    # logEventsにはログのイベントのリストが含まれています。ここでは最初のメッセージを取得します
    message = json_data['logEvents'][0]['message']

    # エラーメッセージを検知した場合、SNSトピックにメッセージを発行します
    if "ERROR" in message:
        publish_to_sns(message)

    return message

def publish_to_sns(content):
    # SNSトピックにメッセージを発行するための関数です
    sns_client.publish(
        TopicArn=SNS_TOPIC_ARN,  # 送信先のSNSトピック
        Message=content,         # 送信するメッセージ内容
        Subject='エラー通知'      # メールの件名
    )

4. Lambdaの実行ロールの設定

このLambda関数を動作させるためには、適切なIAMロールの権限が必要です。Lambdaの実行ロールに、以下の権限を持つポリシーをアタッチしてください。

  • CloudWatch Logs の読み取り権限
  • SNS トピックへのメッセージ発行権限

5. まとめ

本記事では、AWS LambdaとAmazon SNSを利用して、CloudWatch Logsのエラーメッセージを検知し、メールで通知する方法を紹介しました。適切な設定とコードの実装により、システムのエラーをリアルタイムで把握することが可能となります。

コメント

タイトルとURLをコピーしました