#はじめに
「CloudWatch Logs を文字列検知してログ内容をメールを送信してみた」について、キャプチャがなくて戸惑ったり一部やり方を変えて行ったので、備忘録として残したい。
#手順
##SNSトピックの作成
SNS>トピック>トピックの作成を選択する。名前と表示名(オプション)を入力する。
トピックの作成を選択する。
SNS>サブスクリプション>サブスクリプションの作成を選択する。
下記の内容を選択・入力する。
プロトコル:Eメール
エンドポイント:自身のメールアドレス
選択できたら、サブスクリプションの作成を選択する。
しばらくすると下記のようなメールが送られてくるので、確認の上Confiem subscriptionを選択する。
##Lambda関数の作成
Lambda>関数>関数の作成を選択する。
下記内容を選択・入力する。
オプション:一から作成
関数名:任意の名前を入力
ランタイム:Python3.7
関数コードに以下のコードを貼り付ける。
import base64
import json
import zlib
import datetime
import os
import boto3
from botocore.exceptions import ClientError
print('Loading function')
def lambda_handler(event, context):
data = zlib.decompress(base64.b64decode(event['awslogs']['data']), 16+zlib.MAX_WBITS)
data_json = json.loads(data)
log_json = json.loads(json.dumps(data_json["logEvents"][0], ensure_ascii=False))
print(log_json)
try:
sns = boto3.client('sns')
#SNS Publish
publishResponse = sns.publish(
TopicArn = os.environ['SNS_TOPIC_ARN'],
Message = log_json['message'],
Subject = os.environ['ALARM_SUBJECT']
)
except Exception as e:
print(e)
環境変数に以下の内容を入力する。
SNS_TOPIC_ARN:前の手順で作成したメール通知用トピック ARN(ARNはSNS>トピック>該当のトピックで選択する。)
ALARM_SUBJECT:SNS で通知される際の件名
基本設定でタイムアウトは私の場合デフォルトで0分3秒になっているが、1分に変える。
保存を選択する。
アクセス権限タブを選択する。
実行ロールという項目のロール名を選択する。
アクセス権限タブ>ポリシーをアタッチしますを選択する。
AmazonSNSFullAccessにチェックをつけて、ポリシーのアタッチを選択する。
##サブスクリプションフィルタの作成
Cloudwatch>CloudWatch Logs>アクション>Lambda サブスクリプションフィルターを作成を選択する。
以下の内容を入力する。
Lambda 関数:前の手順で作成した関数
ログの形式:出力されるログに合わせた形式を選択
サブスクリプションフィルターのパターン:検出する文字列・パターンを入力
##テスト
CloudWatch Logsのダッシュボードの対象ロググループを選択し、ログストリームのタブから対象のログストリームを選択する。
アクション>Create log eventsを選択する。
テスト用に送信したいメッセージを入力し、作成を選択する。
参考
https://dev.classmethod.jp/articles/cloudwatch-logs-put-test-log/