我有一个Lambda函数,它有一个API网关触发器。我想以编程的方式获得它是什么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
});
}
});
});看起来应该有比这更简单的方法,所以我想知道我是否采取了正确的方法。
注意:对于上下文,我正在寻找一种测试API端点的方法,这些端点作为我的Lambda函数的触发器附加,因此从事件中获取资源路径不是一种选择。此外,我正在寻找一种在没有任何额外映射或配置的情况下这样做的方法。
发布于 2017-07-29 20:31:19
如果您正在使用Lambda代理集成,则API网关将此内容传递给您的lambda函数如下:
event.requestContext.resourcePath
event.requestContext.apiIdi.e
exports.handler = function(event, context, callback){
var path = event.requestContext.resourcePath,
var apiId = event.requestContext.apiId
//...
}如果不使用代理集成,则可以在application/json的API控制台中设置一个集成映射,在映射模板中设置如下内容:
{"resourcePath" : "$context.resourcePath",
"apiId": "$context.apiId"
}那么您的函数应该可以使用event.resourcePath和event.apiId。
https://stackoverflow.com/questions/45390851
复制相似问题