CloudWatch 오류 로그를 Slack에 알리기
![](https://s1.md5.ltd/image/af727203e00d411ac0eb0babb57a0e66.png)
알리고 싶은 로그 그룹에 대한 지표 필터 만들기
CloudWatch에서 알리고 싶은 EC2의 로그 그룹을 선택하고 "액션""메트릭 필터 만들기"를 클릭하십시오.
![](https://s1.md5.ltd/image/5874b936a6e6f2a0fb9573d5a3a7c88e.png)
필터 패턴은 ERROR 로그를 출력하고 싶기 때문에 ERROR로 합니다. 그런 다음 지표 필터를 만듭니다.
SNS 주제 만들기
![](https://s1.md5.ltd/image/2361feab2a1fcf0ff693453292a9b047.png)
임의의 이름으로 빨리 만들어 봅시다.
Lambda 처리
Lambda의 구성은 이런 느낌입니다.
![](https://s1.md5.ltd/image/6233c55d1eb04b84a0176f37f5839cb3.png)
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 함수에 정책을 연결합니다.
![](https://s1.md5.ltd/image/dbb3640c2b4d65baf9f56993099fae44.png)
그런 다음 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 주제로 보내도록 설정합니다.
![](https://s1.md5.ltd/image/4b7861054dfc521d5ffc53b154d0a733.png)
전송하는 SNS 주제는 방금 만든 것을 선택
![](https://s1.md5.ltd/image/a753d4da23f066240bc1b26b42c2d9c4.png)
Slack 설정
htps // w1618578007-hxz964946. scck. 코 m / 인 tl / 자 jp / 아 ps
를 열고 '마스트 앱'을 클릭하고 검색 창에서 'Incoming Webhook'을 검색하십시오.
![](https://s1.md5.ltd/image/2b3e130da21663c6fc3e94a35b0f8f6b.png)
그리고 Slack에 추가하고 통지하고 싶은 채널을 선택합니다. 그런 다음 생성된 Webhook URL을 복사합니다. 나중에 사용합니다.
마지막으로 확인합니다
![](https://s1.md5.ltd/image/88e66311b0e3ced95b0983c623431e45.jpeg)
의도적으로 로그를 토하게 하고, 이러한 통지가 오면 완료됩니다. 아이콘이나 앱명은 커스터마이즈하는 것도 가능합니다.
참고문헌
· htps : // 이 m / 야하 긴 / ms / 2248287c5285cd1 9201
· htps : // bg. 짱 r. 네 t / 아 ws 짱 t 보 t c ぉ 우도 t ch ぉ gs /
Reference
이 문제에 관하여(CloudWatch 오류 로그를 Slack에 알리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ymktmk_tt/items/54920620e1e99389f36c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)