API Gateway + Lambda - проблема CORS

У меня продолжаются проблемы с интеграцией CORS для API Gateway + Lambda. Я включил COR для ресурсов, связанных с API. Похоже, что все работает нормально с помощью лямбда-тестирования, тестирования почтальона и т. Д., Но вызов api из сценария веб-страницы дает следующую ошибку: «На запрошенном ресурсе нет заголовка 'Access-Control-Allow-Origin'. Origin 'null' следовательно, доступ запрещен. Ответ имел код состояния HTTP 415. " Мне нужно изменить лямбда-функцию? Спасибо

Вот мой простой лямбда-код ..

'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;


person Patrick    schedule 08.02.2018    source источник
comment
будьте осторожны при выборе тегов для своего вопроса.   -  person bolov    schedule 08.02.2018
comment
Как настроить CORS, зависит от типа интеграции ресурсов, с которой вы работаете. Было бы полезно, если бы вы уточнить свой вопрос. Как вы пытались настроить CORS? Какую интеграцию ресурсов вы используете? Этот документ полезен: docs.aws.amazon.com / apigateway / latest / developerguide /   -  person Daniel B.    schedule 08.02.2018
comment
Привет, Даниэль, спасибо за ответ. Я уже включил CORS в шлюзе API (в соответствии с рекомендациями AWS), и я вижу соответствующие заголовки ответа в методе ответа Options, то есть заголовки ответа для 200: Access-Control-Allow-Headers, Access-Control-Allow-Methods, Доступ-Контроль-Разрешить-Происхождение. Я читал в некоторых темах, что функция Lambda также должна быть каким-то образом изменена, но не могу найти никаких четких инструкций.   -  person Patrick    schedule 09.02.2018
comment
Я собирался задать аналогичный вопрос, пока боролся с этим. Я решил запустить свои приложения лямбда-экспресса локально и обнаружил, что на самом деле были внутренние ошибки времени выполнения. Я предполагаю, что при возникновении внутренней ошибки сервера в лямбда-выражении API Gateway возвращает ошибку CORS? Также убедитесь, что вы используете amplify function build, если вы используете усиление, прежде чем отправлять обновления.   -  person SuperVeetz    schedule 03.02.2019
comment
Возможный дубликат проблемы CORS шлюза API   -  person Alex R    schedule 15.02.2019


Ответы (3)


Если вы используете интеграцию прокси в API Gateway, включение CORS из API Gateway не работает. Вы должны установить заголовок «Access-Control-Allow-Origin» из самого вашего лямбда-кода.

Это упомянуто в док.

Пример кода Python:

response = {
    'statusCode': 200,
    'headers': {
        'Access-Control-Allow-Origin': '*'
    },
    'body': json.dumps({'message': 'CORS enabled')
}
return response
person Dawn T Cherian    schedule 18.02.2019
comment
Это правильный ответ, и он был написан перед другим правильным ответом ниже. Может ли OP выбрать это, если это сработало для них? - person Sinux1; 18.07.2021

Предполагая, что вы используете интеграцию прокси, вам нужно будет самостоятельно обрабатывать CORS. Ваша лямбда-функция должна будет обрабатывать 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',
        }
    });
}
person xion    schedule 21.07.2020

Иногда тайм-аут лямбда вызывает ошибку CORS. Вы можете увеличить время ожидания, это может решить проблему.

введите здесь описание изображения

person Rafsan Uddin Beg Rizan    schedule 26.05.2020