如何使用 AWS API 网关和 Lambda 通过 CORS?

Posted

技术标签:

【中文标题】如何使用 AWS API 网关和 Lambda 通过 CORS?【英文标题】:How to get past CORS using AWS API gateway and Lambda? 【发布时间】:2019-07-03 21:24:31 【问题描述】:

我目前有一个 Lambda 函数,在我测试它时可以工作(它是一个用于订阅用户列表的 Mailchimp 集成)。

See my lambda function here on Github

我通过 lambda 使用 API 网关创建了一个 API 端点。

但是,当我在我的应用程序上测试它时(当前通过 localhost:3000,我收到来自 API 网关的 CORS 错误:

Access to XMLHttpRequest at 'https://MY_API.execute-api.us-west-2.amazonaws.com/default/mailchimp-lambda' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

我尝试了多种方法:

    按照https://serverless.com/blog/cors-api-gateway-survival-guide/ 的建议添加 npm 包 middy 在 lambda 中使用回调并按照此问题的建议添加 CORS:Configure CORS response headers on AWS Lambda?

谁能解释如何访问 lambda 函数?

【问题讨论】:

看起来你没有启用 cors。这可能会对您有所帮助:docs.aws.amazon.com/apigateway/latest/developerguide/… 我通过 API Gateway 控制台启用了 CORS:✔ 创建 OPTIONS 方法✔ 向 OPTIONS 方法添加具有空响应模型的 200 方法响应✔ 向 OPTIONS 方法添加模拟集成✔ 向 OPTIONS 方法添加 200 集成响应✔ 添加Access-Control-Allow-Headers、Access-Control-Allow-Methods、Access-Control-Allow-Origin 方法 OPTIONS 方法的响应标头 ✔ 添加 Access-Control-Allow-Headers、Access-Control-Allow-Methods、Access-Control -Allow-Origin 集成响应标头映射到 OPTIONS 方法 那之后你重新部署了api网关吗? @deosha 是的,我重新部署了,我还在声明中添加了一个资源策略,包括“Principal”:“*”,但无济于事。另外,我正在查看 CloudWatch 日志,我正在控制台记录事件,并且 event.body 来自我的浏览器时为空,但它是通过 Postman 定义的。它说 httpMethod 是 OPTIONS 这很奇怪,我认为 lambda 函数不会在自动 OPTIONS 请求期间运行。 你在 API Gateway 配置->Gateway Responses-> Default 4XX 中的配置是什么?可以在那边加上 Access-Control-Allow-Origin: '* 重新部署再检查一下吗? 【参考方案1】:

如果您使用的是 LAMBDA-PROXY 集成,这意味着您的响应需要 Access-Control-Allow-Origin 标头。

下面是函数示例:

exports.handler = async (event) => 
    const response = 
        statusCode: 200,
        headers: 
            "Access-Control-Allow-Origin" : "*" // Required for CORS
        ,
        body: JSON.stringify('Hello from Lambda!!'),
    ;
    return response;
;

您可以在此处找到有关类似问题的更多详细信息:https://github.com/serverless/serverless/issues/1955

【讨论】:

以上是关于如何使用 AWS API 网关和 Lambda 通过 CORS?的主要内容,如果未能解决你的问题,请参考以下文章

如何将AWS API网关阶段指向特定的lambda函数别名?

如何使用 JSON 格式将 lambda 请求 ID 记录到 AWS CloudWatch Api 网关日志组中?

带有 Cognito 的 AWS Lambda API 网关 - 如何使用 IdentityId 访问和更新 UserPool 属性?

如何在 Node.js 中使用带有 API 网关的 AWS Lambda 发送二进制响应? [复制]

来玩 Serverless: 如何把 Express 应用迁移到 Amazon API 网关和 AWS Lambda 上

AWS 无服务器架构 – 为啥要使用 API 网关?