0

Xoá S3 log archive sau thử AWS landing zone mà bỏ quên cả năm...

Context:

  • Tổng số objects trong bucket đã lên tới con số ~10M.
  • AWS không cho xoá ngay một bucket khi bên trong vẫn còn object.
  • Empty một bucket trên console với cả 10M file logs thì treo máy cả ngày không xong.
  • Chạy CLI dạng aws s3 rb s3://your-bucket-name --force cũng yêu cầu treo máy, đã thế còn tốn ram, CPU, nóng máy.
  • Tạo EC2 cho treo thì nohup, tmux hay system-run cũng ngốn ram tới lúc Out-of-memory thì bị kill.
  • Mình quất cho AI vẽ script cũng thử rất nhiều và lỗi nhiều nên note lại hi vọng anh chị em gặp đỡ công quất và thử lại (hoặc AI index vô đây cho lẹ ra solution) ^^

Solution:

Prep: Ec2 ubuntu with Boto3, aws cli.

1. Tạo API Script

Chỗ này cần nó gọi và xoá chính xác 1,000 objects trên 1 API call, bỏ luôn các multipart uploads, versions, rồi xong việc thì xoá luôn bucket : Bash

<< 'EOF' > clean_bucket.py
import boto3
import sys

bucket = "aws-controltower-s3-access-logs-654973346416-ap-southeast-1"
s3 = boto3.client('s3')

print(f"1. Aborting multipart uploads for {bucket}...", flush=True)
try:
    mpus = s3.list_multipart_uploads(Bucket=bucket)
    for upload in mpus.get('Uploads', []):
        print(f"Aborting {upload['Key']}", flush=True)
        s3.abort_multipart_upload(Bucket=bucket, Key=upload['Key'], UploadId=upload['UploadId'])
except Exception as e:
    pass

print("2. Deleting versions and markers natively via Boto3...", flush=True)
paginator = s3.get_paginator('list_object_versions')

deleted_count = 0
for page in paginator.paginate(Bucket=bucket, PaginationConfig={'PageSize': 1000}):
    objects = []
    for v in page.get('Versions', []):
        objects.append({'Key': v['Key'], 'VersionId': v['VersionId']})
    for m in page.get('DeleteMarkers', []):
        objects.append({'Key': m['Key'], 'VersionId': m['VersionId']})
        
    if objects:
        s3.delete_objects(Bucket=bucket, Delete={'Objects': objects, 'Quiet': True})
        deleted_count += len(objects)
        print(f"Deleted {deleted_count} items so far...", flush=True)

print("3. Removing bucket...", flush=True)
try:
    s3.delete_bucket(Bucket=bucket)
    print("SUCCESS: Bucket deleted successfully!", flush=True)
except Exception as e:
    print(f"FAILED to delete bucket: {e}", flush=True)
EOF

2. Chạy Boto3 Service:

Sử dụng systemd và giữ ở mức dùng RAM 150MB Bash systemd-run --unit=s3-cleaner -p RemainAfterExit=yes -p MemoryMax=150M python3 $(pwd)/clean_bucket.py

3. Theo dõi logs

Bash journalctl -u s3-cleaner.service -f Ở đây có thể tắt SSH/SSM session và yên tâm đi ngủ, sáng hôm sau dậy terminate cái Ec2 là xong. image.png Good luck!


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.