Ошибка проверки при замене тела в функции запроса источника Lambda @ Edge - PullRequest
1 голос
/ 08 мая 2019

У меня Cloudfront перед корзиной s3, которая обслуживает видео HLS.Я пытаюсь динамически изменить файлы манифеста, чтобы добавить токен аутентификации в сегменты внутри них.

Что я действительно хотел бы сделать, так это изменить тело, которое я отправляю обратно клиенту в функции ответа средства просмотра, но так как это невозможно, я пытаюсь использовать функцию запроса источника, чтобы вручную извлечь объект из S3, изменить его и вернуть запрос Cloudfront с новым телом.Я получаю сообщение об ошибке 503: «Ошибка проверки результата функции Lambda: тело не является строкой, не является объектом или превышает максимальный размер»

Мое тело имеет размер менее 8 КБ (1 МБ - это ограничение вдокументы).Насколько я могу судить, объект запроса облачного фронта, который я генерирую, выглядит хорошо, а данные base64 декодируются в соответствии с тем, что я хочу.Я также попытался использовать текст вместо base64.Я включил "включить тело" в Cloudfront.

const fs = require('fs');
const querystring = require('querystring');
const AWS = require('aws-sdk');
const S3 = new AWS.S3();

exports.handler = async (event) => {
  const cfrequest = event.Records[0].cf.request;
  const queryString = querystring.parse(event.Records[0].cf.request.querystring);
  const jwtToken = queryString.token;

  if (cfrequest.uri.match(/\.m3u8?$/mi)) {

    const s3Response = await (new Promise((resolve, reject) => {
      S3.getObject({
        Bucket: 'bucket',
        Key: cfrequest.uri.substring(1)
      }, (err, data) => {
        if (err) {
          reject(err)
        } else {
          resolve(data);
        }
      });
    }));

    const manifestFile = s3Response.Body.toString('utf8');
    const newManifest = manifestFile.replace(/^((\S+)\.(m3u8|ts|vtt))$/gmi, (_, url) => `${url}?token=${jwtToken}`);
    const base64NewManifest = Buffer.from(newManifest, 'utf8').toString('base64');

    const tokenizedCfRequest = {
     ...cfrequest,
      body: {
        action: 'replace',
        data: base64NewManifest,
        encoding: 'base64'
      }
    };

    return tokenizedCfRequest;
  }

  return cfrequest;
}

1 Ответ

1 голос
/ 08 мая 2019

Если вы хотите сгенерировать свой собственный ответ, вам нужно использовать запрос средства просмотра или исходный запрос событие и вернуть ответ, подобный этому:

exports.handler = async (event) => {
  const cfRequest = event.Records[0].cf.request;
  const queryString = querystring.parse(event.Records[0].cf.request.querystring);
  const jwtToken = queryString.token;

  if (cfrequest.uri.match(/\.m3u8?$/mi)) {

    // ... your code here ...

    const response = {
      status: 200, // only mandatory field
      body: base64NewManifest,
      bodyEncoding: 'base64',
    };
    return response;
  }

  // Return original request if no uri match
  return cfRequest;
}

См. Также Генерация HTTP-ответов в триггерах запросов .

...