Cloudfront бросить 403 на редирект - PullRequest
1 голос
/ 07 января 2020

У меня есть 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 для работы перенаправлений?

1 Ответ

1 голос
/ 07 января 2020

Благодаря помощи Ниобоса я понял, в чем проблема. Проблема была с областью DynamoDB. Моя функция Lambda Edge работает на eu-central-1, который является ближайшим краем к моему местоположению, но таблица DynamoDB находится в us-east-1. Поэтому я изменил свой код на это, и все заработало:)

const aws = require("aws-sdk");
const dynamoDB = new aws.DynamoDB.DocumentClient({ region: "us-east-1" });
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;
}
...