【发布时间】:2023-02-22 03:56:48
【问题描述】:
我已经部署了一个用 Python 编写的 AWS Lambda 函数和 AWS API 网关结构,以将对 API 端点的 POST 请求重定向到我的函数。我想将 PDF 文档上传到我的函数并将其存储在 S3 存储桶中。我遇到的问题是对我的 API 的任何 POST 请求的有效负载都是 UTF-8 编码的。我不想要那个,但无法弄清楚禁用请求有效负载编码的神奇魔力。
我正在使用 curl 进行测试,命令行如下:
curl -XPOST https://xxxxxxxxxx.execute-api.us-west-1.amazonaws.com/test -H 'content-type: application/pdf' --data-binary @document.pdf
更新:我刚刚发现以下文章描述了 API 网关和 Lambda 如何支持上传二进制数据:
https://aws.amazon.com/blogs/compute/handling-binary-data-using-amazon-api-gateway-http-apis/
本文建议我在最初形成问题时讨论的所有复杂性(仍在下面提供)都不是必需的。要将二进制内容上传到我的 Lambda 函数,我需要做的就是确保我的请求包含适当的内容类型标头。我已经在这样做了,但我对我的 Curl 命令进行了一些调整(在上面进行了修改),以完全按照本文中完成的方式定义我的请求。我仍然得到 UTF-8 编码数据而不是 base-64 编码数据。我尝试上传 jpeg 文件而不是 PDF,所以我所做的正是文章中所做的。还是没有爱。我不明白。这篇文章准确地演示了我在做什么。但我没有得到它建议我应该得到的结果。格格格。
原帖:
我正在使用 Terraform 来定义我的部署。我想让 PDF 根本不被编码/损坏。这是我第一次使用 API 网关,显然我缺少一些配置。我现在专门做的一件事是通过我在 Terraform 中的 API 定义的
binary_media_types参数来表示我希望传入的有效负载被视为二进制文件:resource aws_api_gateway_rest_api proxy { ... binary_media_types = [ "application/pdf", "application/octet-stream", "*/*" ]这设置了二进制媒体类型与我定义的 API 关联的配置。我已经通过 AWS 控制台确认此设置正在产生预期的效果...我可以在控制台中看到这些类型。我应该只需要列表中的第一项,但我在尝试找出此处的问题时添加了其他项。通过添加该通配符项,我相信传入的是什么无关紧要内容类型是...所有有效载荷都应被视为二进制文件。
我知道的另一点可能很重要的配置是“集成内容处理属性”.这是 AWS 文档的关键部分,似乎解释了所有这些:
我认为这里适用于我的案例是我在上面强调的案例。这对我说,根据表中“contentHandling”的“未指定”值,我不需要做任何其他事情。我已经尝试在我的 Terraform 配置的集成记录上设置“contentHandling”参数,如下所示:
resource aws_api_gateway_integration proxy { ... passthrough_behavior = "WHEN_NO_MATCH" content_handling = "CONVERT_TO_BINARY" }我首先尝试仅指定
content_handling值。我还尝试将该值设置为“CONVERT_TO_TEXT”,希望随后获得 base64 编码的数据。这些都没有任何效果。我已尝试添加passthrough_behavior值,如图所示。我也试过用“WHEN_NO_TEMPLATES”替换“WHEN_NO_MATCH”。我所做的任何事情都不会改变行为。我无法弄清楚这些设置会在 AWS 控制台中的什么位置显示。如果我知道它们是必要的,我会进一步探索。但我认为我不需要设置这些。我错过了什么?如何通过 API 网关将 PDF 文档发布到我的 AWS Lambda 函数,并且不以任何方式转换请求的负载? TIA!
注意:我知道这个问答:PDF Uploaded via AWS API Gateway getting corrupted。那里的答案不适用于我,因为我需要避免对上传进行表单编码。最终将执行上传的客户端代码是一成不变的,并发送一个 POST 请求,其有效负载只是 PDF 的字节。
【问题讨论】:
-
我确实遇到了完全相同的问题。如果您对如何解决此问题有任何建议,我将不胜感激。我正在为 IAC 使用无服务器框架而不是 terraform,但如果您知道 UTC-8 编码的根本原因,我可能可以将其调整为我的 serverless.yml 文件和/或 go 代码。
标签: aws-lambda encoding terraform aws-api-gateway