CloudWatch Logs 费用意外变高的原因 - 摄取 / 存储 / 分析的成本结构
本文介绍 CloudWatch Logs 的摄取费用是存储费用 20 倍以上的价格结构、VPC 流日志和 Lambda 日志引发的成本暴增,以及利用 Infrequent Access 类和 S3 导出的优化策略。
摄取费用占主导的成本结构
CloudWatch Logs 的费用由 3 个要素构成。以下列出的单价均为截至 2026 年 8 月 / 东京区域(ap-northeast-1)的价格。摄取(Ingestion)费用在将日志数据发送到 CloudWatch Logs 时计费。每 1GB 为 0.76 美元。存储(Storage)费用按月对已保存的日志数据计费。每 1GB 每月 0.033 美元。分析(Logs Insights)费用按查询扫描的数据量计费。每 1GB 为 0.0076 美元。值得注意的是,摄取费用约为存储费用的 23 倍。摄取 1GB 的日志需要 0.76 美元,而将这些日志保存 1 个月的成本是 0.033 美元。也就是说,CloudWatch Logs 成本的大部分是摄取费用。即使缩短日志的保存期限,成本削减的效果也有限,减少摄取的日志量是最有效的成本削减措施。
引发成本暴增的 3 种模式
CloudWatch Logs 的成本意外变高的模式有 3 种。本节列出的日志量和倍数是本文的参考值,并非官方公布的数值。单价为截至 2026 年 8 月 / ap-northeast-1 的价格。第一,VPC 流日志。将 VPC 流日志发送到 CloudWatch Logs 后,日志会与网络流量的大小成比例地生成。在流量大的 VPC 中,有时 1 天会生成数十 GB 的流日志。如果每月摄取 1TB 的流日志,仅摄取费用就是 760 美元。VPC 流日志不发送到 CloudWatch Logs,而是直接发送到 S3,费用会更低。不过,费用并不会变为零。像 VPC 流日志这样由 AWS 服务输出的日志(vended logs),在传送到 S3 时也会收取传送费用,此外还要加上 S3 的存储费用。由于传送的单价比发送到 CloudWatch Logs 时低,所以总额会下降,两者是这样的关系。削减的幅度因传送目标和区域而异,实际的估算请在 CloudWatch 和 S3 的官方价格表中确认。第二,Lambda 函数的日志。Lambda 在每次执行时都会自动将 START、END、REPORT 日志发送到 CloudWatch Logs。如果有一个函数每天执行 100 万次,仅此就会生成相当多的日志。如果在函数中大量使用 console.log,日志量还会进一步增加。第三,忘记关闭调试日志。如果在开发中启用了 DEBUG 级别的日志,并在这种状态下部署到生产环境,日志量有时会变为平常的 10-100 倍。
Infrequent Access 类 - 将摄取费用减半
2023 年推出的 CloudWatch Logs 的 Infrequent Access(IA)类(以下单价截至 2026 年 8 月 / ap-northeast-1),是可以将摄取费用削减约 50% 的存储类。IA 类的摄取费用为每 1GB 0.38 美元(Standard 的一半),存储费用同样为 0.033 美元/GB。IA 类的限制在于可用的功能与 Standard 不同。Logs Insights 的查询几乎所有命令都可以使用。但无法使用 Live Tail 的实时显示、通过 GetLogEvents 或 FilterLogEvents 直接获取日志事件、指标筛选器和订阅筛选器。读取 IA 类的日志时,Logs Insights 是主要的手段。因此,需要实时监控、指标提取或转发到其他服务的日志使用 Standard 类,以积累为主要目的、用 Logs Insights 查看就足够的日志使用 IA 类,就是这样的分工。日志组的类在创建日志组时指定。由于无法更改现有日志组的类,要迁移到 IA 类,需要创建新的日志组并更改日志的发送目标。Lambda 的日志默认发送到名为 /aws/lambda/函数名 的日志组,但可以在 Lambda 一侧的设置中更改发送目标日志组,因此可以指定预先以 IA 类创建的日志组。这种情况下也并不是更改现有日志组的类,前提是新建日志组并切换发送目标。另外,IA 类不支持 Lambda Insights 的日志摄取,因此使用 Lambda Insights 的函数需要保持 Standard 类。
S3 导出与 Firehose - 长期保存的最佳方案
对于日志的长期保存,S3 比 CloudWatch Logs 便宜得多。本节列出的单价均为截至 2026 年 8 月 / ap-northeast-1 的价格。CloudWatch Logs 的存储费用为 0.033 美元/GB,而 S3 Standard 为 0.025 美元/GB,S3 Glacier Instant Retrieval 为 0.005 美元/GB。将日志从 CloudWatch Logs 导出到 S3 的方法有 2 种。CreateExportTask API 会将指定期间的日志批量导出到 S3。不过,1 个账户中可以同时执行的导出任务,只有处于 RUNNING 或 PENDING 状态的 1 个,在日志组数量众多的环境中会很耗时。使用 Amazon Data Firehose(2024 年 2 月由 Kinesis Data Firehose 更名)的订阅筛选器,会将日志实时传送到 S3。虽然需要支付 Firehose 的数据处理费用(0.036 美元/GB),但与 CloudWatch Logs 的摄取费用(0.76 美元/GB)相比要便宜。最高效的架构是将日志同时发送到 CloudWatch Logs 和 S3。在 CloudWatch Logs 中只保存短期(7-30 天),用于实时监控和告警,在 S3 中长期保存并用 Athena 进行分析。在为了故障调查还希望搜索日志的场景中,由于 Datadog 是 Amazon Data Firehose 的默认传送目标之一,可以不维护转发的基础设施,就将日志组的日志传送到 Datadog。截至 2026 年 10 月,Datadog 的日志管理将摄取与索引分离,用排除筛选器排除的日志也可以用于归档,因此可以缩减用于搜索的日志。另一方面,Datadog 的官方文档本身也提醒,日志量可能会大幅波动并产生意想不到的用量,因此排除的设置先参考 Datadog 关于日志索引的说明再决定。
减少日志量的实践技巧
削减成本最有效的方法是减少摄取的日志量本身。第一,适当设置日志级别。在生产环境中设置为 INFO 或 WARN 级别,不输出 DEBUG 级别的日志。如果用环境变量控制日志级别,就可以只在需要调试时切换到 DEBUG。第二,采样。在不需要记录所有请求的日志时,只将一定比例的请求记录到日志中。例如,如果只将 10% 的请求记录到日志中,日志量就会变为 1/10。第三,利用结构化日志。使用 JSON 格式的结构化日志,只包含必要的字段,可以减少每行的数据量。不在日志中包含堆栈跟踪的全文,而只记录错误消息和开头几行,这种方法也很有效。第四,利用指标筛选器。如果从日志中提取指标并作为 CloudWatch 指标保存,就可以缩短日志本身的保存期限。
参考资料(AWS 官方)
本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。
如本页内容与官方文档不一致,请以官方文档为准。