Cài Đặt Cảnh Báo Chi Phí AWS Free Tier Bằng CloudWatch Billing Alarm
Bạn vừa tạo tài khoản AWS và đang dùng Free Tier — rồi cuối tháng nhận được hóa đơn bất ngờ vì một dịch vụ nhỏ chạy quá giới hạn miễn phí. Thiết lập CloudWatch Billing Alarm để nhận cảnh báo qua email khi chi phí ước tính vượt ngưỡng $5 là bước đầu tiên bắt buộc với bất kỳ tài khoản AWS nào.
TL;DR — Tóm Tắt Nhanh
| Bước | Hành động | Lưu ý quan trọng |
|---|---|---|
| 1 | Bật Billing Alerts trong tài khoản | Phải làm ở region us-east-1, chỉ cần làm một lần |
| 2 | Tạo SNS Topic và xác nhận email | Email xác nhận phải được click trước khi alarm hoạt động |
| 3 | Tạo CloudWatch Billing Alarm với ngưỡng $5 | Metric billing chỉ có ở us-east-1 |
| 4 | Kiểm tra trạng thái alarm | Trạng thái ban đầu là INSUFFICIENT_DATA — bình thường |
Cách CloudWatch Billing Alarm Hoạt Động
Trước khi bắt tay vào cấu hình, cần hiểu rõ một điểm kiến trúc quan trọng: metric EstimatedCharges trong CloudWatch là metric toàn cầu nhưng chỉ được publish tại region us-east-1 (N. Virginia). Dù tài khoản của bạn đang dùng ap-southeast-1 hay eu-west-1, billing alarm vẫn phải được tạo ở us-east-1. Đây là điểm mà nhiều người bỏ sót khi tạo alarm ở region khác rồi thắc mắc tại sao không có dữ liệu.
Luồng hoạt động như sau: AWS tổng hợp chi phí ước tính của toàn tài khoản, publish metric EstimatedCharges vào CloudWatch tại us-east-1 vài lần mỗi ngày. CloudWatch Alarm giám sát metric này — khi giá trị vượt ngưỡng bạn đặt, alarm chuyển sang trạng thái ALARM và kích hoạt SNS Topic. SNS Topic gửi email đến địa chỉ bạn đã đăng ký.
Tổng hợp chi phí"] -->|"Publish metric EstimatedCharges"| B["CloudWatch us-east-1"] B -->|"So sánh với ngưỡng $5"| C{"Vượt ngưỡng?"} C -->|"Không"| D["Trạng thái: OK"] C -->|"Có"| E["Trạng thái: ALARM"] E -->|"Kích hoạt"| F["SNS Topic"] F -->|"Gửi email"| G["Subscriber (Email của bạn)"]
- AWS Billing Service tổng hợp chi phí toàn tài khoản và publish metric
EstimatedChargesvào CloudWatch (us-east-1). - CloudWatch Alarm so sánh giá trị metric với ngưỡng đã cấu hình ($5).
- Khi ngưỡng bị vượt, alarm chuyển sang trạng thái
ALARMvà gửi thông báo đến SNS Topic. - SNS gửi email đến địa chỉ subscriber đã xác nhận.
Bước 1: Bật Billing Alerts Trong Tài Khoản
Đây là bước mà nhiều hướng dẫn bỏ qua, nhưng nếu không làm bước này thì CloudWatch sẽ không nhận được metric billing. Cài đặt này chỉ có thể thực hiện qua AWS Console bởi root user hoặc IAM user có quyền aws-portal:ModifyBilling. Không có AWS CLI command tương đương cho bước này.
Truy cập: AWS Console → Billing and Cost Management → Billing Preferences → tích chọn 'Receive Billing Alerts' → Save preferences.
Sau khi bật, AWS bắt đầu publish metric EstimatedCharges — nhưng có thể mất vài giờ để dữ liệu đầu tiên xuất hiện trong CloudWatch.
Bước 2: Tạo SNS Topic Để Nhận Email Cảnh Báo
SNS Topic là kênh trung gian giữa CloudWatch Alarm và email của bạn. Tạo topic tại us-east-1 vì alarm billing cũng sẽ ở đó.
# Tạo SNS Topic tại us-east-1
aws sns create-topic \
--name billing-alert-topic \
--region us-east-1
Lệnh trên trả về ARN của topic, ví dụ: arn:aws:sns:us-east-1:123456789012:billing-alert-topic. Lưu ARN này lại để dùng ở bước tiếp theo.
# Đăng ký email nhận cảnh báo (thay your-email@example.com bằng email thực)
aws sns subscribe \
--topic-arn arn:aws:sns:us-east-1:123456789012:billing-alert-topic \
--protocol email \
--notification-endpoint your-email@example.com \
--region us-east-1
Sau lệnh này, AWS gửi email xác nhận đến địa chỉ bạn đăng ký. Bạn phải click link 'Confirm subscription' trong email đó — nếu bỏ qua bước này, SNS sẽ không gửi được cảnh báo dù alarm đã kích hoạt. Đây là lỗi phổ biến nhất khi thiết lập billing alarm lần đầu.
# Kiểm tra trạng thái subscription
aws sns list-subscriptions-by-topic \
--topic-arn arn:aws:sns:us-east-1:123456789012:billing-alert-topic \
--region us-east-1
Trường SubscriptionArn sẽ hiển thị PendingConfirmation cho đến khi bạn xác nhận email. Sau khi xác nhận, nó sẽ hiển thị ARN đầy đủ.
Bước 3: Tạo CloudWatch Billing Alarm Với Ngưỡng $5
Metric EstimatedCharges thuộc namespace AWS/Billing, dimension Currency với giá trị USD. Alarm cần được tạo ở us-east-1 — đây là yêu cầu cứng, không phải khuyến nghị.
aws cloudwatch put-metric-alarm \
--alarm-name 'FreeTierBillingAlert-5USD' \
--alarm-description 'Canh bao khi chi phi uoc tinh vuot 5 USD' \
--metric-name EstimatedCharges \
--namespace AWS/Billing \
--statistic Maximum \
--dimensions Name=Currency,Value=USD \
--period 86400 \
--evaluation-periods 1 \
--threshold 5 \
--comparison-operator GreaterThanOrEqualToThreshold \
--alarm-actions arn:aws:sns:us-east-1:123456789012:billing-alert-topic \
--treat-missing-data notBreaching \
--region us-east-1
Một vài điểm cần giải thích về các tham số trên:
--statistic Maximum: MetricEstimatedChargeslà giá trị tích lũy từ đầu tháng, không phải delta. DùngMaximumđể lấy giá trị cao nhất trong period thay vìAveragecó thể bị làm mờ.--period 86400: 86400 giây = 1 ngày. AWS publish metric billing không theo thời gian thực mà theo chu kỳ vài giờ một lần, nên period 1 ngày là phù hợp.--treat-missing-data notBreaching: Khi chưa có dữ liệu (đầu tháng, tài khoản mới), alarm không chuyển sang ALARM state. Tránh false alert.--comparison-operator GreaterThanOrEqualToThreshold: Cảnh báo khi chi phí đạt đúng $5 hoặc vượt qua.
Bước 4: Xác Minh Alarm Đã Được Tạo Đúng
Sau khi tạo, trạng thái alarm ban đầu thường là INSUFFICIENT_DATA — đây là hành vi bình thường vì CloudWatch chưa có đủ điểm dữ liệu để đánh giá. Đừng nhầm với lỗi cấu hình.
# Kiểm tra trạng thái alarm
aws cloudwatch describe-alarms \
--alarm-names 'FreeTierBillingAlert-5USD' \
--region us-east-1
Kiểm tra các trường quan trọng trong output:
StateValue:INSUFFICIENT_DATAban đầu là bình thường. Sẽ chuyển sangOKkhi có dữ liệu và chi phí dưới $5.AlarmActions: Phải chứa ARN của SNS topic bạn đã tạo.Dimensions: Phải cóCurrency: USD.
# Xem metric billing có dữ liệu chưa
aws cloudwatch get-metric-statistics \
--namespace AWS/Billing \
--metric-name EstimatedCharges \
--dimensions Name=Currency,Value=USD \
--start-time $(date -u -d '3 days ago' +%Y-%m-%dT%H:%M:%SZ) \
--end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
--period 86400 \
--statistics Maximum \
--region us-east-1
Nếu output trả về mảng Datapoints rỗng và bạn đã bật Billing Alerts ở Bước 1, hãy đợi thêm vài giờ. Metric billing không được publish theo thời gian thực.
Bẫy Thường Gặp: Symptom → Chẩn Đoán Sai → Nguyên Nhân Thực
Triệu chứng: Alarm ở trạng thái INSUFFICIENT_DATA mãi không chuyển sang OK dù tài khoản đã hoạt động vài ngày.
Chẩn đoán sai đầu tiên: Alarm bị cấu hình sai, thử xóa và tạo lại với period ngắn hơn.
Nguyên nhân thực: Billing Alerts chưa được bật ở Billing Preferences. Khi tính năng này tắt, AWS không publish metric EstimatedCharges vào CloudWatch — alarm tồn tại nhưng không bao giờ nhận được dữ liệu. Không có error message nào xuất hiện, alarm chỉ im lặng ở INSUFFICIENT_DATA.
Cách xác nhận: Chạy lệnh get-metric-statistics ở trên. Nếu Datapoints rỗng sau 24 giờ, quay lại kiểm tra Billing Preferences trong Console.
Billing Alarm giống như đồng hồ báo thức — nó chỉ hoạt động nếu bạn cắm điện (bật Billing Alerts). Tạo alarm mà không bật tính năng này giống như đặt giờ trên đồng hồ chưa có pin.
IAM Permissions Cần Thiết
Nếu bạn đang dùng IAM user thay vì root account, cần có các quyền sau để thực hiện các bước trên:
🔽 Xem IAM Policy tối thiểu
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SNSBillingAlertSetup",
"Effect": "Allow",
"Action": [
"sns:CreateTopic",
"sns:Subscribe",
"sns:ListSubscriptionsByTopic"
],
"Resource": "arn:aws:sns:us-east-1:123456789012:billing-alert-topic"
},
{
"Sid": "CloudWatchBillingAlarm",
"Effect": "Allow",
"Action": [
"cloudwatch:PutMetricAlarm",
"cloudwatch:DescribeAlarms",
"cloudwatch:GetMetricStatistics"
],
"Resource": "*"
}
]
}
Lưu ý: cloudwatch:PutMetricAlarm và cloudwatch:DescribeAlarms yêu cầu "Resource": "*" vì CloudWatch không hỗ trợ resource-level permission cho các action này theo Service Authorization Reference. Việc bật Billing Alerts trong Billing Preferences yêu cầu quyền aws-portal:ModifyBilling — quyền này chỉ có thể cấp qua root account hoặc policy có quyền billing.
Cài Đặt CloudWatch Billing Alarm — Wrap-Up & Bước Tiếp Theo
Sau khi hoàn thành, bạn có một hệ thống giám sát chi phí cơ bản: metric billing được publish tự động bởi AWS, CloudWatch Alarm kiểm tra ngưỡng mỗi ngày, và SNS gửi email khi vượt $5. Đây là lớp bảo vệ tối thiểu cho bất kỳ tài khoản AWS nào.
Để bảo vệ tốt hơn, cân nhắc các bước tiếp theo:
- Tạo thêm alarm với ngưỡng cao hơn (ví dụ $10, $20) để có cảnh báo nhiều lớp.
- Bật AWS Budgets để giám sát chi phí theo từng dịch vụ cụ thể, không chỉ tổng tài khoản.
- Xem xét AWS Cost Anomaly Detection để phát hiện chi phí bất thường tự động.
- Tham khảo tài liệu chính thức: Monitor Estimated Charges with CloudWatch.
Glossary — Thuật Ngữ Chính
| Thuật ngữ | Giải thích |
|---|---|
| EstimatedCharges | CloudWatch metric trong namespace AWS/Billing, thể hiện chi phí ước tính tích lũy từ đầu tháng của toàn tài khoản. |
| SNS Topic | Kênh pub/sub của Amazon Simple Notification Service. CloudWatch Alarm publish thông báo vào topic, SNS phân phối đến các subscriber (email, Lambda, v.v.). |
| INSUFFICIENT_DATA | Trạng thái alarm khi CloudWatch chưa có đủ dữ liệu metric để đánh giá. Khác với ALARM (ngưỡng bị vượt) và OK (dưới ngưỡng). |
| Billing Alerts | Tính năng cần bật trong Billing Preferences để AWS bắt đầu publish metric EstimatedCharges vào CloudWatch. |
| Free Tier | Chương trình của AWS cung cấp một lượng tài nguyên miễn phí trong 12 tháng đầu (và một số dịch vụ miễn phí vĩnh viễn) cho tài khoản mới. |
Nhận xét
Đăng nhận xét