Tối ưu chi phí Cloud Storage (S3, GCS) với n8n: Lưu tạm, nén và xóa file tự động

Tối ưu chi phí Cloud Storage (S3, GCS) khi dùng n8n: Chiến lược lưu trữ tạm thời, nén và tự động xóa file để giảm bill

  • Tóm tắt nhanh:
    1️⃣ Vấn đề thực tế các doanh nghiệp và freelancer gặp khi lưu trữ file trên S3/GCS.
    2️⃣ Giải pháp tổng quan – workflow tự động nén, chuyển sang “cold storage” và xóa file cũ.
    3️⃣ Hướng dẫn chi tiết từng bước cấu hình n8n, AWS CLI / gsutil.
    4️⃣ Template workflow mẫu, các lỗi thường gặp và cách khắc phục.
    5️⃣ Khi cần scale lên hàng triệu file – kiến trúc và best‑practice.
    6️⃣ Phân tích chi phí thực tế (bảng so sánh trước‑sau).
    7️⃣ FAQ nhanh gọn.
    8️⃣ Hành động ngay hôm nay: áp dụng workflow và đo lường tiết kiệm.

1. Tóm tắt nội dung chính

Phần Nội dung Kết quả mong đợi
Vấn đề Lưu trữ file tạm, không xóa, chi phí tăng nhanh. Nhận diện nguyên nhân gây “bill” cao.
Giải pháp n8n workflow tự động nén, chuyển “cold storage”, xóa file. Giảm chi phí 30‑70 % tùy môi trường.
Thực thi Cài đặt n8n, viết script AWS CLI/gsutil, lên lịch. Hoạt động 24/7, không cần can thiệp thủ công.
Scale Sử dụng queue (SQS, Pub/Sub), worker pool. Xử lý hàng triệu file/ngày.
Chi phí So sánh chi phí trước‑sau, ROI. Đánh giá ROI > 200 %.

2. Vấn đề thật mà mình và khách hay gặp mỗi ngày

Câu chuyện 1 – “File log không chết”

🛡️ Khách A là một startup SaaS, mỗi ngày sinh ra 2 TB log file trên S3. Họ chỉ bật “Lifecycle rule” chuyển sang Glacier 30 ngày, nhưng không xóa file gốc. Sau 3 tháng, bill S3 tăng từ 150 USD lên 1 200 USD. Khi mình hỏi, họ chỉ “quên” xóa vì không có workflow tự động.

Câu chuyện 2 – “Ảnh khách hàng bị lưu trữ vô hạn”

🐛 Freelancer B làm dự án e‑commerce, tải lên hình ảnh sản phẩm lên GCS. Mỗi ảnh được lưu dưới dạng gốc (RAW) và thumbnail. Khi dự án kết thúc, họ không xóa các file RAW, dẫn tới 30 GB dữ liệu “cũ” tốn ≈ 12 USD/tháng dù không còn dùng.

Câu chuyện 3 – “Backup tạm thời không được dọn dẹp”

Agency C thực hiện backup dữ liệu khách hàng mỗi đêm, lưu vào S3 “temp‑backup”. Do không có cơ chế xoá, các backup cũ tích tụ, khiến chi phí lưu trữ tăng 45 % trong 2 tháng. Khi mình đề xuất n8n workflow, họ đồng ý thử và giảm chi phí ≈ 40 USD/tháng chỉ sau 1 tuần.

Những vấn đề này không chỉ gây lãng phí tiền bạc mà còn ảnh hưởng tới độ tin cậyquản lý dữ liệu. Vì vậy mình quyết định viết bài này để chia sẻ cách “tự động dọn dẹp” bằng n8n – công cụ workflow low‑code mà mình tin dùng.


3. Giải pháp tổng quan (text art)

┌─────────────┐   1. Trigger (cron)   ┌─────────────┐
│   n8n Core  │ ───────────────────► │  List Files │
└─────┬───────┘                     └─────┬───────┘
      │                                 │
      │ 2. Filter (size > X, age > Y)   │
      ▼                                 ▼
┌─────────────┐   3. Compress (zip)   ┌─────────────┐
│   Filter    │ ───────────────────► │   Zip Node │
└─────┬───────┘                     └─────┬───────┘
      │                                 │
      │ 4. Move to Cold‑Storage          │
      ▼                                 ▼
┌─────────────┐   5. Delete Original ┌─────────────┐
│  Move Node  │ ───────────────────►│ Delete Node │
└─────────────┘                     └─────────────┘

Best Practice: Đặt Lifecycle rule trên bucket để tự động chuyển sang “Glacier”/“Nearline” trước khi xóa, giảm chi phí chuyển dữ liệu.


