- bounty将在6天后过期**。回答此问题可获得+50声望奖励。AylaWinters希望引起更多人关注此问题。
我尝试做最基本的概念证明api,但是每次我从Postman调用lambda函数URL时,我得到
com.amazonaws.serverless.exceptions.InvalidRequestEventException:
The incoming event is not a valid request from Amazon API Gateway or an Application Load Balancer
我的身份验证类型为:无,CORS:"",允许的方法:""
政策:
{
"Sid": "FunctionURLAllowPublicAccess",
"Effect": "Allow",
"Principal": "*",
"Action": "lambda:InvokeFunctionUrl",
"Resource": "arn:aws:lambda:us-east-1:11111:function:my-api",
"Condition": {
"StringEquals": {
"lambda:FunctionUrlAuthType": "NONE"
}
}
}
我发现了这个问题,它说"框架期望一个形状像API网关或ALB代理事件的事件。"并链接到这个文档。但是,我该如何在Postman中做到这一点?
但AWS文档建议我不必这样做:
如果函数URL使用NONE auth类型,则不必使用SigV4对请求进行签名,可以使用Web浏览器、curl、Postman或任何HTTP客户端调用函数。
但是,问题可能在于请求到Amazon API Gateway负载模式的转换?来自同一文档:
当客户端调用你的函数URL时,Lambda在将请求传递给你的函数之前将其Map到一个事件对象,然后将函数的响应Map到一个HTTP响应,Lambda通过函数URL将其发送回客户端。
请求和响应事件格式遵循与Amazon API Gateway有效负载格式版本2.0相同的模式。
有人知道我需要做什么修改才能从浏览器/ Postman 调用简单的GET请求吗?
1条答案
按热度按时间ql3eal8s1#
如果您直接调用AWS Lamda函数,则需要遵守许多约定(内容类型为applicatin/json、body configured per request structure in the invocation doc)。
这是因为lambda实际上是一个可以调用的泛型函数,并且对于如何传递信息和参数有一些约定。
然而,配置一个API网关服务来调用你的lambda可能更常见。完整的documentation on configuring api gw to lambda很长,但是有一个quickstart。许多想要将该配置作为代码来管理的人将在所有这些概念之上建立配置系统,诸如“serverless.com“,其经由其中输入被控制为via a .yaml file in your code base的cloudformation来配置lambda和API。
API网关配置(手动或通过类似www.example.com的系统serverless.com)实际上只是Map了http调用的常用结构(GET与POST、查询字符串、路径、等等)到lambda调用所期望的JSON主体中的通用函数调用结构中。同样,Map或嵌套存在的原因是存在触发lambda的其他调用结构(例如dynamodb、异步队列等的更改)