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

AWS SDK Gateway getUsagePlans在Lambda中无法正常工作的问题

问题:Lambda中使用AWS JS SDK无法获取API Gateway使用计划数据

现象

执行CLI命令aws apigateway get-usage-plans可正常返回账号下的API使用计划数据,但在Lambda中运行Node.js代码时,返回结果仅包含statusCode:200,无法获取到使用计划数据。

CLI命令

aws apigateway get-usage-plans

CLI输出

{
  "items": [
    {
      "id": "3hhulv",
      "name": "testplan",
      "apiStages": [
        {
          "apiId": "dp6ounv3jd",
          "stage": "default"
        }
      ],
      "throttle": {
        "burstLimit": 10,
        "rateLimit": 10.0
      },
      "quota": {
        "limit": 10000,
        "offset": 0,
        "period": "MONTH"
      }
    }
  ]
}

原Node.js代码

const AWS = require('aws-sdk');

exports.handler = async (event) => {

var apigateway = new AWS.APIGateway();

var params = {};
var usageplans = apigateway.getUsagePlans(params, function(err, data) {
    if (err) console.log(err, err.stack); // an error occurred
    else console.log(data); // successful response
});

const response = {
    statusCode: 200,
    things : usageplans.data
    
};
return response;
};

原代码输出

{
  "statusCode": 200
}

原因

  1. 异步处理逻辑错误:原代码混用回调函数与async/await。apigateway.getUsagePlans用回调调用时,返回的usageplans是请求对象而非实际响应数据;且Lambda的async handler会直接返回response,不会等待回调执行完成,导致usageplans.data不存在。
  2. 未实现分页处理:即使考虑分页,原代码也没有通过position参数循环获取所有数据,若使用计划数量超过单次返回上限,会导致数据不完整。

修复后的代码

改用async/await调用SDK的Promise版本,并实现分页逻辑以获取全部使用计划:

const AWS = require('aws-sdk');
const apigateway = new AWS.APIGateway();

exports.handler = async (event) => {
    let allUsagePlans = [];
    let params = {};

    try {
        do {
            const response = await apigateway.getUsagePlans(params).promise();
            allUsagePlans = [...allUsagePlans, ...response.items];
            params.position = response.position; // 设置下一页的位置标记
        } while (params.position); // 循环直到没有下一页

        return {
            statusCode: 200,
            things: allUsagePlans
        };
    } catch (err) {
        console.error('获取使用计划失败:', err);
        return {
            statusCode: 500,
            error: err.message
        };
    }
};

说明

  • 用await等待SDK请求完成,确保数据获取后再返回结果,避免异步逻辑导致的空值问题。
  • 通过position参数循环调用接口,收集所有分页数据。
  • 添加错误捕获,返回错误信息便于排查问题。

内容的提问来源于stack exchange,提问作者ALargeRubberDuck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:01:04