Golang AWS SDK未包含AWS Billing Service,如何通过Lambda搭建账单仪表盘
实现方案总览
1. 前置服务说明
你提到的Golang AWS SDK未集成Billing服务,大概率是没有找到对应API分组,AWS账单相关能力有三类官方封装可以直接调用:
- 成本探索者(Cost Explorer)API:支持查询月度/日度维度的成本汇总数据,支持按服务、标签、账号分组,Golang AWS SDK v2的对应包是
github.com/aws/aws-sdk-go-v2/service/costexplorer - 成本和使用报告(CUR):可以导出全量明细账单到指定S3桶,支持按小时/天粒度导出,适合做细粒度分析
- 账单控制台API:仅在需要获取月度账单PDF这类特殊场景使用,常规仪表盘搭建用前两类能力即可满足需求
2. Lambda开发核心流程(Golang实现)
2.1 权限配置
给Lambda执行角色配置以下最小权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ce:GetCostAndUsage", "ce:GetCostForecast" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::你的CUR存储桶/*" }, { "Effect": "Allow", "Action": [ "timestream:WriteRecords", "dynamodb:PutItem" ], "Resource": "你的存储层资源ARN" } ] }
2.2 核心代码逻辑
如果取月度汇总账单,直接调用Cost Explorer API的示例代码如下:
package main import ( "context" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/costexplorer" "github.com/aws/aws-sdk-go-v2/service/costexplorer/types" "strconv" "time" ) // GetMonthlyBill 取指定年份月份的账单汇总数据 func GetMonthlyBill(ctx context.Context, yearStr, monthStr string) (*costexplorer.GetCostAndUsageOutput, error) { // Cost Explorer 全局固定使用us-east-1端点 cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion("us-east-1")) if err != nil { return nil, err } client := costexplorer.NewFromConfig(cfg) year, _ := strconv.Atoi(yearStr) month, _ := strconv.Atoi(monthStr) // 构造时间范围,月粒度查询起始时间为当月1号、结束时间为下月1号 startDate := time.Date(year, time.Month(month), 1, 0,0,0,0, time.UTC).Format("2006-01-02") endDate := time.Date(year, time.Month(month+1), 1, 0,0,0,0, time.UTC).Format("2006-01-02") input := &costexplorer.GetCostAndUsageInput{ TimePeriod: &types.DateInterval{ Start: aws.String(startDate), End: aws.String(endDate), }, Granularity: types.GranularityMonthly, Metrics: []string{"UnblendedCost", "UsageQuantity"}, // 自定义分组维度,可根据需求增加标签维度 GroupBy: []types.GroupDefinition{ { Type: types.GroupDefinitionTypeDimension, Key: aws.String("SERVICE"), }, { Type: types.GroupDefinitionTypeDimension, Key: aws.String("LINKED_ACCOUNT"), }, }, } return client.GetCostAndUsage(ctx, input) }
如果需要细粒度账单数据,定时触发Lambda读取S3存储的CUR CSV文件、解析后写入存储即可。
2.3 触发配置
- 月度全量账单固定在每月3号左右完成结算,可配置EventBridge定时规则每月5号触发Lambda执行一次上月全量数据采集
- 近实时账单可配置每天触发一次,Cost Explorer数据延迟最多24小时
3. 存储与可视化方案
- 存储层:小数据量可直接存在DynamoDB,大数据量建议存Timestream时序数据库,或者直接存S3用Athena做即席查询
- 可视化层:
- 低成本方案直接用AWS QuickSight对接存储层,拖拽生成账单仪表盘,支持按服务、账号、标签维度过滤查看
- 自建方案可用Grafana对接Timestream/Athena数据源,自定义账单看板
4. 常见问题处理
- Cost Explorer需要先在AWS控制台手动开启才能调用API,未开启会返回权限错误
- 多账号场景需要在组织管理账号开通Cost Explorer,同时配置统一CUR导出,Lambda在管理账号运行即可采集所有成员账号的账单数据
- 如果确实要调用SDK未封装的特殊Billing接口,可直接调用AWS REST API,用SDK内置的签名工具给请求签名即可,不需要自己实现鉴权逻辑
内容的提问来源于stack exchange,提问作者Elba Nanero
相关产品推荐
相关产品推荐

