はじめに
アラート監視体制は、小規模なサービスや開発初期でも信頼性向上や障害発生時の迅速な対応のために無くてはならないものです。
ただ、人数やスケジュールが限られているとどうしても後回しにしがちな部分でもあります。
そこで、今回は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のサブスクリプションフィルターを設定する
先ほど作った関数を起動するキッカケを設定します。
関数のコンソールで、トリガーを追加
を選択します。
ロググループにはアラートを監視したいロググループを選択します。もし複数ある場合は、ロググループごとにトリガーを追加します。
フィルターパターンで、正規表現を使って監視したい文字列を指定しましょう。(例:アプリケーションから吐かれるエラーに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
)