이 글에서는 이전 포스팅에서 설명했던 EC2 상태 변경 알람을 Slack으로 받아보는 방법에 대해 다룬다. EC2 상태 변경 알람은 이벤트 패턴이 규정되어 있어서 따로 SNS 구독이나 CloudWatch 경보를 생성할 필요가 없다. 나는 개인용으로 사용할 거라 따로 Slack 앱을 생성하지 않고 Incoming Webhook을 사용할 예정이다.
이 과정을 수행하고 나면 EC2 상태가 변경됐을 때 다음과 같은 알람을 받게된다.
작동 방식을 간단히 그림으로 표현하면 다음과 같다.
# Slack Webhook으로 CloudWatch Event를 전송하는 함수
from datetime import datetime, timedelta, timezone
import os
import urllib3
import json
# KST 시간대 정의 (UTC +9)
KST = timezone(timedelta(hours=9))
# Slack에 메시지를 전송하는 함수
def send_to_slack(webhook_url, msg):
http = urllib3.PoolManager()
encoded_msg = json.dumps(msg).encode('utf-8')
resp = http.request('POST', webhook_url, body=encoded_msg)
return resp
# Lambda 함수 핸들러
def lambda_handler(event, context):
# 환경변수'SLACK_WEBHOOK_URL'에서 Slack Webhook URL 추출
url = os.environ['SLACK_WEBHOOK_URL']
username = '[CloudWatch Alarm]'
pretext = f'🔔 [Event] {event["detail-type"]}'
account = event['account']
# 이벤트 시간을 KST로 변환하고, 문자열로 변환
time = datetime.fromisoformat(event['time'].replace('Z', '+00:00')).astimezone(KST)
formatted_time = time.strftime('%Y-%m-%d %H:%M:%S KST') # 'KST' added
region = event['region']
detail = event['detail']
# 메시지 텍스트 작성
senText = f'Account : {account}\nTime : {formatted_time}\nRegion : {region}\nDetail : {detail}' # Changed {time} to {formatted_time}
msg = {
"username": username,
"pretext": pretext,
"text": senText,
"icon_emoji": ""
}
# Slack에 메시지 전송
resp = send_to_slack(url, msg)
# 응답 상태 및 본문 출력
print({
"status_code": resp.status,
"response": resp.data.decode('utf-8')
})
return {
'statusCode': resp.status,
'body': resp.data.decode('utf-8')
}
코드에 직접 Webhook을 입력하지 않도록하기 위해 환경변수를 사용하도록 구성했다.
SLACK_WEBHOOK_URL
로 입력한다.EventBridge
를 선택하고 다음과 같이 설정한다.이벤트 패턴
EC2 인스턴스 상태 변경 알림
SNS 구독 설정 단계를 추가하면 State change 외에 다양한 CloudWatch 경보를 받아볼 수 있다. Lambda 함수를 변형해서 Slack으로 도착하는 메시지 내용과 형태를 변경할 수 있고, Slack에서 제공하는 API를 사용하여 대화형으로도 구성할 수 있다.
꼭 전파해야하는 이슈가 발생했을 때 공통 채널에 바로 게시할 수 있도록 설정해두면 의사소통 비용이 많이 줄어들 것으로 보인다. 다음에는 깃헙관련 내용으로 정리해봐야지.
키페어 없이 AWS CLI를 사용하여 EC2 인스턴스에 SSH로 연결하기 (0) | 2023.06.21 |
---|---|
System Manager로 특정 시간에 EC2 인스턴스 시작/중지 자동화하기 (0) | 2023.06.03 |
AWS User Notifications로 AWS EC2 상태 변경 알람 받기 (0) | 2023.05.25 |
특정 IP로만 AWS Console을 사용할 수 있게 설정 (0) | 2023.05.23 |
AWS Network Load Balancer에 SSL을 적용한 후 IP 통신 문제 (0) | 2023.04.19 |
댓글 영역