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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 08:06:06