You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:36:04