Lambda를 작성하기 전에 알림을 보내고자 하는 슬랙 채널에 Webhook을 생성해야 한다.
Webhook 생성방법은 아래의 블로그 글을 참고 했다.
https://velog.io/@king/slack-incoming-webhook
Lambda 생성
Lambda를 새로 생성한다.
여기서는 Python을 이용해서 코드를 작성할 예정이므로, Pyhon 버전을 3.9로 선택했다.
IAM Role은 아래 정책을 포함하도록 만들어준다.
다수의 클라우드워치를 트리거로 설정할 예정이므로 클라우드워치 전체 엑세스 권한을 주었다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:*"
],
"Resource": "arn:aws:logs:*:*:*"
}
]
}
Lambda 코드 작성
import json
import base64
import gzip
import requests
url = 'Webhook URL 입력'
def post_slack(str):
sendData = {
"text": str
}
sendText = json.dumps(sendData)
response = requests.post(url, sendText)
return response
def append_text(message, logGroup, logStream):
textList = []
textList.append(f'*Log Stream*: {logStream}\n')
textList.append(f'*Message*: {message}\n')
link = f"https://ap-northeast-2.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-2#logsV2:log-groups/log-group/{logGroup}/log-events/{logStream.replace('/','$252F')}$3FfilterPattern$3D$253FERROR+$253FException"
textList.append(link)
return ''.join(textList)
def lambda_handler(event, context):
compressedData = base64.b64decode(event['awslogs']['data'])
data = gzip.decompress(compressedData)
jsonData = json.loads(data)
logGroup = jsonData['logGroup']
logStream = jsonData['logStream']
for logEvent in jsonData['logEvents']:
message = json.loads(logEvent['message'])
post_slack(append_text(message,logGroup,logStream))
Cloudwatch의 'Message'를 가져와서 슬랙에 알림을 보내주도록 했다.
또한, Log Stream과 Link를 같이 보내서 정보전달과 함께 슬랙채널에서 쉽게 클라우드워치 콘솔로 이동하도록 했다.
Lambda Trigger로 Cloudwatch 지정
원하는 Cloudwatch의 로그그룹을 선택하고, 특정 패턴이 포함된 메세지만 알림이 가도록 필터 패턴을 지정한다.
여기서는 'ERROR'와 'Exception'이 포함된 로그들만 알림이 가도록 패턴을 지정했다.
결과 확인
이제 설정은 모두 완료 되었으므로, 위에서 설정한 패턴의 로그가 생성되면 슬랙으로 알림이 오는지 확인하면 된다.
완료!
'Amazon AWS > Lambda' 카테고리의 다른 글
도커 컨테이너 이미지로 Lambda 함수 배포 (0) | 2023.10.15 |
---|---|
FastAPI, Request Body를 Class 없이 그대로 사용하기 (0) | 2023.01.08 |
AWS Lambda에서 파이썬 모듈 추가하기 (0) | 2022.12.11 |