プロジェクト

全般

プロフィール

編集後の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)