s3存储桶中的API Gateway核心问题

时间:2018-08-17 10:50:26

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

我真的被困在这里,我发现的与cors相关的解决方案都没有帮助,所以这是我的最后选择。

我用POST方法创建了一个API网关,该方法触发了Lambda函数,该函数将一个项添加到DynamoDB表中。

当我在API Gateway中尝试POST方法时,一切工作都很好,但是如果我尝试从s3存储桶上托管的网站进行AJAX调用,则会出现以下错误提示:

对预检请求的响应未通过访问控制检查:所请求的资源上没有“ Access-Control-Allow-Origin”标头。

我已经在API网关上启用了cors,并且基本上将我可以找到的所有cors Access-Controll-Allow-etc添加到了执行AJAX调用的JavaScript中,但无济于事。我仍然遇到相同的错误...

非常感谢您提供任何可能的帮助,因为我现在只是在圈子中调试。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您想从s3托管站点访问S3存储桶,则需要根据文档here在S3存储桶中添加CORS规则。

规则将是这样的-<AllowedOrigin>将是您的网站网址

<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>http://www.example1.com</AllowedOrigin>
   <AllowedMethod>PUT</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedMethod>DELETE</AllowedMethod>
   <AllowedHeader>*</AllowedHeader>
 </CORSRule>
</CORSConfiguration>

如果您想从s3托管站点访问您的API ,则可以

  • 根据文档here
  • 在API网关中配置CORS

  • 从Lambda函数/应用程序代码返回OPTIONS请求的CORS标头。例如,在AspNet中,只需添加middleware即可完成此操作。

答案 1 :(得分:1)

您必须记住在控制台中启用CORS之后再次部署API。 (愚蠢的我忘记了这一点,并且一直在圈子里奔跑。)

另一方面,帮助调试的一种好方法是卷曲API网关的URL,以查看API网关的响应(Access-Control-Allow-Origin中是否存在CORS标头。如果没有,那么您知道API网关未正确启用CORS。

< HTTP/1.1 200 OK
< Date: Sat, 25 Jul 2020 13:20:18 GMT
< Content-Type: application/json
< Content-Length: 215
< Connection: keep-alive
< x-amzn-RequestId: 1f786173-23f7-412e-a106-64105235b253
< Access-Control-Allow-Origin: *      //See if this is missing
< x-amz-apigw-id: QOyu2E15tjMFoGQ=
< X-Amzn-Trace-Id: Root=1-5f1c3192-8b2f67e02bcb71ce1e0bb254;Sampled=0
<
{"statusCode":200,"body":{"key":"value"}}* Connection #0 to host 1111.ap-northeast-1.amazonaws.com left intact

受此启发:https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-test-cors.html