CloudWatch 오류 로그를 Slack에 알리기

일일이 Laravel의 로그를 보는 것이 귀찮다고 생각해 CloudWatch Logs에 전송했습니다. 그러나, Slack에게 통지시키는 것이 보다 편리하다고 생각했으므로 이번은 아래와 같은 구성으로 갑니다.



알리고 싶은 로그 그룹에 대한 지표 필터 만들기



CloudWatch에서 알리고 싶은 EC2의 로그 그룹을 선택하고 "액션""메트릭 필터 만들기"를 클릭하십시오.



필터 패턴은 ERROR 로그를 출력하고 싶기 때문에 ERROR로 합니다. 그런 다음 지표 필터를 만듭니다.

SNS 주제 만들기





임의의 이름으로 빨리 만들어 봅시다.

Lambda 처리



Lambda의 구성은 이런 느낌입니다.



SNS에 작성한 주제를 지정합니다.

lambda_function.py

import json
import urllib.request
import logging
from collections import OrderedDict
import os
import datetime
import calendar
import boto3

logger = logging.getLogger()
logger.setLevel(logging.INFO)

#抽出するログデータの最大件数
OUTPUT_LIMIT=5
#何分前までを抽出対象期間とするか
TIME_FROM_MIN=5

def lambda_handler(event, context):

    logger.info("Event: " + str(event))
    message = json.loads(event['Records'][0]['Sns']['Message'])

    logs = boto3.client('logs')

    # MetricNameとNamespaceをキーにメトリクスフィルタの情報を取得する。
    metricfilters = logs.describe_metric_filters(
        metricName = message['Trigger']['MetricName'] ,
        metricNamespace = message['Trigger']['Namespace']
    )

    logger.info("Metricfilters: " + str(metricfilters))
    #ログストリームの抽出対象時刻をUNIXタイムに変換(取得期間は TIME_FROM_MIN 分前以降)
    #終了時刻はアラーム発生時刻の1分後
    timeto = datetime.datetime.strptime(message['StateChangeTime'][:19] ,'%Y-%m-%dT%H:%M:%S') + datetime.timedelta(minutes=1)
    u_to = calendar.timegm(timeto.utctimetuple()) * 1000
    #開始時刻は終了時刻のTIME_FROM_MIN分前
    timefrom = timeto - datetime.timedelta(minutes=TIME_FROM_MIN)
    u_from = calendar.timegm(timefrom.utctimetuple()) * 1000

    # ログストリームからログデータを取得
    response = logs.filter_log_events(
        logGroupName = metricfilters['metricFilters'][0]['logGroupName'] ,
        filterPattern = metricfilters['metricFilters'][0]['filterPattern'],
        startTime = u_from,
        endTime = u_to,
        limit = OUTPUT_LIMIT
    )

    # メッセージを整形しつつslackに通知
    for event in response['events']:
        postText = '''
        {logStreamName}
        {message}
        '''.format( logStreamName=str(event['logStreamName']),
                    message=str(event['message'])).strip()

        logger.info("Response: " + str(response))

        send_data = {
            "text": postText,
        }

        send_text = json.dumps(send_data)

        request = urllib.request.Request(
            "https://hooks.slack.com/services/xxxxxxxxx/xxxxxxxxx/xxxxxxx", 
            data=send_text.encode('utf-8'), 
            method="POST"
        )

        with urllib.request.urlopen(request) as response:

            response_body = response.read().decode('utf-8')




IAM 역할 설정



IAM 역할에서 방금 만든 Lambda 함수에 정책을 연결합니다.



그런 다음 AWSLambdaBasicExecutionRole을 클릭하여 정책을 편집합니다.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "------------------------------------------"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeMetricFilters"
            ],
            "Resource": [
                "-------------------------------------------"
            ]
        }
    ]
}

CloudWatch Alarm을 설정합니다.



CloudWatch Alarm에서 알람을 생성합니다. 설정은 다음과 같습니다. 임계값이 1 이상을 초과하면 SNS 주제로 보내도록 설정합니다.



전송하는 SNS 주제는 방금 만든 것을 선택



Slack 설정



htps // w1618578007-hxz964946. scck. 코 m / 인 tl / 자 jp / 아 ps
를 열고 '마스트 앱'을 클릭하고 검색 창에서 'Incoming Webhook'을 검색하십시오.



  그리고 Slack에 추가하고 통지하고 싶은 채널을 선택합니다. 그런 다음 생성된 Webhook URL을 복사합니다. 나중에 사용합니다.

 마지막으로 확인합니다





의도적으로 로그를 토하게 하고, 이러한 통지가 오면 완료됩니다. 아이콘이나 앱명은 커스터마이즈하는 것도 가능합니다.

참고문헌



· htps : // 이 m / 야하 긴 / ms / 2248287c5285cd1 9201
· htps : // bg. 짱 r. 네 t / 아 ws 짱 t 보 t c ぉ 우도 t ch ぉ gs /

좋은 웹페이지 즐겨찾기