AWS Billing & Cost Management
AWS Billing & Cost Management là bộ công cụ giúp bạn có visibility đầy đủ về chi phí, kiểm soát ngân sách, và tối ưu hóa chi tiêu trên AWS. Đây là một trong những kỹ năng quan trọng nhất đối với DevOps Engineer và Cloud Architect làm việc ở production.
1. Tổng quan
Vấn đề phổ biến
| Vấn đề | Nguyên nhân | Hệ quả |
|---|---|---|
| Chi phí tăng đột biến | EC2/RDS chạy idle, snapshot tích lũy, data transfer bất thường | Vượt budget, khó giải thích với dự án/khách hàng |
| Thiếu visibility | Không có tagging, không phân tách cost theo team/môi trường | Không biết tiền đi đâu |
| Multi-account phức tạp | Mỗi account quản lý billing riêng | Không có cái nhìn tổng thể, dễ bỏ sót chi phí |
Kiến trúc tổng quan
AWS Organizations (Management Account)
├── Consolidated Billing
│ ├── Dev Account
│ ├── Staging Account
│ └── Prod Account
└── Cost Management Tools
├── AWS Cost Explorer → Phân tích & forecast
├── AWS Budgets → Alert khi vượt ngưỡng
├── Cost Allocation Tags → Phân bổ chi phí theo business unit
2. AWS Cost Explorer
Cách hoạt động
Cost Explorer xử lý dữ liệu billing từ tất cả các dịch vụ AWS và cho phép bạn slice/dice chi phí theo nhiều dimension khác nhau. Dữ liệu có độ trễ 24 giờ — không phải real-time.
Cost Explorer cần được manually enable từ Billing Console. Sau khi bật, dữ liệu lịch sử được populate trong vòng 24 giờ. Một khi đã bật, không thể tắt.
Tính năng chính
Breakdown dimensions:
| Dimension | Dùng khi nào |
|---|---|
| Service | Biết service nào tốn nhiều nhất |
| Account (linked) | Phân tích chi phí cross-account |
| Region | Phát hiện workload chạy sai region |
| Tag | Phân bổ theo project/team/env |
| Usage type | Drill down vào data transfer, request count, storage |
| Instance type | So sánh chi phí giữa các EC2 family |
Granularity:
- Monthly: Overview, phát hiện trend dài hạn
- Daily: Detect spike nhanh, debug chi phí bất thường
- Hourly: Chỉ khả dụng nếu bật trong Settings, tốn thêm phí — chỉ dùng khi cần debug cụ thể
Forecast: Cost Explorer dùng machine learning để dự báo chi phí dựa trên pattern lịch sử. Độ chính xác tăng khi có nhiều data (ít nhất 3 tháng). Forecast hiển thị confidence interval (upper/lower bound).
Use case: Detect EC2 spike bất thường
Scenario: Sáng thứ Hai nhận email báo chi phí tuần tăng 40%.
Quy trình debug trong Cost Explorer:
1. Filter: Service = EC2
2. Group by: Usage Type
→ Phát hiện "BoxUsage:m5.4xlarge" tăng mạnh
3. Group by: Tag (Environment)
→ Spike xuất phát từ tag env=dev
4. Change granularity: Daily
→ Spike bắt đầu từ thứ Sáu 18:00
5. Group by: Instance Type (via AWS CLI)
# Drill down cost theo từng EC2 instance type qua CLI
# Lưu ý: SERVICE value phải khớp chính xác với Cost Explorer dimension value.
# Có thể kiểm tra trước bằng lệnh:
# aws ce get-dimension-values --dimension SERVICE --time-period Start=2026-04-14,End=2026-04-21
aws ce get-cost-and-usage \
--time-period Start=2026-04-14,End=2026-04-21 \
--granularity DAILY \
--filter '{"Dimensions": {"Key": "SERVICE", "Values": ["Amazon Elastic Compute Cloud - Compute"]}}' \
--group-by '[{"Type": "TAG", "Key": "Environment"}, {"Type": "DIMENSION", "Key": "INSTANCE_TYPE"}]' \
--metrics "UnblendedCost"
Kết quả: Dev team để quên một EC2 m5.4xlarge chạy qua cuối tuần. Fix: implement Instance Scheduler hoặc Lambda auto-stop ngoài giờ làm việc.
Best practices
- Bật Hourly granularity có chọn lọc: Chỉ bật khi đang debug. Hourly data tốn thêm ~$0.01/metric/day.
- Lưu Saved Filters: Nếu các môi trường được build trong cùng 1 aws account thì nên có filter riêng (VD: filter theo tag
env=dev). - Export định kỳ: Schedule export Cost Explorer data ra S3 để lưu vết.
- Dùng Rightsizing Recommendations: Cost Explorer có tab riêng cho EC2 rightsizing recommendations dựa trên CloudWatch utilization.
3. AWS Budgets
Các loại Budget
| Loại | Theo dõi | Dùng khi nào |
|---|---|---|
| Cost Budget | Tổng chi phí USD | Kiểm soát tổng chi tiêu |
| Usage Budget | Số lượng resource (EC2 hours, S3 GB) | Giới hạn consumption |
| RI Utilization | % sử dụng Reserved Instances | Đảm bảo RI không bị lãng phí |
| RI Coverage | % On-Demand được cover bởi RI | Biết cần mua thêm RI không |
| Savings Plans Utilization | % sử dụng Savings Plans commitment | Đảm bảo SP không waste |
| Savings Plans Coverage | % On-Demand được cover bởi SP | Tối ưu SP coverage |
Cấu hình Cost Budget từng bước
Bước 1 — Tạo budget qua Console:
Billing Console → Budgets → Create budget
→ Budget type: Cost budget
→ Budget name: prod-monthly-cost-2026
→ Period: Monthly
→ Budget amount: Fixed → $5,000
→ Budget scope: Filter by tag Environment=prod
Bước 2 — Cấu hình Alert:
Threshold 1: 80% of budgeted amount ($4,000)
→ Alert type: Actual
→ Notification: Email → devops@company.com, finance@company.com
Threshold 2: 100% of budgeted amount ($5,000)
→ Alert type: Actual
→ Notification: SNS Topic → arn:aws:sns:us-east-1:123456789012:budget-alerts
Khi nhận alert, ngày nhận alert quyết định mức độ ưu tiên xử lý:
| Threshold | Trước ngày 23 | Từ ngày 23 trở đi |
|---|---|---|
| Threshold 1 — 80% | 🔴 High — Chi phí tăng bất thường, cần investigate và action ngay | 🟢 Low — Budget đang cạn dần theo đúng trend, theo dõi bình thường |
| Threshold 2 — 100% | 🔴 High — Vượt budget, action ngay | 🔴 High — Vượt budget, action ngay |
Lý do: Nếu đã tiêu 80% ngân sách mà mới đến giữa tháng → tốc độ chi tiêu đang vượt kế hoạch, cần điều tra ngay. Nếu cuối tháng mới đạt 80% → bình thường, budget sắp hết đúng chu kỳ.
Threshold 2 luôn là High bất kể thời điểm — vượt 100% budget là vấn đề cần xử lý ngay lập tức.
AWS Budgets alert có thể delay 8-12 giờ do billing data lag. Không dùng Budgets để real-time alert — dùng CloudWatch Billing Metric nếu cần alert nhanh hơn.
SNS Integration để Slack/Mail
Budget Alert → SNS Topic → Lambda → Slack Webhook
→ Mail
4. Cost Allocation Tags
AWS-generated Tags vs User-defined Tags
| Loại | Ví dụ | Ai tạo | Có thể dùng cho billing? |
|---|---|---|---|
| AWS-generated | aws:createdBy, aws:cloudformation:stack-name | AWS tự động | Cần activate trong Billing Console |
| User-defined | Environment, Project, Owner | DevOps/Developer | Cần activate trong Billing Console |
Tạo tag trên resource không đủ. Bạn phải vào Billing Console → Cost Allocation Tags → Activate thì tag mới xuất hiện trong Cost Explorer và CUR. Activation delay ~24 giờ.
Chiến lược tagging cho Production
Mandatory tags (enforce bằng SCP/Config):
| Tag Key | Ví dụ | Mục đích | Trường hợp sử dụng |
|---|---|---|---|
Environment | dev, staging, prod | Phân tách cost theo môi trường | Các môi trường (dev/staging/prod) được build trong cùng 1 AWS account |
Project | checkout-service, data-platform | Phân bổ cost theo product | Nhiều project chạy trong cùng 1 AWS account, cần biết project nào tốn tiền |
Owner | team-backend, team-infra | Chủ sở hữu chịu trách nhiệm chi phí | Muốn phân tách chi phí theo từng team (dev, infra, data, ...) để chargeback nội bộ |
Activate tags qua AWS CLI
# List user-defined tags available for activation
aws ce list-cost-allocation-tags \
--status Inactive \
--type UserDefined
# Activate tags
aws ce update-cost-allocation-tags-status \
--cost-allocation-tags-status '[
{"TagKey": "Environment", "Status": "Active"},
{"TagKey": "Project", "Status": "Active"},
{"TagKey": "Owner", "Status": "Active"}
]'
Enforce Mandatory Tags bằng SCP
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnforceMandatoryTags",
"Effect": "Deny",
"Action": [
"ec2:RunInstances",
"rds:CreateDBInstance",
"elasticloadbalancing:CreateLoadBalancer"
],
"Resource": "*",
"Condition": {
"Null": {
"aws:RequestTag/Environment": "true",
"aws:RequestTag/Project": "true",
"aws:RequestTag/Owner": "true"
}
}
}
]
}
SCP ngăn resource mới không có tag, nhưng không fix resource cũ. Dùng AWS Config Rule required-tags để audit resource hiện có và Tag Editor để bulk-tag resource cũ.
Lỗi phổ biến
| Lỗi | Hệ quả | Fix |
|---|---|---|
| Quên activate tag trong Billing Console | Tag không xuất hiện trong Cost Explorer | Tạo runbook activation sau mỗi khi thêm tag key mới |
| Tag trên EC2 nhưng không tag EBS volume đính kèm | Cost phân bổ sai | Tag propagation: bật "Tag new volumes" trong EC2 settings |
| Lambda function không được tag | Serverless cost mất vào "untagged" bucket | Tag function và enforce bằng IAM policy lambda:CreateFunction |
5. Chiến lược Multi-Account
AWS Organizations & Consolidated Billing
Management Account (Payer)
└── Root
├── OU: dev
│ └── Account: dev
├── OU: stg
│ └── Account: stg
└── OU: prd
└── Account: prd
Lợi ích Consolidated Billing:
- Volume discounts: S3, Data Transfer pricing tính cộng dồn toàn org
- RI/SP sharing: RI mua ở management account tự động apply cho linked accounts
- Single invoice: Một hóa đơn duy nhất
- Cross-account visibility: Cost Explorer hiển thị breakdown theo account
Cost Anomaly Detection
Bật Anomaly Detection thay vì chỉ dựa vào Budgets để phát hiện bất thường sớm hơn:
# Tạo Anomaly Monitor cho toàn bộ services
aws ce create-anomaly-monitor \
--anomaly-monitor '{
"MonitorName": "AllServices",
"MonitorType": "DIMENSIONAL",
"MonitorDimension": "SERVICE"
}'
# Tạo Anomaly Subscription (alert khi impact > $100)
aws ce create-anomaly-subscription \
--anomaly-subscription '{
"SubscriptionName": "DevOps-Alert",
"MonitorArnList": ["arn:aws:ce::123456789012:anomalymonitor/abc123"],
"Subscribers": [
{
"Address": "devops@company.com",
"Type": "EMAIL"
}
],
"Threshold": 100,
"Frequency": "DAILY"
}'
- Budgets: Alert khi vượt ngưỡng tuyệt đối (VD: $5,000/tháng)
- Anomaly Detection: Alert khi có pattern bất thường so với baseline, dù chưa vượt budget — phát hiện sớm hơn
- Dùng cả hai kết hợp.
Review Cost Định Kỳ
Cadence được khuyến nghị:
| Frequency | Review nội dung |
|---|---|
| Daily | Anomaly detection alerts, overnight spike |
| Weekly | Service-level breakdown, forecast trend |
| Monthly | Account-level budget review, rightsizing |
| Quarterly | RI/SP coverage review, architecture optimization |