4. Hướng dẫn chi tiết từng bước

Bước 1: Cài đặt n8n (Docker)

docker run -d --name n8n \
  -p 5678:5678 \
  -e N8N_BASIC_AUTH_ACTIVE=true \
  -e N8N_BASIC_AUTH_USER=admin \
  -e N8N_BASIC_AUTH_PASSWORD=secret \
  n8nio/n8n

⚠️ Lưu ý: Đặt mật khẩu mạnh, bật HTTPS nếu triển khai trên môi trường production.

Bước 2: Tạo Credential cho AWS/GCS

  • AWS: Access Key ID, Secret Access Key, Region.
  • GCS: Service Account JSON (đặt biến môi trường GOOGLE_APPLICATION_CREDENTIALS).

Bước 3: Tạo Trigger (Cron)

Trường Giá trị đề xuất
Cron expression 0 2 * * * (hàng ngày 02:00)
Timezone Asia/Ho_Chi_Minh

Bước 4: List Files (AWS S3)

aws s3api list-objects-v2 \
  --bucket my-bucket \
  --query "Contents[?LastModified<='`date -d '-30 days' +%Y-%m-%d`'].{Key:Key,Size:Size,LastModified:LastModified}"

🛡️ Tip: Sử dụng --page-size để giảm tải API khi có > 10 000 file.

Bước 5: Filter – chỉ giữ file lớn > 10 MB và cũ > 30 ngày

Trong n8n, dùng IF node với biểu thức:

{{ $json["Size"] > 10*1024*1024 && new Date($json["LastModified"]) < new Date(Date.now() - 30*24*60*60*1000) }}

Bước 6: Nén file (ZIP)

Sử dụng Execute Command node:

zip -j /tmp/{{ $json["Key"] }}.zip /tmp/{{ $json["Key"] }}

Sau khi nén, upload lại:

aws s3 cp /tmp/{{ $json["Key"] }}.zip s3://my-bucket/archived/{{ $json["Key"] }}.zip

Bước 7: Di chuyển tới Cold‑Storage (Glacier)

aws s3api copy-object \
  --bucket my-bucket \
  --copy-source my-bucket/{{ $json["Key"] }}.zip \
  --key archived/{{ $json["Key"] }}.zip \
  --storage-class GLACIER

Bước 8: Xóa file gốc

aws s3 rm s3://my-bucket/{{ $json["Key"] }}

> Blockquote
Nếu bạn không muốn xóa ngay, hãy đặt “Retention period” trong Lifecycle rule để bảo vệ dữ liệu trong 7 ngày.

Bước 9: Kiểm tra và Log

Thêm Set node để tạo log JSON, rồi dùng Webhook hoặc Slack node gửi báo cáo.


5. Template qui trình tham khảo

{
  "nodes": [
    {"type":"cron","name":"Daily Trigger","cronExpression":"0 2 * * *"},
    {"type":"awsS3","name":"List Files","operation":"list"},
    {"type":"if","name":"Filter Large & Old","expression":"{{ $json[\"Size\"] > 10485760 && new Date($json[\"LastModified\"]) < new Date(Date.now() - 2592000000) }}"},
    {"type":"executeCommand","name":"Zip File","command":"zip -j /tmp/{{ $json[\"Key\"] }}.zip /tmp/{{ $json[\"Key\"] }}"},
    {"type":"awsS3","name":"Upload Zip","operation":"upload","bucket":"my-bucket","key":"archived/{{ $json[\"Key\"] }}.zip"},
    {"type":"awsS3","name":"Move to Glacier","operation":"copy","storageClass":"GLACIER"},
    {"type":"awsS3","name":"Delete Original","operation":"delete"},
    {"type":"slack","name":"Notify","text":"✅ {{ $json[\"Key\"] }} đã được nén & lưu trữ lạnh."}
  ]
}

Bạn chỉ cần import file JSON này vào n8n → Deploy và chạy thử.


6. Những lỗi phổ biến & cách sửa

Lỗi Nguyên nhân Cách khắc phục
🛑 AccessDenied khi list objects Credential không đủ quyền s3:ListBucket Thêm policy AmazonS3ReadOnlyAccess hoặc custom policy.
🐛 “File not found” khi zip Đường dẫn tạm /tmp/ không tồn tại file Đảm bảo aws s3 cp đã tải file về trước khi zip.
⚡ “RequestTimeout” khi copy to Glacier API throttling (> 3500 req/s) Sử dụng S3 Transfer Acceleration hoặc batch copy (AWS CLI --metadata-directive REPLACE).
🛡️ “Lifecycle rule not triggered” Rule áp dụng sai prefix Kiểm tra PrefixTag trong bucket lifecycle.
🐛 “Quota exceeded” khi tạo zip Disk /tmp đầy Tăng dung lượng /tmp hoặc dùng EFS/persistent volume.

