【AWS】LambdaでCloudWatchのログをSNS経由でメール転送するサンプル
以下のLambdaをCloudWatchLogsのサブスクリプションに設定する。
(アクション > Lamdaサービスへのストリーミングの開始 から設定可能)
■参考:【AWS】「特定の条件に合致するログが出たらLambdaを実行する」を設定をする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# -*- coding: utf-8 -*- from base64 import b64decode import gzip from StringIO import StringIO import json import time import boto3 # SNSのトピック情報 region = 'ap-northeast-1' SNSTopicName = 'トピックの名前' AccountNum = 'アカウントNo' # これがSNS > トピックのARNの項の値になればいい SNSTopicArn = 'arn:aws:sns:' + region + ':' + AccountNum + ':' + SNSTopicName def lambda_handler(events, context): log_events = events['awslogs']['data'] decoded_events = b64decode(log_events) buf = StringIO(decoded_events) unzipped_events = gzip.GzipFile(fileobj=buf).read() events_in_json = json.loads(unzipped_events) events_list = events_in_json['logEvents'] sns_client = boto3.client('sns',region_name=region) logGroup = events_in_json['logGroup'] msg_header = "From log group "+ logGroup + ", the following events occurred:-\n" msg_body = "\n" for event in events_list: localUTCTime = event['timestamp'] #extract timestamp in milliseconds s, ms = divmod(int(localUTCTime), 1000) #convert time ticks into local time formatted string new_time='%s.%03d' % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(s)), ms) #Construct message body with multiple logs in each line msg_body = msg_body + new_time + " \t " + event['message'] + " \n" subject = 'メールの件名' message = msg_header + msg_body response = sns_client.publish( TopicArn= SNSTopicArn, Message= message, Subject= subject) return |