AWS Lambda를 활용해서 자동으로 EBS 스냅샷을 정리해 봤습니다.

AWS Lambda를 활용해서 자동으로 EBS 스냅샷을 정리해 봤습니다.

AWS Lambda를 활용해서 자동으로 EBS 스냅샷을 정리해 봤습니다.
Clock Icon2025.06.09

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 AWS Lambda를 활용해서 자동으로 EBS 스냅샷을 정리해 봤습니다.

IAM 정책 & 역할 생성

Lambda 함수에 사용할 IAM 역할을 생성해야 합니다. 해당 역할에는 Lambda가 EBS 스냅샷을 읽어올 수 있는 권한과 삭제할 수 있는 권한이 필요합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeSnapshots",
                "ec2:DeleteSnapshot"
            ],
            "Resource": "*"
        }
    ]
}

Lambda 함수 생성

Lmabda 함수에는 조금 전 생성한 IAM 역할을 연결해 주고 다음 코드를 작성합니다. Lambda 함수의 런타임은 [Python 3.13]로 생성했습니다. [retention_minutes]를 통해 삭제 기준이 되는 시간을 지정하는데, 빠른 테스트를 위해 10분이 경과한 스냅샷을 삭제하도록 지정합니다.

import boto3
from datetime import datetime, timezone, timedelta

ec2 = boto3.client('ec2')
retention_minutes = 10  # 삭제 기준을 분 단위로

def lambda_handler(event, context):
    now = datetime.now(timezone.utc)
    snapshots = ec2.describe_snapshots(OwnerIds=['self'])['Snapshots']

    for snapshot in snapshots:
        snapshot_id = snapshot['SnapshotId']
        start_time = snapshot['StartTime']  # datetime 객체

        age_minutes = (now - start_time).total_seconds() / 60

        if age_minutes >= retention_minutes:
            print(f"Deleting snapshot: {snapshot_id}, Age: {int(age_minutes)} minutes")
            ec2.delete_snapshot(SnapshotId=snapshot_id)

EventBridge Scheduler 설정

Lambda 함수 코드를 작성했다면, EventBridge Scheduler를 통해 주기적으로 Lambda 함수 코드가 실행되게 만들어 스냅샷을 자동으로 삭제하도록 만듭시다. 특별한 설정은 필요없고, 이번에도 빠른 테스트를 위해 15분 마다 이벤트가 발생하도록 합시다.

jw-blglambdashap1

실행 대상은 조금 전 생성한 Lambda 함수입니다.

jw-blglambdashap2

결과 확인

지정한 시간이 지나면 EventBridge Scheduler에 의해 Lambda가 트리거 되어 스냅샷을 삭제할 것입니다. CloudTrail에 들어가 이벤트 내역을 확인해 보면, [DeleteSnapshot] 이벤트가 발생한 것을 확인할 수 있습니다.

jw-blglambdashap3

이벤트 레코드를 확인해 보면, Lambda가 트리거 되어 특정 스냅샷을 삭제했다는 것을 확인할 수 있습니다.

jw-blglambdashap4

삭제 시간을 변경하고 싶다

테스트를 위해 이벤트는 15분 간격으로 실행되게 했고, 생성하고서 10분이 지난 스냅샷을 삭제되게 했습니다. 좀 더 현실적으로 7일이 지난 스냅샷을 삭제하도록 코드를 수정해 봅시다.

import boto3
from datetime import datetime, timedelta

ec2 = boto3.client('ec2')
retention_days = 7  # N일 이상된 스냅샷 삭제

def lambda_handler(event, context):
    today = datetime.utcnow()
    snapshots = ec2.describe_snapshots(OwnerIds=['self'])['Snapshots']

    deleted = []

    for snapshot in snapshots:
        start_time = snapshot['StartTime'].replace(tzinfo=None)
        age = (today - start_time).days

        if age > retention_days:
            snapshot_id = snapshot['SnapshotId']
            try:
                ec2.delete_snapshot(SnapshotId=snapshot_id)
                deleted.append(snapshot_id)
            except Exception as e:
                print(f"Error deleting snapshot {snapshot_id}: {e}")

    return {
        'statusCode': 200,
        'body': f"Deleted snapshots: {deleted}"
    }

EventBridge Scheduler는 15분 간격으로 실행되는 게 아니라 하루에 한 번 혹은 일주일에 한 번 실행되게 만들어주면 일주일이 지난 스냅샷은 자동으로 삭제될 것입니다. 이런식으로 잊어버리고 삭제하지 않은 스냅샷을 정리해 볼 수 있으며, AWS 비용을 줄이는데 도움이 될 것입니다.

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

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.