尝试将X-Amz-Invocation-Type:Event添加到现有的API Gateway POST方法中。

10
首先,基本问题 - 是否有一种简单的方法在现有的API Gateway POST方法中添加HTTP头X-Amz-Invocation-Type: 'Event',并且集成类型为Lambda函数,以便我可以轻松地从现有端点启动异步Lambda?
现在是背景...
我有一个API Gateway,其中包含一个POST方法,集成类型为Lambda Function,通过curl和JavaScript工作得非常好,但超过29秒则出现API超时。
通过一些搜索,我认为设置HTTP头X-Amz-Invocation-Type:'Event'是我需要的,以使我的Lambda函数以异步方式运行。
我看到有人建议通过控制台使用AWS服务集成类型,然后添加标头以及映射模板等,这比我真正想尝试的要复杂得多(也许我别无选择?)。我尝试了一下,但我“认为”我最终必须处理映射模板,并且我有一个相当复杂的载荷-它真的必须很难吗?
我还看到建议使用两个Lambdas,第一个通过API触发且同步,然后触发异步的Lambda。我知道如何做到这一点,它确实具有优势(但也增加了复杂性),但我暂时搁置了这一点。
我读了一篇帖子“暗示”可能可以通过CLI添加此新的HTTP标题。我已经尝试了一些类似于aws.apigateway.put_method()等的试错,但我有点瞎射。我希望有一种简单的方法来解决这个问题,但目前为止,解决方案仍在逃避我。

1
如果有人读到这篇文章,我仍然感到有些困惑,但我“认为”我可能正在学习如果我想使用基本的Lambda集成与Lambda代理,我可能无法在API网关中添加标题以异步启动。这可能解释了为什么-https://medium.com/@lakshmanLD/lambda-proxy-vs-lambda-integration-in-aws-api-gateway-3a9397af0e6d - DonMorton
3个回答

10
我曾经遇到过这个问题,以下是我发现的Header定义方法:在你的POST方法的“Integration Request”面板中: 截图在此处 据我所知,单引号'Event'很重要,因为它是一个静态值。 设置好后,您可以测试您的方法,您将会立即接收到一个200状态码(大约100毫秒后)。

那在哪里?我在 API 网关上找了很久都没看到。 - jpw
点击您想定义标题的方法。会出现一个测试该方法的页面,在名称为“Integration Request”的方框中查找它。 - Faisal Shani

6

我曾经也遇到过同样的问题,结果发现有多种方法可以解决。Lambda函数的同步或异步运行取决于调用它的资源。使用API Gateway,您可以使用InvocationType头自定义此行为。有两种使用此标头的方式:

  1. 在API Gateway控制台中,在您的方法请求设置下的HTTP请求标头中添加InvocationType标头。
  2. 在您的集成请求设置中创建一个X-Amz-Invocation-Type HTTP标头,就像您所指示的那样。
  3. 在“映射自”设置中,您有两个选项:

    • 如果您想要从API调用中有选择地运行synch.或asynch.,则可以使用值method.request.header.InvocationType。当调用您的方法时,如果您希望函数异步运行,则使用InvocationType: Event标头。

    • 要始终异步调用,请指定值'Event'(重要的是包括单引号)。

还有一件事要注意-如果异步调用函数,则会收到no data响应(显然)。


但是“method Request”设置在哪里? - jpw
AWS控制台 -> API网关 -> [你的API名称] -> 方法(POST,GET等)->方法请求 - Devin Cairns
在看到你的解决方案之前,我已经浪费了几天时间来尝试让它工作。虽然我仍不完全确定发生了什么,但我的有效载荷现在可以从API Gateway传递到SQS队列中了。非常感谢你的解决方案。 - mister_b

2
我认为人们忽略了一件事情,即“方法”选项卡仅在您使用REST API时可用,而不是在您使用HTTP API时可用。文档中并没有清楚说明这一点。请参见我的截图,了解REST API选项的外观以及调用请求所在的位置。

api-gateway-rest-api

如果您使用 HTTP API 创建了 API 网关,则接口将如下所示:

api-gateway-http-api


这个 OP 请求是否可以使用 HTTP API 来实现? 编辑:回答自己,不可能。请参考 https://dev59.com/bbroa4cB1Zd3GeqPgDqm#61083679 - Diego

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接