AWS API Gateway + AWS Lambda 中的 CORS

Posted

技术标签:

【中文标题】AWS API Gateway + AWS Lambda 中的 CORS【英文标题】:CORS in AWS API Gateway + AWS Lambda 【发布时间】:2017-09-19 21:45:56 【问题描述】:

我正在尝试使用 AWS Lambda 和 API Gateway 设置 POST lambda 函数。这个 POST 应该可以从使用 javascript 的现代浏览器调用,所以很自然,我需要为此启用 CORS。不幸的是,无论我做什么,服务器都会在 Firefox 中返回 400 错误。我在网关的 POST 函数上启用了 CORS,并设置了一个包含所有必要标头的 OPTIONS 函数,但我仍然得到这个:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://ua1c36to9i.execute-api.ap-southeast-2.amazonaws.com/beta. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

它告诉我我没有收到 Access-Control-Allow-Origin 标头,我可以通过查看“网络”选项卡中的响应来确认:

Content-Length: 181
Content-Type: application/json
Date: Sun, 23 Apr 2017 03:39:10 GMT
Via: 1.1 d0d3075c33572544a6859ec75d2258a1.cloudfront.net (CloudFront)
X-Amz-Cf-Id: EEMUjL78Bf1PSwt4E4QGPgTLXSD8sehiUCgy-XA7TC_1cKv3jxs9Rg==
X-Cache: Error from cloudfront
X-Firefox-Spdy: h2
x-amzn-RequestId: 6943b9bd-27d6-11e7-aaae-f36ce836982f

标题X-Cache: Error from cloudfront 似乎告诉我 Lambda 必须返回某种内部服务器错误,并且 CORS 仅在网关上为 HTTP 200 请求启用。实际上,我的 OPTIONS 预检返回 HTTP 200 OK,这表明 CORS 似乎已启用。但我不知道如何使用 lambda 捕获错误并为 CORS 启用它,所以我不知道我的内部错误可能是什么。

但让我感到好奇的是,如果我使用 test-cors.org 来测试我的 POST 函数,它声称我得到了 HTTP 200 OK。更奇怪的是,如果我复制它为发出请求而生成的确切代码并将其放入本地机器上的测试 html 页面中,无论如何我都会得到 HTTP 400。怎么回事?

我的 ajax 调用:

var myData = JSON.parse(this.result);
console.log(result);
$.ajax(
    type: "POST",
    dataType: "json",
    url: "https://ua1c36to9i.execute-api.ap-southeast-2.amazonaws.com/beta",
    data: myData,
    headers: 
        "Content-Type":"application/json"
    ,
    success: function (data) 
        console.log(data);
    ,
    error: function (error) 
        console.log(error);
    
);

AWS Lambda 上的函数当前配置为忽略 POST 数据并仅返回硬编码字符串,因此 AJAX 负载无关紧要。

【问题讨论】:

【参考方案1】:

您可以尝试下载 AWS APIG 开发工具包并使用 apigClient 执行您的 AJAX 调用,然后将标头与您脚本中的标头进行比较。

看这里:AWS API Gateway - CORS + POST not working

根据您的代码手动设置标头特别有趣:

headers: 
     "Access-Control-Allow-Origin": "*"
,

我也建议尝试:

data: JSON.stringify(myData)

这也是一个很好的资源:@​​987654322@

我们的 API 服务器在 AWS Beanstalk 上的 CORS 存在一些问题,对我们来说,这归结为正确设置它们。我记得在我们最初设置缓存时,也曾多次要求清除缓存。

【讨论】:

哇,解决了!我永远不会猜到负载内容类型会是罪魁祸首!编辑:澄清任何未来的搜索者,问题是需要JSON.stringify() 很好,在我阅读了我链接的那个线程中的一些提及之后,我有一种感觉,我看到你的数据正在通过原始数据并导致400 Bad Request。回头看,如果缺少标头,您可能会看到一些错误413 Forbidden 响应。祝你有美好的一天:)

以上是关于AWS API Gateway + AWS Lambda 中的 CORS的主要内容,如果未能解决你的问题,请参考以下文章

从AWS API-Gateway中找出lambda名称

AWS API Gateway 默认响应和触发 AWS Lambda

响应未定义 - aws-api-gateway-client

是否可以使用 AWS API 为 Lambda 函数设置 AWS API Gateway 端点?

如何使用 AWS CloudFormation 在 AWS API Gateway 集成中指定阶段变量?

AWS API Gateway + AWS Lambda 中的 CORS