【发布时间】:2019-05-16 03:36:21
【问题描述】:
我正在使用 AWS SAM(Lambda 和 API 网关)构建一个 API,其合同由第三方定义。
第 3 方使用正文中包含 JSON 的 GET 请求调用我的 API。但是,当请求通过正文发送到 API 时,会被 CloudFront 拒绝。
这是请求:
curl -X GET -H "Content-Type: application/json" --data '{"hello":"world"}' https://my-api.execute-api.us-east-2.amazonaws.com/Prod/my-api
这是回复:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD>
<BODY>
<H1>403 ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size="1px">
Bad request.
<BR clear="all">
<HR noshade size="1px">
<PRE>
Generated by cloudfront (CloudFront)
Request ID: 1p0St_-e3noQL-2uMxeB_2I6lkMr1mg5afvxJRmVpCdnG67Vgnhj9w==
</PRE>
<ADDRESS></ADDRESS>
</BODY>
</HTML>
检查日志,请求从未命中 API Gateway 或 Lambda 函数。但是,如果我从请求中删除正文,那么它会触发 Lambda 函数,并且我会从 API 获得相应的错误消息(告诉调用者预期的正文丢失了。)
curl -X GET -H "Content-Type: application/json" https://my-api.execute-api.us-east-2.amazonaws.com/Prod/my-api
我正在通过 SAM 模板使用 API Gateway 的基本配置。这是相关部分:
MyApiFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: bin/main.zip
Handler: main
Runtime: go1.x
Tracing: Active
Role: !Sub ${MyApiLambdaExecutorRole.Arn}
Events:
CatchAll:
Type: Api
Properties:
Path: /my-api
Method: GET
【问题讨论】:
-
见this post。根据 RFC,这是非法的。
-
我正在订阅第 3 方的 Webhook,第 3 方发出此请求以验证我的 API 是否正在响应。我理解对包含正文的 GET 请求的反对意见,但我无法控制它。如果没有解决方法,那么我唯一的选择是将我的 API 完全移出 AWS。
-
我理解您的沮丧,但 AWS 正在实施该标准。尝试在 EC2 上创建一些代码,也许您可以找到允许它的东西。我知道你被夹在中间,但除了告诉第 3 方他们正在破坏事情之外,这将是一个很难解决的问题。
-
我刚刚向自己证明,至少在带有 JAX-RS 的 Java 中,我可以从 GET 调用中获取正文。这有点令人费解,但可以做到。
标签: amazon-web-services aws-lambda aws-api-gateway amazon-cloudfront