Bài trước mình chém gió là dựng blog với chi phí cỡ 90k/tháng, 3k/ngày, bằng ly trà đá. Hôm nay mở billing ra xem thì... mình đã nói phét. Nhưng là nói phét theo chiều đắt hơn thực tế. Hiếm lắm mới có lần nói phét mà người nghe được lợi, nên các bạn cứ trân trọng.
Bí bài quá, thôi viết tiếp phần 2: tiền thật hết bao nhiêu, TiDB free có đủ xài không, và quan trọng nhất là free thì phải trả bằng gì.
1. Hóa đơn tuần đầu tiên
Blog lên sóng ngày 24/9. Đây là bảng kê từ 24/9 đến 30/9 trên GCP Billing:
| Dịch vụ | Tiền |
|---|---|
| Artifact Registry | 11.213đ |
| Cloud Run | 6.945đ (đã trừ 98đ free tier, cảm ơn Google vì sự hào phóng) |
| Cloud Build | 6.275đ |
| Secret Manager | 1.590đ |
| Cloud Storage | 0đ |
| Tổng 7 ngày | ~26.000đ |
26 nghìn cho 7 ngày, nghe thì ra ~3.7k/ngày, khớp với lời phét hôm trước. Nhưng khoan, nhìn biểu đồ mới thấy sự thật:
Chi phí GCP theo từng ngày
- Ngày 24/9: gần 10k. Đây là ngày khai sinh: build đi build lại, push image liên tục, deploy như điên vì sửa một cái CSS mà mất 15 lần. Cloud Build ăn hết 6k ngay trong ngày này. Tiền ngu, không tính.
- 25–26/9: Artifact Registry vẫn còn ăn khá, do đống image rác từ hôm trước vẫn nằm đó chiếm storage.
- 27–30/9: đi vào ổn định, chỉ còn tầm 1k/ngày, phần lớn là Cloud Run (tiền giữ ấm cho uptime check) + một chút Secret Manager.
Túm lại: chạy ổn định thì dưới 1k/ngày, ~30–35k/tháng. Trà đá vỉa hè giờ 5k một ly, tức là cả tháng nuôi blog chưa bằng một tuần ngồi trà đá chém gió. Mà ngồi trà đá còn phải nghe ông bên cạnh giảng về chứng khoán, blog thì không.
Mẹo nhỏ: Artifact Registry chỉ free 0.5 GB storage. Mỗi lần deploy là một image mới đè lên, không dọn thì nó cứ thế mà đẻ. Bật cleanup policy chỉ giữ vài version gần nhất là xong, khỏi nuôi rác.
2. TiDB Cloud free có đủ không?
TiDB Cloud (bản Starter, tên cũ là Serverless) cho free mỗi cluster mỗi tháng:
- 50 triệu RU (Request Unit, đơn vị đo công sức DB phải còng lưng ra làm)
- 5 GiB row-based storage
- 5 GiB columnar storage
- Được tạo tối đa 5 cluster free
RU: tiền giữ cho DB khỏi ngủ
Cơ chế của TiDB Starter giống Cloud Run: không ai gọi thì sau khoảng chục phút nó đi ngủ, có request thì mới lồm cồm bò dậy (cold start). Mà blog của mình có uptime check gọi mỗi phút một lần, request đó đi qua app rồi chạm DB, nên DB không bao giờ được ngủ. Server thức, DB thức, chỉ có độc giả là ngủ.
Thực tế đo được: khoảng 1 triệu RU/ngày, gần như toàn bộ là tiền giữ connection + uptime check. Hôm nay (1/10) mới nửa ngày đã thấy 750.000 RU, khớp.
Làm phép tính lớp 3:
1.000.000 RU/ngày × 31 ngày ≈ 31.000.000 RU/tháng
Free: 50.000.000 RU
Còn dư: ~19.000.000 RU cho traffic thật
Tức là mới dùng hết ~62% quota cho việc... đứng chờ. 19 triệu RU còn lại thừa sức cho lượng độc giả lìu tìu của mình (bao gồm bố mình, mình, và con bot Google).
Có một điểm phải biết: nếu vượt quota, TiDB sẽ chặn luôn connection mới cho đến hết tháng (connection cũ thì bị bóp băng thông). Nghĩa là nếu một ngày đẹp trời bài viết lên top Voz, blog sẽ chết đúng lúc đông người xem nhất. Muốn an toàn thì đặt spending limit nho nhỏ, vượt free thì trả thêm ít tiền chứ không sập.
Storage: viết 700 năm chưa đầy
Dashboard đang ghi 0 MiB. Không phải lỗi, mà là blog quá nhẹ đến mức làm tròn về 0.
Một bài viết text tầm 20–30 KB. 5 GiB chia ra là khoảng 200.000 bài. Mỗi ngày viết một bài thì hơn 500 năm mới đầy. Đến lúc đó chắc mình đã thành AI rồi, tự viết tự đọc.
À, nói thêm cho công bằng: response của TiDB rất nhanh, gần như không thấy độ trễ, cảm giác y hịt xài Cloud SQL của GCP. Lúc đầu mình còn lo đặt DB một nơi, app một nơi thì sẽ lag, nhưng không. Ngon.
Kết luận phần này: đủ, dư dả, thoải mái.
3. Ngon bổ rẻ thật không? Cái giá của chữ "free"
Trên đời không có bữa trưa nào miễn phí, chỉ có bữa trưa mà người khác trả hoặc mình trả bằng thời gian. Trên trời rơi xuống chỉ có nước mưa và cứt chim thôi, còn lại cái gì "free" cũng có giá của nó. Đây là những thứ mình phải đánh đổi.
3.1. Xé lẻ = tốn công quản lý
Nếu dùng Cloud SQL của GCP, mọi thứ gom về một mối: một bill, một IAM, một chỗ xem log, backup có sẵn, kết nối Cloud Run vào Cloud SQL cũng có sẵn đường riêng. Bấm bấm vài cái là chạy. Nhưng Cloud SQL rẻ nhất cũng ngót nghét vài trăm nghìn một tháng, gấp chục lần cả cái blog.
Còn kiểu của mình: app ở GCP, DB ở TiDB, mỗi thằng một dashboard, một tài khoản, một kiểu billing. Mỗi lần có vấn đề là mở 3 tab, đăng nhập 2 lần, nhớ 4 cái mật khẩu. Ăn free thì phải chịu chạy lòng vòng.
3.2. Bảo mật: mở cửa cho cả thế giới
Đây là chỗ hơi đau.
Cloud Run không có IP ra cố định. Mỗi lần container mới dựng lên là ra internet bằng một IP khác. Nên bên TiDB không thể whitelist IP được, phải mở endpoint cho mọi IP.
Vậy muốn Cloud Run có IP cố định thì sao? Có cách, theo đúng tài liệu của Google:
- Tạo VPC và cho Cloud Run đi ra qua VPC (Direct VPC egress)
- Dựng Cloud Router + Cloud NAT
- Thuê một static IP gắn vào NAT
Nghe thì đơn giản, nhìn bill thì không:
- Riêng static IP đã $0.005/giờ ≈ $3.6/tháng ≈ 90k+
- Cloud NAT còn tính thêm theo giờ và $0.045/GB dữ liệu đi qua
Tức là chỉ để có một cái IP cố định, tốn gấp 3 lần cả cái blog. Mua cái khóa cửa đắt hơn cả cái nhà. Thôi xin.
Với blog cá nhân thì mình chấp nhận:
- Kết nối tới TiDB bắt buộc đi qua TLS, không phải plain text.
- Host name thì dài ngoằng ngẫu nhiên, username có prefix ngẫu nhiên, password thì mình để random dài như sớ táo quân. Brute force cái này chắc đợi tới khi storage đầy (500 năm, xem ở trên).
- Mà kể cả bị hack thì trong DB có gì? Mấy bài blog đã public sẵn rồi. Hacker vào đọc được bài miễn phí, coi như thêm một độc giả.
Chỉ phiền khi làm dự án nhiều người: có ông nghỉ việc mang theo cái password trong đầu (và trong file .env trên máy) thì phải rotate password, cập nhật lại Secret Manager, deploy lại. Không chết, nhưng mệt.
3.3. Backup: tự lo thân
Ban đầu mình tưởng bản free không có backup. Đọc lại tài liệu thì TiDB Starter free có backup tự động hằng ngày, nhưng:
- Chỉ giữ 1 ngày. Hôm qua lỡ tay
DELETEkhông cóWHERE, hôm nay mới phát hiện là... chúc mừng. - Không hỗ trợ backup thủ công, không có point-in-time restore.
- Muốn giữ tới 30 ngày thì phải lên bản trả phí.
Nên vẫn phải tự lo. May là GCP có đủ đồ chơi:
- Cloud Run Job: một container chạy
mysqldump, nén lại, đẩy lên GCS rồi tắt. Chạy vài chục giây, tiền gần như bằng 0. - Cloud Scheduler: hẹn giờ mỗi đêm gọi job dậy (mỗi billing account được free 3 job).
- Cloud Storage + lifecycle rule: file nào quá 30 ngày thì tự xóa, khỏi lo bucket phình to.
Cái lifecycle rule đơn giản lắm:
{
"rule": [
{
"action": { "type": "Delete" },
"condition": { "age": 30 }
}
]
}
gcloud storage buckets update gs://ten-bucket-backup --lifecycle-file=lifecycle.json
Code thêm có xíu mà được một hệ thống backup tự động mỗi đêm, giữ 30 ngày, nhìn cũng ra dáng doanh nghiệp lắm. Bằng chứng là dòng Cloud Storage trong bill vẫn 0đ.
Túm cái váy lại
| Xé lẻ ăn free (như mình) | Cà thẻ, gom hết về GCP | |
|---|---|---|
| Tiền | ~30–35k/tháng | vài trăm nghìn/tháng trở lên |
| Công sức | Mày mò đủ đường | Bấm vài cái là chạy |
| Bảo mật | Mở cho mọi IP, dựa vào TLS + password mạnh | Private network, IAM gọn gàng |
| Backup | Tự code job | Có sẵn, tick là xong |
| Quản lý | 3 tab, 2 tài khoản | 1 console |
| Vui | Rất vui | Hơi chán |
Với một blog cá nhân, việc tự mày mò dựng hết bằng đồ free vui thật sự: học được Cloud Run, Job, Scheduler, NAT, TiDB, lifecycle... toàn kiến thức đem đi làm được. Tốn ít tiền, đổi lại tốn thời gian, mà thời gian thì đằng nào cũng đem đi lướt TikTok.
Còn nếu bạn muốn tiết kiệm thời gian, muốn mọi thứ được support tận chân răng, ngủ ngon không lo nghĩ, thì cứ việc cà thẻ thần chưởng mà chơi. Tiền nào của nấy, không ai cười bạn đâu.
Mình thì vẫn chọn trà đá.