編集後のLambdaのコード¶
下記記事のLambdaのコードにnotifyToSlack関数とその呼び出しを追加しただけのもの。
CloudWatch Logs を文字列検知してログ内容をメールを送信してみた サブスクリプションフィルター版
"requests"以外は標準で使えるライブラリのため、依存性を追加しなくても普通にAWS上で使えます。
外部ライブラリはLamdbdaに同梱させてデプロイするか、LambdaLayerを使う必要があります。
SAMでビルド&デプロイする場合はrequirements.txtに書いておくことでビルド時に同梱してくれます。
import base64
import json
import zlib
import datetime
import os
import boto3
import requests
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)
# 追加分呼び出し
notifyToSlack(log_json['message'])
# 追加分関数
def notifyToSlack(message):
URL = os.environ['WEBHOOK_URL']
data = {
"text": message
}
headers = {'content-type': 'application/json'}
reqRes = requests.post(URL, data=json.dumps(data), headers=headers)
print('API reqRes:', reqRes)