获取Lambda函数的API网关端点

时间:2017-07-29 15:17:45

标签: node.js aws-lambda aws-api-gateway

我有一个具有API网关触发器的Lambda函数。我想以编程方式获取它是什么API以及资源路径是什么。这是我到目前为止的一些代码。

let params = {
    FunctionName: "myFunctionName"
};

// Get policies for this function
lambda.getPolicy(params, (err, data) => {
    if (err) return console.log(err);
    let apiIds = [];
    let statements = JSON.parse(data.Policy).Statement;
    // Look for ARNs that have an API ID attached to them
    statements.forEach((statement) => {
        let sourceArn = statement.Condition && statement.Condition.ArnLike && statement.Condition.ArnLike["AWS:SourceArn"];
        let apiIdMatch = sourceArn.match(/\d{12}:([0-9a-zA-Z]*)\//);
        let apiId = apiIdMatch[1];
        if (statement.Effect === "Allow") { // Probably need to be more selective here
            // Check if this resource is actually an API or if it's something else
            apigateway.getRestApi({ restApiId: apiId }, (err, data) => {
                if (err) return; // Not a real API, look for another
                // This is a real API? I think I still need the endpoint/resource path
            });
        }
    });
});

似乎应该有一个比这更简单的方法,所以我想知道我是否采取了正确的方法。

注意:对于上下文,我正在寻找一种方法来测试作为我的Lambda函数的触发器附加的API端点,因此从事件中获取资源路径不是选项。此外,我正在寻找一种方法,无需任何额外的映射或配置。

1 个答案:

答案 0 :(得分:1)

如果您正在使用Lambda代理集成,则API网关将此内容传递给您的lambda函数:

 event.requestContext.resourcePath
 event.requestContext.apiId

exports.handler = function(event, context, callback){
    var path = event.requestContext.resourcePath,         
    var apiId = event.requestContext.apiId
   //...
}

如果您没有使用代理集成,您可以在API网关控制台中为application/json设置集成映射,在映射模板中使用类似的内容:

{"resourcePath" : "$context.resourcePath",
 "apiId": "$context.apiId"
}

然后您的功能可以使用event.resourcePathevent.apiId