Lambda + EventBridge로 RDS 수동 백업 해제를 감지하고 통지하는 구성을 만들어 봤습니다.

Lambda + EventBridge로 RDS 수동 백업 해제를 감지하고 통지하는 구성을 만들어 봤습니다.

Lambda + EventBridge로 RDS 수동 백업 해제를 감지하고 통지하는 구성을 만들어 봤습니다.
Clock Icon2025.07.07

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 Lambda + EventBridge로 RDS 수동 백업 해제를 감지하고 통지하는 구성을 만들어 봤습니다.

IAM 정책 & 역할 준비

먼저 Lambda에 연결할 IAM 정책과 역할을 준비합니다.

이메일로 전송하기 위한 SNS 권한과 로그를 보존할 CloudWatchLogs 권한을 추가합니다.

[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 함수는 [Python 3.13]을 사용하고 조금 전 생성한 IAM 역할을 연결합니다.

이벤트가 발생하면 EventBridge가 이를 감시하고 Lambda가 실행됩니다. Lambda에서는 발생한 이벤트 정보를 받아 사용자의 이메일로 전송합니다.

import boto3
from datetime import datetime

sns = boto3.client('sns')
SNS_TOPIC_ARN = 'arn:aws:sns:ap-northeast-2:xxxxxxxxxx'

def lambda_handler(event, context):
    detail = event.get('detail', {})
    req_params = detail.get('requestParameters', {})
    user_identity = detail.get('userIdentity', {})

    db_instance_id = req_params.get('DBInstanceIdentifier')
    backup_retention = req_params.get('backupRetentionPeriod')
    user_arn = user_identity.get('arn')
    event_time = detail.get('eventTime', datetime.utcnow().isoformat())
    event_name = detail.get('eventName')

    message_lines = ["🔒 [보안 알림] RDS 백업 설정이 변경되었습니다.\n"]

    if db_instance_id:
        message_lines.append(f"📌 DB 인스턴스 ID: {db_instance_id}")
    if event_name:
        message_lines.append(f"📌 이벤트 유형: {event_name}")
    if backup_retention is not None:  # 0도 의미 있으므로 None 체크
        message_lines.append(f"📌 백업 보존 기간: {backup_retention}일")
    if event_time:
        message_lines.append(f"📌 변경 시각: {event_time}")
    if user_arn:
        message_lines.append(f"📌 변경 사용자: {user_arn}")

    message_lines.append("\n⚠️ 백업 보존 기간이 0일로 설정되면 자동 백업이 비활성화되어 데이터 복구가 어려워질 수 있습니다.")
    message_lines.append("빠른 확인과 조치를 권장합니다.\n")
    message_lines.append("▶ 자세한 내용은 CloudTrail 콘솔에서 확인하세요:")
    message_lines.append("https://console.aws.amazon.com/cloudtrail/home#/events")

    message = "\n".join(message_lines)

    sns.publish(
        TopicArn=SNS_TOPIC_ARN,
        Subject="[보안 알림] RDS 백업 설정 변경 감지",
        Message=message
    )

EventBridge 규칙 생성

EventBridge 규칙은 CloudTrail에서 생성된 RDS 이벤트 중 [ModifyDBInstance]를 감지합니다. RDS의 자동 백업은 on/off 기능이 아니라 백업 기간이 0인지 혹은 그 이상인지로 백업의 유무를 결정짓기 때문에 [backupRetentionPeriod]가 [0] 일 때 이벤트를 감지하고 Lambda를 실행합니다.

{
  "source": ["aws.rds"],
  "detail-type": ["AWS API Call via CloudTrail"],
  "detail": {
    "eventName": ["ModifyDBInstance"],
    "requestParameters": {
      "backupRetentionPeriod": [0]
    }
  }
}

결과 확인

RDS의 백업 보존 기간을 0으로 수정합니다.

jw-rdsbackte-1

RDS 수정이 완료되면 이메일이 도착하는 것을 확인할 수 있습니다.

jw-rdsbackte-2

이번 블로그에서는 간단한 정보만 이메일로 전송했지만, 실제로는 발생한 이벤트를 기반으로 다양한 내용을 담아 자유롭게 이메일 텍스트를 꾸밀 수 있습니다. 여러분도 이를 참고하여 상황에 맞는 알림 메시지를 만들어 보시기 바랍니다.

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

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

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

https://classmethod.kr/board/library

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

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.