AWS API Gateway 集成请求 Http 标头未传递给 lambda

Posted

技术标签:

【中文标题】AWS API Gateway 集成请求 Http 标头未传递给 lambda【英文标题】:AWS API Gateway integration request Http headers not being passed to lambda 【发布时间】:2020-01-22 13:50:38 【问题描述】:

这与这篇帖子 API-Gateway Integration Request HTTP Header not mapping query string to header 类似,但我看不到任何答案,而且所有答案都与问题的意图无关。

我正在尝试在 API Gateway 中添加集成请求参数,但是每当我将 'Http Headers' as shown here 和 'Mapping template' 设置为直通时,当我在 lambda 中登录时,我看不到该标头。

此外,在集成响应中,我无法在集成标头响应参数中引用它。当我调用 API 时,“integration.response.header.cokers”将返回空白。 This is how I configured the integration response

【问题讨论】:

【参考方案1】:

这里的最终解决方案是实现lambda proxy integration。

API Gateway 中的代理集成告诉 API Gateway 只需将所有标头转发到集成进行处理,这意味着您将在 lambda 函数中看到所有这些值。

注意:如果是代理集成,Lambda 必须将特定的响应格式返回给 API Gateway。最终,响应应该是这样的:

“状态代码”:200, “标题”: “回声代理”:真 , 'body': '一些有效载荷'

您现在尝试做的是手动映射所有内容,这是一种已弃用的方法,通常您不想这样做,除非您绝对必须这样做,因为这有点痛苦。

如果您必须手动映射标头,请首先在方法请求中映射它们,以便它可以继续下一步,依此类推。基本上是这样的:

方法请求 -> 将变量映射到集成请求 -> 将变量映射到正文映射模板 -> 将变量映射到实际请求标头

集成请求的屏幕截图 -> HTTP 标头是:

名称:焦化器 映射自:'blah'

但是,“映射自”应该类似于“method.request.header.coker”,这是一个标准化路径(意味着从名为“coker”的方法请求标头字段中获取值)。

将 coker 标头添加到方法请求后,并且集成请求 HTTP 标头已正确映射,您必须实现映射模板。将 content-type 设置为 application/json 并设置 passthrough 为“当没有定义模板时(推荐)”和一个简单的映射模板:

“标题”: “焦化器”:“$input.params('coker')”

这就是我的 API 的设置方式,它向我返回以下内容,因为我的 lambda 函数将事件作为 json 对象返回给 API GW:

"body": "\"headers\": \"coker\": \"mapped\"", "statusCode": 200

注意:客户端请求中我的标头“coker”的值是“映射的”

更新答案 要将原始的“coker”标头映射到“coker2”(或您想给它的任何其他名称),您只需在映射模板中设置标头的名称,如下所示:

“标题”: "coker2" : "$input.params('coker')"

然后编辑您的 lambda 函数以返回“coker2”标头,您应该会得到如下响应:

"body": "\"headers\": \"coker2\": \"mapped\"", "statusCode": 200

【讨论】:

我正在使用非代理来自动生成文档和 json 架构。在这种情况下意味着 $input.params('coker') 仅来自请求标头 'coker' ?即使我没有设置“集成请求 HTTP 标头”,它仍然可用吗?我真正想要的是在“集成请求 HTTP 标头”中说我将 coker2 映射为“method.request.header.coker”,在“映射模板”中我将其映射为“$input.params('coker2')”。我认为它不会在 lambda 中可用。 @HansTjipto "$input.params" 指的是原始变量名。因此,您必须将标题映射为“coker2”,输入参数为“coker”。我很快就会对此进行测试并稍微改变我的答案。我很好奇您为什么要更改标题名称?如果是我,我会一直把它作为焦化器,因为如果您有任何问题并想要验证它等,以后更容易跟踪/诊断...... 哦,那太快了,我仍然有我在设置中测试过的原始 API,所以我只是在我的映射模板中更改了名称并部署它,它也可以工作!答案已更新 谢谢,最后我也是这样做的,所以这意味着我们不能从“集成请求 HTTP 标头”映射它,对吗?我觉得“Integration Request HTTP Headers”有点没用。实际上,我们对标头进行了一些更改,但我们并不想修改我们的 lambda,因为它被其他直接调用使用。 是的,我的猜测是它对你或我来说并不意味着“有用”,但这只是应用程序的设计方式,这些是获取 lambda 函数所需的步骤。我仍然很好奇,为什么在集成请求中专门映射它很重要?似乎无论哪种方式都可以实现最终目标,一旦它成为 lambda,您就可以准确地引用它?

以上是关于AWS API Gateway 集成请求 Http 标头未传递给 lambda的主要内容,如果未能解决你的问题,请参考以下文章

使用 HTTP 代理访问 AWS API Gateway 中的标头?

AWS API Gateway - Lambda 代理(集成请求) - 内部服务器错误

AWS API Gateway 集成响应

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

未调用 AWS API Gateway 自定义授权方

HTTP 请求正文未通过 AWS API Gateway 访问 AWS lambda 函数