首页 > 解决方案 > AWS API GATEWAY <=> AWS Lambda CORS 问题

问题描述

这是我第一次使用 AWS,我确实设置了 DynamoDB 表并创建了 Lambda 函数来进行 CRUD 操作,我首先将函数设为静态。然后,我继续创建 API Gateway 方法来动态访问 Lambda 函数。

我尝试调用的方法是 GET 方法,它应该可以使用 JS 调用,并且可以从不同的域调用,我需要启用 CORS,不幸的是,即使在我的 lambda 函数的标头中有它之后,它也会给我 CORS 错误:

'use strict';
const AWS = require('aws-sdk');

AWS.config.update({ region: 'us-east-2' });

exports.handler = async (event, context) => {
    const ddb = new AWS.DynamoDB({ apiVersion: '2012-10-08' });
    const documentClient = new AWS.DynamoDB.DocumentClient({ region: 'us-east-2' });
    let responseBody = "";
    let statusCode = 0;

    var params = {
    TableName: "Users",
  };

  // scan is a function, that is like the SELECT .. WHERE .. clause in SQL
    try{
        const data = await documentClient.scan(params).promise();
        responseBody = JSON.stringify(data.Items);
        statusCode = 200;
    }catch(err) {
        responseBody = `Unable to Scan Users, error: ${err}`;
        statusCode = 403;
    }

    const response = {
        statusCode: statusCode,
        headers: {
            "access-control-allow-origin": "*"
        },
        body: {
            responseBody
        }
    };

    return response;
};

这是我在 VueJS 应用程序中的代码,它应该向 API Gateway 中的 GET 方法发出请求:

try{
  const res = await axios.get("https://here-goes-my-url");
  console.log(res.data);
} catch (err){
  console.log(err);
}

这是我得到的错误:

Access to XMLHttpRequest at 'https://here-goes-the-url' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Lambda GET 方法应返回“用户”表中的所有项目。请帮忙,谢谢!

标签: node.jsamazon-web-servicesaws-lambdaaxios

解决方案


好的,您已经设置了标题。

您是否从 API Gateway 启用了 cors ?

在此处输入图像描述

当您看到 CORS 错误时,在 AWS lambda 的情况下它们并不总是与 CORS 相关,因为有时响应被 API Gateway 阻止并且客户端仍然收到 CORS 错误。我认为这样做是为了更难破解,因为如果您试图破解服务器,错误很有用。

所以我强烈建议您首先在 API Gateway 控制台中测试您的应用程序。

在此处输入图像描述

在此处输入图像描述

这会给你一个更可操作的错误。我猜这可能与权限有关。希望这可以帮助。


推荐阅读