Infracost按量计费成本估算指南:S3与Lambda用量估算算法深度剖析
【免费下载链接】infracostCloud cost intelligence for engineers, AI coding agents, and CI/CD 💰📉 Shift FinOps Left!项目地址: https://gitcode.com/gh_mirrors/in/infracost
Infracost 是一款面向工程师的云成本估算工具(Cloud cost intelligence),它可以在 Terraform 部署之前,提前算出 S3、Lambda 这类按量计费资源的月度费用。与固定价格的资源不同,按量计费资源的成本取决于"用量"——存了多少 GB、调用了几万次。本文将深度剖析 Infracost 估算 S3 与 Lambda 用量的完整算法,帮你理解每一分钱是怎么算出来的。
先搞懂:Infracost 从哪里获取"用量"?
按量计费资源估算的关键在于三个输入:用量(Usage)、价格(Price)、计算逻辑(Quantity → Cost)。Infracost 为每个资源定义了一份"用量模式"(UsageSchema),声明该资源支持哪些用量参数,并提供两条数据来源:
| 来源 | 说明 | 适用场景 |
|---|---|---|
用量文件infracost-usage.yml | 用户手动声明用量,也支持 small / medium / large 三档预设 | 资源尚未部署,无法取到真实数据 |
| 云厂商真实监控数据 | 通过 CloudWatch 等 API 读取过去 30 天的实际用量 | 资源已部署,希望估算更贴近现实 |
用量模式定义直接写在资源代码里,例如 Lambda 声明了request_duration_ms(平均请求耗时)和monthly_requests(月请求数)两个参数,见 lambda_function.go;S3 桶则声明了object_tags和 6 种存储分类参数,见 s3_bucket.go。
S3 用量估算算法:按存储分类拆分监控指标
S3 的计费维度很碎:不同存储分类(Standard、Intelligent-Tiering、Glacier 等)单价不同,请求还分 Tier-1 / Tier-2 两档。Infracost 的估算函数在 s3_bucket.go 的 estimate 闭包 中实现,核心分两步。
第一步:查存储量。对每一种存储分类,调用 CloudWatch 的AWS/S3命名空间下的BucketSizeBytes指标(取月平均值),并带上StorageType维度来区分 Standard、IntelligentTiering 等。实现位于 internal/usage/aws/s3.go,取到字节数后除以 10⁹ 换算成 GB,填入对应存储分类的storage_gb字段。注意一个细节:Standard 分类即使查不到数据也会保留,其余分类查不到则跳过,保证默认估算不缺失。
第二步:查请求量。先通过ListBucketMetricsConfigurationsAPI 找到桶的监控过滤器 ID(S3FindMetricsFilter),然后用它查询请求指标并求月总和:
- Tier-1 请求(较贵):
PutRequests+PostRequests+ListRequests - Tier-2 请求(较便宜):
GetRequests+HeadRequests+SelectRequests - 另外还会取 S3 Select 的
SelectBytesScanned与SelectBytesReturned,换算为 GB 后计入扫描/返回数据量
这一分组与 AWS 官方对 S3 请求 Tier 的定价口径完全一致,因此估算结果可直接对上账单。
Lambda 用量估算算法:GB-Seconds 与阶梯计价
Lambda 按"请求次数 + 执行时间(GB-seconds)"计费,Infracost 的用量估算同样来自 CloudWatch 过去 30 天的指标(lambda_function.go 的 estimate 函数):
- 月请求数:取
AWS/Lambda命名空间下Invocations指标的月总和(LambdaGetInvocations) - 平均耗时:取
Duration指标的月平均值(LambdaGetDurationAvg),单位毫秒
有了这两个数,核心换算公式是(calculateGBSeconds):
GB-seconds = 月请求数 × (内存 MB ÷ 1024) × 耗时秒数(向上取整到 1ms)
之后还有两个容易忽略的细节:
- 阶梯计价:x86 架构下,每月前 60 亿 GB-seconds、接下来 90 亿、超出 150 亿的部分使用不同单价;ARM64 的免费额度更高(前 75 亿 / 接下来 112.5 亿)。Infracost 用
CalculateTierBuckets把总 GB-seconds 切分进各阶梯,逐段计价。 - 临时存储:每函数默认 512MB 临时磁盘免费,只有配置了更大的
ephemeral_storage时,超出部分才按GB-seconds计费(calculateStorageGBSeconds)。
估算值如何变成最终价格?
用量确定后,internal/prices/ 包会向 Infracost 定价 API 发起并发批量查询(并发数按 CPU 核数计算,上限 16),用每个费用组件携带的ProductFilter(厂商、区域、服务、usagetype 等条件)匹配出精确单价,再乘以月用量得出月度成本。查不到价格时会聚合成"missing prices"警告,方便你快速定位。真实用量的批量拉取逻辑在 usages.go 中,资源每 10 个一批并发请求,效率很高。
实用建议
- 资源已上线:让 Infracost 自动读取 CloudWatch 数据,估算精度最高,且可通过用量文件同步回
infracost-usage.yml - 资源未部署:使用 infracost-usage-example.yml 参考格式手动声明用量,或采用 small/medium/large 预设档
- S3 桶若配置了生命周期规则(lifecycle_rule),Infracost 会按规则自动展开对应存储分类分别计价,无需额外声明
一句话总结:Infracost 对 S3 和 Lambda 的估算算法 = CloudWatch 真实监控指标(或用户声明的用量)→ 按官方计费口径换算成 GB / 请求数 / GB-seconds → 阶梯切分 → 精确匹配云厂商单价。理解了这套流程,你就能判断估算结果可信与否,并用用量文件让它更贴近你的真实业务量。
【免费下载链接】infracostCloud cost intelligence for engineers, AI coding agents, and CI/CD 💰📉 Shift FinOps Left!项目地址: https://gitcode.com/gh_mirrors/in/infracost
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考