6

我正在使用AWS Serverless构建一个包含大约 15 个 Lambda 函数的小型站点。
我的 Cloudformation 堆栈完全使用SAM.

我没有使用 Lambda 代理集成。

yaml 模板配置中的 Api 部分SAM如下所示:

AppApi:
    Type: AWS::Serverless::Api
    Properties:
        Cors:
            AllowMethods: "'*'"
            AllowHeaders: "'Content-Type'" 
            AllowOrigin: "'*'"
    ...........More Stuff..........

当我部署这个SAMyaml 模板时,我看到我的 ApiGateway 为所有方法创建了 OPTIONS 动词,当我使用 OPTIONS 动词发出请求时,我确实看到了CORS正确的标题。

问题是其他动词(例如 POST)没有像 OPTIONS 请求那样将这些标头添加到它们的响应中,并且当我从浏览器运行我的 api 时,我的控制台中出现跨源策略错误。

所以我目前的解决方法是使用对特定状态代码的集成响应添加 CORS 标头,但我不能也不想处理 15 种方法,我想支持所有响应状态代码(例如 4xx\5xx 等)。

我的问题:

  1. 我在这里做错了什么还是这是一个SAM错误?
  2. 如果这是一个错误,除了使用集成响应(或从我的代码)添加标题之外,还有其他解决方法吗?
  3. 有没有办法可以从 Api 网关“全局”添加标头?还是支持某种全球综合反应?
4

1 回答 1

2

如果您将 Lambda 与代理集成一起使用,则需要在 HTTP 响应中指定 CORS 来源。

对于 Lambda 或 HTTP 代理集成,您仍然可以在 API Gateway 中设置所需的 OPTIONS 响应标头。但是,您必须依靠后端来返回 Access-Control-Allow-Origin 标头,因为代理集成的集成响应已禁用。 https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html

来自 Lambda 的所有响应都需要具有这些标头和状态代码,但您可以将其提取到共享库以减少代码重复。API-G 处理的错误将自动添加标头。

你可能已经有了这个,但 NodeJS 模式是这样的:

var response = {
    statusCode: 200,
    headers: {
        "Access-Control-Allow-Origin" : "*"
    },
    body: JSON.stringify({
        someReturnData
    })
};
callback(null, response);

如果您真的不想这样做,那么您可以关闭 Lambda-Proxy 集成,但这意味着所有请求响应负载都需要在 API-G 而不是 Lambda 中处理。IMO 这提供了更少的灵活性和更多的配置来实现相同的结果。

是两种方法的有趣比较。

于 2019-03-12T15:38:11.600 回答