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 --forcecũ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,tmuxhaysystem-runcũng ngốn ram tới lúcOut-of-memorythì 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.
Good luck!
All Rights Reserved