서버가 갑자기 꺼졌다고? EC2 종료 이벤트 실시간 알림 구축

서버가 갑자기 꺼졌다고? EC2 종료 이벤트 실시간 알림 구축

서버가 종료되었을 때 EC2 종료 이벤트를 실시간으로 이메일 통지하는 구성을 만들어 봤습니다.
Clock Icon2025.06.19

안녕하세요 클래스메소드 김재욱(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 인스턴스를 생성하고, 종료시킵니다.

jw-ec2deleblg-1

조금 기다려보면, 이메일이 도착합니다.

jw-ec2deleblg-2

기본적으로 EC2 인스턴스를 생성하면 [종료 방지 기능 변경]을 통해 사전에 EC2 인스턴스가 삭제되는 것을 막을 수 있습니다. 하지만 악의를 가진 사용자가 이 기능을 해제하고 EC2 인스턴스를 삭제할 수도 있으니 보다 빠른 대응을 위해 EC2 인스턴스에 대한 알림을 적절하게 설정하는 것이 좋다고 생각하여 이번 블로그를 작성하게 되었습니다.

jw-ec2deleblg-3

본 블로그 게시글을 읽고 궁금한 사항이 있으신 분들은 jaewookkim533@yahoo.com로 보내주시면 감사하겠습니다.

문의 사항은 클래스메소드 코리아로!

클래스메소드 코리아에서는 다양한 세미나 및 이벤트를 진행하고 있습니다.
진행중인 이벤트는 아래 페이지를 참고해주세요.

https://classmethod.kr/board/library

AWS에 대한 상담 및 클래스 메소드 멤버스에 관한 문의사항은 아래 메일로 연락주시면 감사드립니다!
Info@classmethod.kr

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.