我有一个具有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端点,因此从事件中获取资源路径不是选项。此外,我正在寻找一种方法,无需任何额外的映射或配置。
答案 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.resourcePath
和event.apiId