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

如何通过AWS SDK(JavaScript)获取Lambda关联的API网关资源路径

解决方法

要通过JavaScript版AWS SDK获取Lambda函数关联的API Gateway资源路径,核心思路是遍历API Gateway的所有REST API及其资源,检查哪些资源的集成请求指向目标Lambda函数,具体步骤如下:

1. 初始化AWS SDK客户端

先确保已安装AWS SDK v3的相关依赖包(@aws-sdk/client-api-gateway和@aws-sdk/client-lambda),然后初始化对应的客户端:

import { APIGatewayClient, GetRestApisCommand, GetStagesCommand, GetResourcesCommand, GetMethodCommand } from "@aws-sdk/client-api-gateway";
import { LambdaClient, GetFunctionCommand } from "@aws-sdk/client-lambda";

const region = "你的AWS区域";
const apiGatewayClient = new APIGatewayClient({ region });
const lambdaClient = new LambdaClient({ region });

2. 获取目标Lambda函数的ARN

先通过Lambda函数名获取其完整ARN,后续用来匹配API Gateway的集成配置:

const targetLambdaName = "my-lambda-function";
const getFunctionCmd = new GetFunctionCommand({ FunctionName: targetLambdaName });
const lambdaResponse = await lambdaClient.send(getFunctionCmd);
const targetLambdaArn = lambdaResponse.Configuration.FunctionArn;

3. 遍历所有REST API,查找关联的资源路径

逐个遍历REST API,再遍历其下的stage和资源节点,检查资源方法的集成是否指向目标Lambda:

// 获取账户下所有REST API
const getRestApisCmd = new GetRestApisCommand({});
const restApisResponse = await apiGatewayClient.send(getRestApisCmd);

for (const restApi of restApisResponse.items) {
  const restApiId = restApi.id;
  // 获取当前API的所有发布stage
  const getStagesCmd = new GetStagesCommand({ restApiId });
  const stagesResponse = await apiGatewayClient.send(getStagesCmd);
  
  // 递归获取当前API的所有资源节点
  const getAllResources = async (parentId = "/") => {
    const getResourcesCmd = new GetResourcesCommand({ restApiId, parentId });
    const resourcesResponse = await apiGatewayClient.send(getResourcesCmd);
    let allResources = [...resourcesResponse.items];
    for (const resource of resourcesResponse.items) {
      if (resource.id !== parentId) {
        const childResources = await getAllResources(resource.id);
        allResources = [...allResources, ...childResources];
      }
    }
    return allResources;
  };
  
  const allResources = await getAllResources();
  
  // 检查每个资源的方法集成是否关联目标Lambda
  for (const resource of allResources) {
    const resourcePath = resource.path;
    // 遍历资源下的所有HTTP方法(如GET、POST)
    for (const method of resource.resourceMethods?.keys() || []) {
      const getMethodCmd = new GetMethodCommand({
        restApiId,
        resourceId: resource.id,
        httpMethod: method
      });
      try {
        const methodResponse = await apiGatewayClient.send(getMethodCmd);
        const integrationUri = methodResponse.integration?.uri;
        // 验证集成配置是否指向目标Lambda的ARN
        if (integrationUri && integrationUri.includes(targetLambdaArn)) {
          // 拼接stage名称和资源路径,得到你需要的格式
          for (const stage of stagesResponse.item) {
            const stageName = stage.stageName;
            const fullPath = `/${stageName}${resourcePath}`;
            console.log(`找到匹配路径: ${fullPath}`);
            // 可根据业务需求返回或保存该路径
          }
        }
      } catch (err) {
        // 忽略无集成配置的方法,继续检查其他资源
        continue;
      }
    }
  }
}

关键注意事项

  • 权限配置:执行该逻辑的Lambda角色需要具备apigateway:GetRestApis、apigateway:GetStages、apigateway:GetResources、apigateway:GetMethod以及lambda:GetFunction的权限。
  • 性能优化:如果账户下API Gateway资源较多,遍历速度可能较慢,可通过给API Gateway添加标签,在GetRestApisCommand中加入标签过滤条件缩小范围。
  • 多匹配处理:同一个Lambda可能被多个API Gateway资源调用,代码会输出所有匹配路径,可根据业务场景筛选所需结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:10:50