如何通过 AWS HTTP API 向 Lambda 发送参数
Posted
技术标签:
【中文标题】如何通过 AWS HTTP API 向 Lambda 发送参数【英文标题】:How to send parameters through AWS HTTP API to Lambda 【发布时间】:2020-12-29 12:42:05 【问题描述】:出于成本效益考虑,我已从 REST API 切换到 HTTP API。我是 AWS 的菜鸟,所以请耐心等待。
拉姆达
我有一个简单的 Lambda 函数,它返回给定的相同值。从实际的 Lambda 控制台测试时,它工作正常。
exports.handler = async (event) =>
// TODO implement
const response =
statusCode: 200,
body: "hello" + event["key1"]
;
return response;
;
在使用 JSON 输入从 Lambda 控制台测试函数时: "key1":"value1" ,它返回 "hellovalue1"。 这就是我希望我的 GET/POST 请求返回的内容。
API 网关(HTTP API)
我创建了一个简单的 HTTP API,它导致上面的 lambda 函数。 https://39lzilxqm2.execute-api.eu-central-1.amazonaws.com/MS_APITest
当从浏览器调用上面的链接时,它返回helloundefined。
我假设传递参数的方式是 [THE LINK ABOVE]?key1=value1,但这也返回 helloundefined
当使用其他在线工具通过GET/POST请求将JSON数据发送到上面的链接时,结果又是helloundefined
荣誉奖:通过邮递员发送请求时,显示错误:
CORS 错误:由于 CORS 政策,请求已被阻止
如何使用 HTTP API 将参数传递给 AWS Lambda?
提前谢谢你。
【问题讨论】:
【参考方案1】:我尝试使用 HTTP API 复制该问题。我注意到该事件具有以下形式。
version: '2.0',
routeKey: 'ANY /MS_APITest',
rawPath: '/MS_APITest',
rawQueryString: 'key1=value1',
headers:
accept: '*/*',
'content-length': '0',
host: 'xxxxx.execute-api.us-east-1.amazonaws.com',
'user-agent': 'curl/7.72.0',
'x-amzn-trace-id': 'Root=1-5f5afd55-332693f425fbcc7a032809da',
'x-forwarded-for': 'xxxxxxxxx',
'x-forwarded-port': '443',
'x-forwarded-proto': 'https'
,
queryStringParameters: key1: 'value1' ,
requestContext:
accountId: '820872329501',
apiId: 'sg5mhha5ic',
domainName: 'xxxx.execute-api.us-east-1.amazonaws.com',
domainPrefix: 'sg5mhha5ic',
http:
method: 'GET',
path: '/MS_APITest',
protocol: 'HTTP/1.1',
sourceIp: 'xxxxxx',
userAgent: 'curl/7.72.0'
,
requestId: 'SryFYjtUIAMEV5w=',
routeKey: 'ANY /MS_APITest',
stage: '$default',
time: '11/Sep/2020:04:30:13 +0000',
timeEpoch: 1599798613551
,
isBase64Encoded: false
可以看出?key1=value1
被传递为
queryStringParameters: key1: 'value1' ,
因此,lambda函数应该是:
exports.handler = async (event) =>
// TODO implement
console.log(event)
const response =
statusCode: 200,
body: "hello" + event['queryStringParameters']["key1"]
;
return response;
;
我验证它可以使用:
curl https://xxxx.execute-api.us-east-1.amazonaws.com/MS_APITest?key1=value1
导致:
hellovalue1
【讨论】:
这很有魅力!你解决了问题,应该获得金牌。你的回复以难以想象的规模帮助了我。谢谢!【参考方案2】:这将取决于您的 api 网关配置是否正确地将某些内容 - 查询参数、POST 或 PUT 正文(注意 GET 请求正文被忽略)、表单数据 - 映射到您的 lambda 的 Json 输入。仔细查看https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html - 注意如何
整个请求通过代表任何 HTTP 方法的全能 ANY 方法按原样发送到后端 Lambda 函数。实际的 HTTP 方法由客户端在运行时指定。 ANY 方法允许您为所有受支持的 HTTP 方法使用单个 API 方法设置:DELETE、GET、HEAD、OPTIONS、PATCH、POST 和 PUT。
后来他们展示了如何
curl -v -X POST "https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?name=John&city=Seattle" -H "content-type: application/json" -H "day: Thursday" -d " \"time\": \"evening\" "
或者,对于 GET 请求,
curl -X GET \
'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?name=John&city=Seattle' \
-H 'content-type: application/json' \
-H 'day: Thursday'
所有内容都在此处提供的包罗万象的配置中捕获。
但是,如果该集成不完全正确,则数据将无法正确传递,因此请仔细查看。
【讨论】:
您好,我只是想知道。提供的链接适用于 REST API。它是否也适用于 HTTP API?似乎 OP 想在 API Gateway 中使用 Lambda 和 HTTP API,而不是 REST API。 没错,REST API 有大量关于如何使用和配置它们的文档。几乎没有关于 HTTP API 以及如何设置它们的文档。我一直在寻找映射选项,但一无所获。这就是困扰我的地方。 @Ziphold HTTP API 是相当新的并且非常有限。这解释了它较低的价格和缺乏资源和教程:-(以上是关于如何通过 AWS HTTP API 向 Lambda 发送参数的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 AWS API 为 Lambda 函数设置 AWS API Gateway 端点?
在 Angular 11 中,如何通过 API Gateway 将应用程序/json HTTP POST 到 AWS Lambda?
使用 CloudFormation 向 AWS websocket API 添加集成响应
HTTP 请求正文未通过 AWS API Gateway 访问 AWS lambda 函数
通过 HTTP 集成从 AWS Api Gateway 中的 websocket 提取 websocket 连接 ID 和其他详细信息