如何使用Lambda函数获取AWS前一日账单数据?
如何用AWS Lambda获取AWS账户前一日的账单信息
嘿,我看你已经有了基础的Lambda代码框架,但目前的代码只是列出账单相关的指标,还没法直接拿到前一日的具体账单数据。我来帮你调整完善,让它精准获取前一天的预估费用:
第一步:确认前置条件
- 首先要确保你的AWS账户已经开启了预估费用指标:默认情况下这个指标是关闭的,你需要去CloudWatch控制台,在「账单」指标里开启它,不然拉不到数据。
- 给执行Lambda的IAM角色添加权限:需要允许
cloudwatch:GetMetricStatistics操作,最简单的方式是给角色附加CloudWatchReadOnlyAccess托管策略,或者自定义一个只包含该权限的策略。
第二步:调整后的完整Lambda代码
下面是修改后的代码,它会精准获取前一天的估算账单数据:
exports.handler = async (event) => { // 引入AWS SDK const AWS = require('aws-sdk'); // 初始化CloudWatch客户端 const cloudwatch = new AWS.CloudWatch(); // 计算前一日的时间范围:当天0点到前一天0点 const endTime = new Date(); endTime.setHours(0, 0, 0, 0); // 今天0点 const startTime = new Date(endTime); startTime.setDate(startTime.getDate() - 1); // 昨天0点 const params = { MetricName: 'EstimatedCharges', Namespace: 'AWS/Billing', StartTime: startTime, EndTime: endTime, Period: 86400, // 一天的秒数(24*60*60) Statistics: ['Maximum'], // 取一天内的最大预估费用,代表当日总费用 Dimensions: [ { Name: 'Currency', Value: 'USD' // 可以改成你账户的结算货币,比如CNY } ] }; try { // 获取指标数据 const data = await cloudwatch.getMetricStatistics(params).promise(); // 处理返回结果,提取费用值 if (data.Datapoints.length > 0) { const dailyCost = data.Datapoints[0].Maximum; console.log(`前一日预估账单费用:${dailyCost} ${params.Dimensions[0].Value}`); return { statusCode: 200, body: JSON.stringify({ date: startTime.toISOString().split('T')[0], estimatedCost: dailyCost, currency: params.Dimensions[0].Value }) }; } else { console.log("未获取到前一日的账单数据,请确认指标已开启"); return { statusCode: 404, body: JSON.stringify({ message: "未找到前一日账单数据" }) }; } } catch (err) { console.error("获取账单数据出错:", err); return { statusCode: 500, body: JSON.stringify({ error: err.message }) }; } };
代码关键部分解释
- 时间范围计算:通过Date对象算出昨天0点到今天0点的时间段,确保只获取前一天的完整数据
- Period设置为86400:代表按天聚合数据,符合我们的需求
- Statistics选Maximum:因为EstimatedCharges是随时间递增的,一天内的最大值就是当日的总预估费用
- Dimensions指定货币:要和你账户的结算货币一致,不然可能拿不到数据
测试和验证
把代码部署到Lambda后,直接触发测试,就能在日志里看到前一天的预估费用,同时返回的响应里也会包含结构化的费用数据。
内容的提问来源于stack exchange,提问作者trex tiab
相关产品推荐
相关产品推荐

