你是否曾经在月底收到 AWS 账单时,对着那串惊人的数字感到不知所措?或者在试图向管理层解释为什么云计算成本比上个月激增了 20% 时,却苦于缺乏数据支持?在这个云原生时代,随着基础设施规模的指数级增长,"成本"(Cost)已经不再仅仅是财务部门关心的数字,而是架构师和开发者必须直面的技术挑战。
在本文中,我们将深入探讨 AWS Cost Explorer 这一核心工具。它不仅是一个账单查看器,更是我们进行云财务管理的强大武器。我们将一起学习如何利用它来可视化数据、通过代码/API 自动化分析成本,以及如何发现那些隐藏在日常开支中的浪费。
目录
什么是 AWS Cost Explorer?
简单来说,AWS Cost Explorer 是一个允许我们可视化、了解和管理我们在 AWS 上随时间变化的成本和使用情况的工具。它提供了一个用户友好的界面,让我们能够通过交互式图表来查看过去的数据(最长 13 个月)并预测未来的支出。
但在我们开始之前,先通过一个简单的思维模型来理解它:AWS Cost Explorer 是账单数据的“查询层”。AWS 每天都在后台收集关于资源使用的原始数据(如 EC2 运行了多久、S3 存了多少数据),而 Cost Explorer 则将这些枯燥的数字转化为我们可以理解、分析和操作的图表。
核心价值主张
- 直观的可视化:不再是满屏的 CSV 数据,而是清晰的折线图和柱状图。
- 深度的下钻能力:我们可以从“总成本”层层下钻,直到找出某个具体的 EC2 实例或 Lambda 函数是罪魁祸首。
- 预测性分析:基于历史数据,利用机器学习模型预测未来 12 个月的支出。
- 优化建议:直接告诉我们哪里买 Reserved Instance (RI) 或 Savings Plan 最划算。
Cost Explorer 与 AWS Budgets:别再混淆它们了
很多开发者容易混淆 Cost Explorer 和 AWS Budgets。让我们用一个通俗的类比来区分它们:
- Cost Explorer 是“汽车的仪表盘”:它告诉你当前的油耗、引擎转速以及过去 100 公里的平均油耗。它的核心是“分析与发现”。你会问它:“为什么上个月油费这么贵?”或者“我是在市区还是高速上费油?”
- AWS Budgets 是“汽车的报警系统”:它不会告诉你原因,但当油量低于 10% 或者你超速时,它会发出刺耳的警报。它的核心是“监控与告警”。你会问它:“如果我油费超过 100 美元,请发邮件通知我。”
AWS Cost Explorer
:—
分析与洞察:“我的钱到底花哪儿了?”
历史回顾(过去 13 个月)+ 未来预测(未来 12 个月)
提供下钻分析、趋势图和优化建议
极细(可按小时、标签、使用类型细分)
深入工作原理:数据是如何流动的?
理解 Cost Explorer 的工作原理,有助于我们更有效地使用它。它并不是魔法,其背后的数据流逻辑如下:
- 数据收集:AWS 计费系统会在后台每小时抓取一次您的资源使用情况(如 EC2 实例的运行时间、EBS 的存储量)。
- 数据聚合:这些原始数据会被整合进您的账单详情文件(Billing Detail Reports, CUR)。Cost Explorer 直接读取 CUR 的预处理视图。
- 元数据匹配:这是最关键的一步。系统会将使用记录与资源标签、关联账户、购买计划(如 RI)进行匹配。
- 交互式查询:当我们在控制台设置过滤器时,实际上是在编写一个后台查询,从数亿行数据中快速聚合出结果。
掌握“过滤”与“分组”:成本分析的核心技能
Cost Explorer 的真正威力在于它的多维剖析能力。如果你只是看默认的总览图表,你只能看到皮毛。要像专家一样分析,你需要掌握 Grouping(分组) 和 Filtering(过滤)。
1. 分组:识别成本驱动因素
分组允许我们将成本像切蛋糕一样切开。
- 按服务分组:这是最宏观的视角。我们可以清楚地看到 EC2、RDS、S3 和 Lambda 哪个占了大头。
场景*:你发现本月支出激增,按服务分组后,发现是“AWS Data Transfer”费用暴涨,说明可能是出站流量过大。
- 按使用类型分组:这是最细粒度的视图。它展示的是具体的计费项。
场景*:在 EC2 服务下,按使用类型分组,你可以看到 INLINECODEf52602ae(按需实例)和 INLINECODEf81826b3(预留实例)的区别,或者 EBS:SnapshotUsage(快照体积)的费用。
- 按标签分组:这是现代云成本管理的黄金标准。
场景*:你可以按 INLINECODEa36d38fb 标签分组,直接对比“项目 Alpha”和“项目 Beta”的成本。如果按 INLINECODE7a1c5b5d 标签分组,你可以直观看到“生产环境”比“开发环境”贵了多少倍。
2. 过滤:精准定位问题
过滤允许我们“降噪”,只关注我们关心的数据。
- 幽灵成本排查:你可能会遇到这样的情况:明明删掉了某个资源,账单还在扣钱。
实战技巧*:尝试 “按区域分组”,并 “按服务过滤”。你可能会惊讶地发现,在您从未使用的 ap-southeast-1(新加坡)区域,有一个测试用的 EC2 实例或者空闲的 DynamoDB 表还在跑,这就是所谓的“幽灵资源”。
- 特定账户分析:如果你使用 AWS Organizations,可以过滤特定成员账户的 ID,查看哪个子公司的账单失控了。
AWS 节省计划:从“分析”到“行动”
只分析而不行动是毫无意义的。在了解了成本构成后,Cost Explorer 会根据你的历史使用模式,提供购买 节省计划 或 预留实例 的建议。
- 省钱逻辑:AWS 提供折扣的前提是你承诺消费。对于稳定的工作负载,购买 1 年或 3 年的承诺可以节省高达 72% 的费用。
- 如何操作:在 Cost Explorer 的左侧菜单,你会找到“Savings Purchases”或“Recommendations”。不要盲目购买,利用工具预测的数据:如果系统显示你过去 3 个月每天都运行着 10 个
m5.large实例,那么购买覆盖这 10 个实例的 Savings Plan 几乎是稳赚不赔的。
代码实战:通过 API 自动化成本分析
作为技术专家,我们不应该仅仅依赖 Web 控制台。AWS 提供了强大的 API/CLI,让我们可以将成本分析集成到 DevOps 流程中。想象一下,如果你能在每天早上自动通过 Slack 获取昨天的成本报告,那该多酷?
前置条件
要运行以下代码,你需要安装 AWS CLI 并配置好凭证(aws configure),或者配置好 IAM Role。
示例 1:获取当月服务成本分布(Python/Boto3)
让我们编写一个 Python 脚本,按服务查询本月的累计成本。这是构建自定义仪表盘的基础。
import boto3
import datetime
from dateutil.relativedelta import relativedelta
import pandas as pd # 需要安装 pandas: pip install pandas
# 初始化 Cost Explorer 客户端
client = boto3.client(‘ce‘)
def get_monthly_cost_by_service():
# 设置时间范围:从本月第一天到今天
end_date = datetime.date.today()
start_date = end_date.replace(day=1)
print(f"正在查询时间范围: {start_date} 至 {end_date}")
response = client.get_cost_and_usage(
TimePeriod={
‘Start‘: start_date.isoformat(),
‘End‘: end_date.isoformat()
},
Granularity=‘MONTHLY‘, # 粒度可以是 DAILY 或 MONTHLY
Metrics=[‘AmortizedCost‘], # 使用摊销成本,可以反映 RI/SP 应用后的实际花费
GroupBy=[
{
‘Type‘: ‘DIMENSION‘,
‘Key‘: ‘SERVICE‘
}
]
)
# 解析数据
results = response[‘ResultsByTime‘][0][‘Groups‘]
cost_data = []
for item in results:
service_name = item[‘Keys‘][0]
amount = float(item[‘Metrics‘][‘AmortizedCost‘][‘Amount‘])
currency = item[‘Metrics‘][‘AmortizedCost‘][‘Unit‘]
# 只记录金额大于 0 的项目
if amount > 0:
cost_data.append({
‘Service‘: service_name,
‘Cost‘: round(amount, 2),
‘Currency‘: currency
})
# 转换为 DataFrame 并排序
df = pd.DataFrame(cost_data).sort_values(by=‘Cost‘, ascending=False)
return df
if __name__ == "__main__":
# 执行查询并打印
df_costs = get_monthly_cost_by_service()
print("
本月各服务成本排名:")
print(df_costs.to_string(index=False))
#### 代码深入讲解
-
boto3.client(‘ce‘): 我们创建了一个 Cost Explorer 的客户端对象。所有的交互都通过这个对象进行。 -
get_cost_and_usage: 这是核心 API。
* INLINECODE7eb49a29: 设置为 INLINECODEa0209623 会把整个时间段的费用聚合在一起;设置为 DAILY 则会返回每一天的数据。
* INLINECODE0ec26946: 这里我们选择 INLINECODE132eb05b(摊销成本)。这对于已经购买了预留实例或节省计划的账户非常重要,因为它能计算出“扣除预留折扣后你实际付的钱”,而不是原价。
* INLINECODEaadbe433: 这里告诉 API 我们想按 INLINECODE59d68b6e(维度)中的 SERVICE(服务)来分组。
- 数据清洗: API 返回的是嵌套的 JSON 结构,我们提取出服务名称和金额,并存入列表。使用 Pandas 仅仅是为了更漂亮地打印表格。
示例 2:利用标签精细化查询 – 找出特定项目的成本
假设你的团队给资源打上了 Project: BetaApp 的标签。现在的需求是:“我只关心 BetaApp 这个项目花了多少钱”。
import boto3
import datetime
def get_cost_by_tag(project_name):
client = boto3.client(‘ce‘)
end_date = datetime.date.today()
start_date = end_date - datetime.timedelta(days=30) # 查询过去 30 天
response = client.get_cost_and_usage(
TimePeriod={
‘Start‘: start_date.isoformat(),
‘End‘: end_date.isoformat()
},
Granularity=‘MONTHLY‘,
Metrics=[‘UnblendedCost‘], # 这里使用 UnblendedCost,通常直接按实际账单金额
Filter={
‘Tags‘: {
‘Key‘: ‘Project‘,
‘Values‘: [project_name],
‘MatchOptions‘: [‘EQUALS‘]
}
}
)
total_cost = response[‘ResultsByTime‘][0][‘Total‘][‘UnblendedCost‘][‘Amount‘]
print(f"项目 {project_name} 在过去 30 天的总成本为: ${total_cost:.2f}")
return total_cost
# 调用示例
get_cost_by_tag("BetaApp")
#### 注意事项与错误处理
- 标签传播延迟:这是新手常犯的错误。你今天给 EC2 打了标签,明天去查询 Cost Explorer API,可能发现查不到数据。为什么?因为 Cost Explorer 的数据更新有延迟(通常最多 24 小时)。不要试图使用 API 做实时的“每分钟”计费监控。
- 混合大小写问题:在 INLINECODE4c90dfce 的 INLINECODE9e5de8e8 中,INLINECODEc5f3b130 和 INLINECODE53c63ad8 可能是不同的。确保你的标签键值对是完全一致的。
示例 3:预测未来成本 – 预算告警的基础
如果我们想预测下个月的账单,可以使用 get_cost_forecast API。这在生成月度财务报表时非常有用。
import boto3
import datetime
def forecast_next_month_cost():
client = boto3.client(‘ce‘)
start_date = datetime.date.today()
end_date = start_date + datetime.timedelta(days=30) # 预测未来 30 天
try:
forecast = client.get_cost_forecast(
TimePeriod={
‘Start‘: start_date.isoformat(),
‘End‘: end_date.isoformat()
},
Metric=‘UNBLENDED_COST‘,
Granularity=‘MONTHLY‘
)
predicted_value = forecast[‘ForecastResultsByTime‘][0][‘MeanValue‘]
print(f"AI 预测未来 30 天的预计花费为: ${predicted_value:.2f}")
except client.exceptions.DataUnavailableException:
print("当前无法生成预测数据(通常是账户数据不足,AWS 需要至少 2 个月的历史数据才能准确预测)")
forecast_next_month_cost()
最佳实践与进阶建议
- 标签策略:不要等到账单爆炸了才想起打标签。从第一行代码开始,就强制要求所有资源必须有 INLINECODE31921309(Prod/Dev)和 INLINECODE87bd1753 标签。没有标签的资源就是不可见的成本黑洞。
- 利用 EC2 Rightsizing 建议:在 Cost Explorer 中,有一个专门的“EC2 Rightsizing Recommendations”页面。它会告诉你:“你的 INLINECODEed05428f 实例过去 30 天的 CPU 最高也没超过 5%,改成 INLINECODEbe68a8b9 能省多少钱”。这是低垂的果实,随手摘取就能省钱。
- 警惕数据传输成本:很多开发者只关注计算和存储。使用 Cost Explorer 按 INLINECODEb47103dd 过滤,搜索 INLINECODE6ae2cb5f。你可能会惊讶地发现,跨可用区(AZ)的数据传输或公网出口流量占了成本的很大一部分。
- 成本异常检测:AWS 会自动检测异常支出。虽然这不完全是 Cost Explorer 的功能(它在 AWS Compute Optimizer 或 Billing Console),但通过 Cost Explorer 的自定义时间范围,你可以手动验证异常是否被修复。
总结
AWS Cost Explorer 不仅仅是一个用来“看钱”的工具,它是我们在云上构建可持续架构的关键伙伴。
- 它让我们从“后知后觉”变得“心中有数”。通过长达 13 个月的历史数据和预测能力,我们可以自信地进行年度预算规划。
- 它是FinOps(云财务管理) 的基石。通过标签分组和过滤,我们将技术指标与财务指标连接起来。
- 通过 AWS CLI/API,我们展示了如何将成本分析自动化,这是构建成本优化的 DevOps 文化的重要一步。
现在的你,已经掌握了从控制台操作到代码调用的全套技能。我建议你立即登录 AWS 控制台,检查一下是否有那些你早就遗忘但在默默扣费的“幽灵资源”,或者运行一下上面的 Python 脚本,看看你最近一个月的 Lambda 费用是不是比想象中要高。
优化成本是一场马拉松,而不是短跑。从今天开始,让 Cost Explorer 成为你每次部署后的必经检查点吧。