Как изменить код состояния в событии Cloudfront с ответом зрителя? - PullRequest
0 голосов
/ 09 ноября 2018

Я хочу защитить ответ Cloudfront, используя метаданные объекта S3 и некоторые данные роли в БД (или некотором удаленном сервисе), указанные для текущего пользователя. Я думаю, что я должен использовать событие viewer-response здесь, чтобы иметь доступ к данным S3 и пользовательским данным вместе. Я пытаюсь установить status и statusDescription в response объекте, но он не работает для события viewer-response, работает для всех других событий. Настройка заголовков все еще работает.

exports.handler = async (event) => {

  const response = event.Records[0].cf.response;
  const request = event.Records[0].cf.request;
  const isUserAllowed = await allowedByTokenAndDb(request);
  const isS3ObjectAllowed = response.headers['x-amz-meta-isSecure'][0].value === 'true';

  if (!isUserAllowed || !isS3ObjectAllowed) {
    response.status = '403'; // does not work
    response.statusDescription = 'Nothing';
  }

  response.headers['X-Powered-By'] = [{  // works, header will be added
    key: 'X-Powered-By',
    value: 'lol',
  }] 

  return response;
}

Есть ли способ заставить viewer-response вернуть другой статус? Документация AWS не говорит, что это возможно или нет. Может быть, есть другое решение?

1 Ответ

0 голосов
/ 17 ноября 2018

Эта функция демонстрирует, как вы можете обновить статус ответа до 200 и сгенерировать статическое содержимое тела для возврата зрителю в следующем сценарии:

Функция активируется в исходном ответе

Статус ответас исходного сервера код ошибки (4xx или 5xx)

 'use strict';

    exports.handler = (event, context, callback) => {
        const response = event.Records[0].cf.response;

        /**
         * This function updates the response status to 200 and generates static
         * body content to return to the viewer in the following scenario:
         * 1. The function is triggered in an origin response
         * 2. The response status from the origin server is an error status code (4xx or 5xx)
         */

        if (response.status >= 400 && response.status <= 599) {
            response.status = 200;
            response.statusDescription = 'OK';
            response.body = 'Body generation example';
        }

        callback(null, response);
    };
...