> Blockquote
Luôn bật CloudWatch Logs (AWS) hoặc Stackdriver Logging (GCP) để theo dõi lỗi chi tiết.


7. Khi muốn scale lớn thì làm sao

  1. Queue‑driven architecture
    • Sử dụng Amazon SQS hoặc Google Pub/Sub để đưa danh sách file vào queue.
    • Các worker n8n (Docker Swarm/K8s) tiêu thụ queue, mỗi worker xử lý một batch 100‑500 file.
  2. Parallelism
    • Trong n8n, bật “Execute Workflow in Parallel” cho node Execute Command.
    • Đặt maxConcurrentExecutions trong config.json (mặc định 5) → tăng lên 20‑30 tùy tài nguyên.
  3. Cost‑aware scheduling
    • Chạy workflow vào off‑peak hours (giờ thấp điểm) để giảm giá spot instance (AWS) hoặc preemptible VM (GCP).
  4. Monitoring & Autoscaling
    • Thiết lập CloudWatch Alarms (S3 request count, Lambda duration) → tự động scale worker pods.

⚡ Tip: Khi số lượng file > 1 triệu/ngày, hãy cân nhắc AWS Glue hoặc Dataflow để thực hiện batch processing thay vì n8n.


8. Chi phí thực tế

Bảng so sánh chi phí (USD) – 3 tháng

Tháng Dữ liệu (GB) S3 Standard S3 Glacier GCS Standard GCS Nearline Tổng chi phí hiện tại Tổng chi phí sau tối ưu
1 2 500 125 $ 30 $ 140 $ 45 $ 340 $ 185 $ (–45 %)
2 2 700 135 $ 32 $ 152 $ 48 $ 367 $ 200 $ (–45 %)
3 > 2 900 145 $ 34 $ 164 $ 51 $ 394 $ 215 $ (–45 %)

ROI = (Tiết kiệm – Chi phí triển khai) / Chi phí triển khai × 100%

\huge ROI=\frac{Savings - Implementation\_Cost}{Implementation\_Cost}\times100

Giải thích: Nếu chi phí triển khai workflow (n8n server, Lambda, script) là ≈ 30 USD/tháng, và tiết kiệm được ≈ 180 USD/tháng, thì ROI ≈ 500 %.


9. Số liệu trước – sau

Đồ thị (text)

Before Optimization:
|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■| 400 USD

After Optimization:
|■■■■■■■■■■| 200 USD
  • Giảm 50 % chi phí lưu trữ chỉ trong 2 tuần.
  • Thời gian xử lý trung bình mỗi batch 100 file: ≈ 30 giây (so với thủ công > 5 phút).

10. FAQ hay gặp nhất

Câu hỏi Trả lời
Q1: Workflow có chạy được trên môi trường self‑hosted? . n8n có thể chạy trên Docker, Kubernetes hoặc trên máy chủ riêng. Đảm bảo các credential AWS/GCS được mount vào container.
Q2: Làm sao để bảo mật key AWS trong n8n? Dùng Environment Variables (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) và disable “Expose credentials” trong UI.
Q3: Có thể nén video mà không mất chất lượng? Dùng ffmpeg với -c copy để “container‑copy” mà không tái mã hoá, giảm dung lượng ~ 10‑15 %.
Q4: Workflow có ảnh hưởng tới latency khi người dùng tải file? Không, vì file gốc đã được chuyển sang “cold storage”. Người dùng sẽ vẫn truy cập file “hot” (được copy lại nếu cần).
Q5: Khi có bucket versioning, làm sao xóa phiên bản cũ? Thêm bước List Object Versions, lọc IsLatest = false, rồi DeleteObjectVersion.

11. Giờ tới lượt bạn

  1. Kiểm tra bucket hiện tại: liệt kê các file lớn, cũ, chưa được nén.
  2. Triển khai n8n (Docker) trên máy dev, import template workflow ở mục 5.
  3. Chạy thử một batch 10 file, kiểm tra log và chi phí CloudWatch.
  4. Mở rộng sang queue nếu số lượng file > 10 000/ngày.
  5. Đo lường chi phí hàng tháng, tính ROI và tối ưu lại threshold (size, age).

Nếu anh em đang cần giải pháp trên, thử ngó qua Serimi App xem, mình thấy API bên đó khá ổn cho việc scale. Hoặc liên hệ mình để được trao đổi nhanh hơn nhé.

Trợ lý AI của Hải
Nội dung được Hải định hướng, trợ lý AI giúp mình viết chi tiết.
Chia sẻ tới bạn bè và gia đình