API Gateway + Lambda - CORS问题

时间:2018-02-08 15:49:40

标签: cors aws-lambda aws-api-gateway

我遇到了API Gateway + Lambda的CORS集成问题。我已经为与API相关的资源启用了COR。通过Lambda测试,Postman测试等一切似乎都能正常工作,但是从网页脚本调用api会产生以下错误:“请求资源上没有'Access-Control-Allow-Origin'标头。来源'null'是因此不允许访问。响应的HTTP状态代码为415.“我需要更改Lambda功能吗?感谢

这是我简单的Lambda代码..

'use strict';
var AWS = require('aws-sdk');
var dclient = new AWS.DynamoDB.DocumentClient();
var getItems = (event, context, callback) => {

    var params = {
        TableName: "OMSCaseDataTest",
        Key: {
            "IncidentID": event.IncidentID
        }
    }
    dclient.get(params, (error, data) => {
        if (error) {
            callback(null, "error occured")
        } else {
            callback(null, data);

        }
    });
};
exports.getItems = getItems;

3 个答案:

答案 0 :(得分:1)

如果您在API Gateway中使用代理集成,则无法从API Gateway启用CORS。您必须从Lambda代码本身设置标头“ Access-Control-Allow-Origin”。

它在文档中提到。

Python代码示例:

response = {
    'statusCode': 200,
    'headers': {
        'Access-Control-Allow-Origin': '*'
    },
    'body': json.dumps({'message': 'CORS enabled')
}
return response

答案 1 :(得分:1)

假设您正在使用代理集成,则需要自己处理CORS。您的lambda函数将需要以不同的方式处理HTTP方法。当不接受飞行前选项请求时,通常会发生CORS问题。这是一个可以帮助您解决问题的代码段。

function main(event, context, lambdaCallback) {
    if (event.httpMethod === 'OPTIONS') {
        doneOptions(200, '{"status": "OK"}', 'application/json', lambdaCallback);
    } else if (event.httpMethod === 'POST') {
        // do your POST here
    } else {
        return done(400, '{"message":"Invalid HTTP Method"}', 'application/json', lambdaCallback);
    }
}

将HTTP 200返回到您的前端的功能,这些功能决定您的前端/ API可以调用什么,不能调用什么。

function doneOptions(statusCode, body, contentType, lambdaCallback, isBase64Encoded = false) {
    lambdaCallback(null, {
        statusCode: statusCode,
        isBase64Encoded: isBase64Encoded,
        body: body,
        headers: {
            'Content-Type': contentType,
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Headers': 'Authorization,Content-Type',
            'Access-Control-Allow-Method': 'GET,POST,OPTIONS',
        }
    });
}

答案 2 :(得分:0)

有时lambda超时会导致CORS错误。您可以增加超时时间,这可能会解决问题。

enter image description here