서버가 갑자기 꺼졌다고? EC2 종료 이벤트 실시간 알림 구축
안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 서버가 종료되었을 때 EC2 종료 이벤트를 실시간으로 이메일 통지하는 구성을 만들어 봤습니다.
IAM 정책 및 역할 생성
IAM 정책과 역할은 별 다른 설정없이, Lambda의 로그를 기록하기 위한 CloudWatch 권한과 이메일 통지를 위한 SNS 권한을 할당합니다.
[arn:aws:sns:ap-northeast-2:xxxxxxxxxx]에는 SNS 토픽의 Arn을 입력합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sns:Publish"
],
"Resource": "arn:aws:sns:ap-northeast-2:xxxxxxxxxx"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
}
]
}
Lambda 함수 생성 및 코드 작성
Lambda 함수의 Lambda 함수의 런타임은 [Python 3.13]이며, 조금 전 생성한 IAM 역할을 연결합니다.
[arn:aws:sns:ap-northeast-2:xxxxxxxxxx]에는 SNS 토픽의 Arn을 입력합니다.
EventBrdige로 인해 Lambda가 트리거 되면, 해당 이벤트에서 EC2 인스턴스 ID, EC2 인스턴스를 종료시킨 사용자, 리전을 추출하여 SNS로 전송합니다.
import json
import boto3
sns = boto3.client('sns')
SNS_TOPIC_ARN = 'arn:aws:sns:ap-northeast-2:xxxxxxxxxx'
def lambda_handler(event, context):
print("Received event:", json.dumps(event))
try:
user = event['detail']['userIdentity']['arn']
instance_ids = [i['instanceId'] for i in event['detail']['responseElements']['instancesSet']['items']]
region = event['region']
except Exception as e:
print("Parsing error:", e)
return {'statusCode': 400, 'body': 'Error parsing event'}
message = (
f"[EC2 인스턴스 종료 알림]\n\n"
f"⛔ EC2 인스턴스가 종료되었습니다.\n"
f"- 종료된 인스턴스 ID: {', '.join(instance_ids)}\n"
f"- 작업자: {user}\n"
f"- 리전: {region}\n"
f"- 이벤트: TerminateInstances"
)
sns.publish(
TopicArn=SNS_TOPIC_ARN,
Subject="⛔ EC2 인스턴스 종료 감지",
Message=message
)
return {'statusCode': 200, 'body': 'Alert sent'}
EventBridge 규칙 생성
EventBridge에서는 [TerminateInstances]를 이용해 EC2 인스턴스가 종료되었을 때 이벤트가 발생하도록 합니다.
{
"source": ["aws.ec2"],
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventName": ["TerminateInstances"]
}
}
결과 확인
테스트를 위해 EC2 인스턴스를 생성하고, 종료시킵니다.
조금 기다려보면, 이메일이 도착합니다.
기본적으로 EC2 인스턴스를 생성하면 [종료 방지 기능 변경]을 통해 사전에 EC2 인스턴스가 삭제되는 것을 막을 수 있습니다. 하지만 악의를 가진 사용자가 이 기능을 해제하고 EC2 인스턴스를 삭제할 수도 있으니 보다 빠른 대응을 위해 EC2 인스턴스에 대한 알림을 적절하게 설정하는 것이 좋다고 생각하여 이번 블로그를 작성하게 되었습니다.
본 블로그 게시글을 읽고 궁금한 사항이 있으신 분들은 jaewookkim533@yahoo.com로 보내주시면 감사하겠습니다.
문의 사항은 클래스메소드 코리아로!
클래스메소드 코리아에서는 다양한 세미나 및 이벤트를 진행하고 있습니다.
진행중인 이벤트는 아래 페이지를 참고해주세요.
AWS에 대한 상담 및 클래스 메소드 멤버스에 관한 문의사항은 아래 메일로 연락주시면 감사드립니다!
Info@classmethod.kr