当我替换Lambda @ Edge原点请求功能中的正文时发生验证错误

时间:2019-05-08 02:50:12

标签: amazon-web-services aws-lambda aws-lambda-edge

我在提供HLS视频的s3存储桶前面有Cloudfront。我正在尝试动态修改清单文件,以向其中的段添加身份验证令牌。

我真正想做的是在查看器响应函数中修改发送回客户端的主体,但是由于这不可能,因此我尝试使用起源请求函数从中手动获取对象S3,对其进行修改,然后返回带有新主体的Cloudfront请求。我收到“ Lambda函数结果验证失败:正文不是字符串,不是对象或超出最大大小”的503错误

我的身体小于8kb(文档中限制为1MB)。据我所知,我正在生成的cloudfront请求对象看起来不错,并且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 个答案:

答案 0 :(得分:1)

如果要生成自己的响应,则需要使用 viewer请求起源请求事件并返回如下响应:

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;
}

另请参阅Generating HTTP Responses in Request Triggers