如何通过 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 函数

调用 aws web api 的问题

通过 HTTP 集成从 AWS Api Gateway 中的 websocket 提取 websocket 连接 ID 和其他详细信息