AWS API Gateway Lambda集成(非代理)-如何发送自定义标头和二进制数据

时间:2018-12-23 10:48:54

标签: amazon-web-services aws-lambda aws-api-gateway

我正在使用与Lambda集成的AWS API Gateway。

注意:我没有使用Lambda代理。

我需要从API网关返回一个二进制响应。我已成功将其设置如下:

  1. 将我的二进制数据编码为base64 UTF-8字符串,并仅从我的lambda函数return "base64 encoded binary data"返回它
  2. 在API网关集成响应上启用CONVERT_TO_BINARY
  3. 将API网关方法响应上的Content-Type标头映射到我的二进制内容的二进制媒体类型
  4. 将我的二进制内容的媒体类型添加到API Gateway的二进制媒体类型列表中

问题在于,除了发送二进制数据(我可以通过上述步骤成功完成此操作)之外,我还需要在API响应中包含一个x-my-header自定义标头。

我知道如何在API网关中设置标头映射,但是必须从数据库数据中计算标头,因此也需要从lambda返回此值。

我对lambda集成的理解(请记住,这里我没有使用lambda代理)是API网关发出HTTP请求来触发lambda。 Lambda然后将HTTP响应返回到API网关,将输出函数添加到主体,还向响应添加内部aws标头。

现在可以使用以下方法将标头映射到方法响应:

integration.response.header.header-name

我的问题是...

  

我可以告诉lambda将我的自定义标头添加到二进制响应中吗   使用自定义lambda集成(而非代理)?

注意如果,我正在使用lambda代理,我知道返回对象如下所示,那么我将能够发送自定义标头。但是出于无法控制的原因,我不能使用lambda代理。

Lambda返回对象解决方案如果,我正在使用lambda代理:

return {
   'body': "base64 encoded binary data",
   'headers': 'x-my-header': 'my-value',
   'isBase64Encoded': True
}

对于Lambda集成(不是代理),我尝试过修改lambda输出...

return {
   "base64-data": "base64 encoded binary data",
   "x-my-header: "some value"
}

并在集成响应中设置映射模板...

$input.json("$.base64-data")

并使用...设置标题映射

integration.response.body.x-my-header

但是API网关返回错误:

Execution failed due to configuration error: Unable to transform response

我相信会发生此错误,因为启用CONVERT_TO_BINARY时将没有映射模板。来自AWS文档:

  

将文本有效内容转换为二进制Blob时,API Gateway假定文本数据是Base64编码的字符串,并将二进制数据输出为Base64解码的Blob。如果转换失败,则返回500响应,指示API配置错误。尽管必须在API上启用传递行为,但您不提供用于此类转换的映射模板。

1 个答案:

答案 0 :(得分:0)

我意识到这是一个老问题,但是即使我没有使用二进制数据,最近我也遇到了类似的标头映射问题。

在我看来,Lambda的回报可能像这样

{
  "base64-data": "base64 encoded binary data",
   "x-my-header: "some value"
}

基于该Lambda响应,您可以应用以下映射(我根据AWS example对其进行了修改)

$input.json("$.base64-data")
#set($context.responseOverride.header.x-my-header = "$input.json('$.x-my-header')")

$ input.json(“ $”)引用您的响应,而$。[key]是引用子键的正确方法。

您还必须在方法响应中预先配置标题“ x-my-header”。

在集成响应中,标头映射只能是一个空值-例如

""

实际值将由映射模板设置的覆盖($ context.responseOverride.header)提供。