У меня есть Lambda Edge, присоединенный к событию Origin Request, который должен обрабатывать перенаправления. Код довольно прост: он проверяет, находится ли запрошенный URL-адрес в таблице DynamoDB, и если да, то возвращает ответ 301 с URL-адресом перенаправления. Это код Lambda Edge, который у меня есть
const aws = require("aws-sdk");
const dynamoDB = new aws.DynamoDB.DocumentClient();
exports.handler = async (event, context, callback) => {
const request = event.Records[0].cf.request;
const uri = request.uri;
let redirect = await getRedirect(uri);
if (redirect) {
const redirectResponse = createRedirect(redirect.To);
callback(null, redirectResponse);
return;
}
callback(null, request);
return request;
};
function getRedirect(uri) {
let params = {
TableName: "Redirects",
KeyConditionExpression: "#from = :from",
ExpressionAttributeNames: {
"#from": "From"
},
ExpressionAttributeValues: {
":from": uri
}
};
return dynamoDB
.query(params)
.promise()
.then(result => result.Items[0])
.catch(reject => null);
}
function createRedirect(uri) {
const response = {
status: "302",
statusDescription: "Found",
headers: {
"cache-control": [
{
key: "Cache-Control",
value: "max-age=0"
}
],
location: [
{
key: "Location",
value: uri
}
]
}
};
return response;
}
Если я проверяю функцию Lambda с помощью тестовых событий, я получаю ответ перенаправления. Однако, когда я пытаюсь получить перенаправление с помощью CloudFront, я получаю ошибку 403. Итак, предположим, что URL /a
должен перенаправить на /b
. Если я позвоню cloudfront.url/a
, я получу сообщение о том, что объект был перемещен в /b
(или, что еще лучше, автоматически перенаправляется). Вместо этого я получаю ошибку 403. Что-то не так с Lambda, или мне нужно добавить некоторые разрешения в CloudFront для работы перенаправлений?