如何用Node.js aws-sdk在AWS Lambda中按账户维度获取AWS组织成本并配置筛选维度
AWS组织场景分维度拉取关联账户成本的实现方案(Node.js + Lambda)
核心问题定位
你当前代码存在两个直接导致调用失败的问题:
- 错将历史成本查询接口
getCostAndUsage写为成本预测接口getCostForecast,后者仅支持未来区间的成本测算,不支持拉取已发生的、按关联账户拆分的实际成本 - Filter中的维度键值配置错误,没有正确使用关联账户对应的固定维度标识,导致筛选条件无法生效
前置权限准备
给Lambda执行策略绑定以下最小权限,避免无权限报错:
organizations:ListAccounts:用于拉取组织下所有关联账户的基础信息ce:GetCostAndUsage:用于调用成本分析接口拉取成本数据
注意:Lambda需要部署在组织的管理账号(付费主账号)中,或部署在已获得主账号Cost Explorer跨账号委托访问权限的子账号中,否则无法读取全组织范围的关联账户成本数据
实现步骤
步骤1:拉取组织下所有活跃关联账户列表
Organizations是全局服务,请求固定路由到us-east-1区域,注意处理分页逻辑,避免大组织下账户拉取不全:
const AWS = require('aws-sdk'); const orgClient = new AWS.Organizations({ region: 'us-east-1' }); const ceClient = new AWS.CostExplorer({ region: 'us-east-1' }); async function getAllActiveOrgAccounts() { const activeAccounts = []; let nextToken = null; do { const listResp = await orgClient.listAccounts({ NextToken: nextToken }).promise(); // 仅保留状态为ACTIVE的正常关联账户,排除已移除、暂停的账户 activeAccounts.push(...listResp.Accounts.filter(acc => acc.Status === 'ACTIVE')); nextToken = listResp.NextToken; } while (nextToken); // 提取12位账户ID组成的数组,供后续筛选使用 return activeAccounts.map(acc => acc.Id); }
步骤2:分账户拉取成本数据
不需要逐账户循环调用接口,通过Cost Explorer的分组参数,一次请求即可输出所有关联账户的成本结果,大幅降低接口调用次数、减少超时概率。
Filter配置注意事项:
- 关联账户对应的固定维度Key为
LINKED_ACCOUNT,不要错写为其他值 - Values数组中仅需填写12位纯数字的账户ID,不需要传入账户名称
- 单维度筛选不需要额外嵌套
And/Or逻辑,直接将Dimensions节点挂在Filter下即可
正确的调用参数示例:
async function getMonthlyCostByLinkedAccount() { // 计算时间区间:当月1日到当前自然日 const startDate = new Date(); startDate.setDate(1); const formatToISODate = (date) => date.toISOString().slice(0, 10); const linkedAccountIds = await getAllActiveOrgAccounts(); const requestParams = { Granularity: 'MONTHLY', // 可选值:BLENDED_COST/UNBLENDED_COST/AMORTIZED_COST/NET_AMORTIZED_COST,按需选择 Metric: 'AMORTIZED_COST', TimePeriod: { Start: formatToISODate(startDate), End: formatToISODate(new Date()) }, // 核心配置:按关联账户维度做结果分组,直接输出每个账户的成本值 GroupBy: [ { Type: 'DIMENSION', Key: 'LINKED_ACCOUNT' } ], // 如需限定查询的账户范围,配置该Filter;无范围限制时可移除该节点 Filter: { Dimensions: { Key: 'LINKED_ACCOUNT', MatchOptions: ['EQUALS'], Values: linkedAccountIds } } }; const costResult = await ceClient.getCostAndUsage(requestParams).promise(); return costResult.ResultsByTime; }
Lambda运行注意事项
- Organizations和Cost Explorer均为全局服务,所有请求必须指定
us-east-1作为请求区域,配置其他区域会触发endpoint不存在的报错 - 组织首次开启Cost Explorer功能后,需要等待24小时才能读取到完整的历史成本数据,刚开启时调用接口会返回数据未就绪的提示
- 如果组织下关联账户数超过100个,建议将Lambda超时时间配置为10s以上、运行内存配置为512MB以上,避免接口响应慢触发执行超时
- 如需进一步按服务、区域、标签维度二次拆分成本,仅需在
GroupBy数组中追加对应维度的配置,或在Filter的And数组中追加对应维度的筛选规则即可
内容的提问来源于stack exchange,提问作者August Dev
相关产品推荐
相关产品推荐

