Я застрял в проблеме с шлюзом API, и я прошел через все остальные ответы SO на этом форуме AWS и прошел через их документы, но до сих пор не радуюсь.
Я пытаюсь настроить API с помощью AWS API-шлюза, который вызывает функцию Lambda, которая читает/записывает в таблицу в DynamoDB.
Работает функция Lambda для DynamoDB. Я создал API в AWS и создал для него методы GET и OPTIONS. Я читал, что AWS не применяет OPTIONS только для GET/POST, но я получал ошибку перед полетом в моем вызове ajax, когда не было метода OPTIONS, поэтому я добавил его.
Пока только для достижения прогресса я не использую ключ API или авторизацию. Я могу успешно вызвать мой метод GET с помощью POSTMAN, который возвращает содержимое таблицы DynamoDB.
Но когда я пытаюсь использовать вызов jQuery ajax, я получаю
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
Я могу увидеть, используя инструменты Chrome dev на вкладке сети, метод OPTIONS, возвращающий статус 200, и GET возвращает статус 200, но с указанной выше ошибкой.
Я попытался включить CORS как в методах OPTIONS, так и GET, повторно развернул API после каждого изменения, попробовал следующее (http://enable-cors.org/server_awsapigateway.html), но всегда получайте ту же ошибку в консоли.
Я выполняю вызов ajax из файла на моем рабочем столе, поэтому происхождение является нулевым, поскольку страница будет развернута на S3 как одно приложение веб-страницы в JS.
Когда я включил CORS в своих GET и OPTIONS, я вижу, что Access-Control-Allow-Headers 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'
и Access-Control-Allow-Origin * is '*'
Мой вызов Ajax выглядит ниже. Я также попытался скопировать точные заголовки POSTMAN, которые имеют набор заголовков авторизации (которые я отключил в AWS сейчас), но я всегда получаю ту же ошибку выше
var awsHeaders = {};
awsHeaders['X-Amz-Date'] = '20161127T171734';
$('#add, #cloud').click(function() {
$.ajax({
type: 'GET',
headers: awsHeaders,
dataType : "json",
url: '...',
success: function (res) {
console.log('response in GET:');
console.log(res);
},
error: function(data) {
console.log('in error');
console.log(data);
}
});
});
Может ли кто-нибудь пролить свет на то, что мне не хватает?
Большое спасибо
Обновление См. Ответ ниже, как я решил это в соответствии с комментариями DigitalKapteain - установив заголовок "Access-Control-Allow-Origin": '*' в ответе от моей функции Lambda. Я искал это в документах AWS, но не смог найти его. Эта ссылка описывает разницу между Lambda и Lambda Proxy и объясняет, что делать при использовании CORS https://serverless.com/framework/docs/providers/aws/events/apigateway/