首页 > 解决方案 > AWS Cloudfront Lambda@Edge Origin 请求触发时间长于函数显示

问题描述

我开始使用 AWS Lambda@Edge 并对原始请求进行了一些更改,所以我编写了这个函数。它将从 S3 获取缓存的数据,然后检查请求标头以显示带有水印的文件(sr 代表我糟糕的 JS 技能)

但问题是当我记录此函数处理时间(t2 - t1)时。它显示这个函数只需要 2000 毫秒,我也可以在 logtime 中看到它。但是函数持续时间总是更长导致更长的文件服务

2021-07-28T15:47:14.947Z    cde35bb2-be90-4312-a753-afabb6f419db    INFO    it take more  1252
END RequestId: cde35bb2-be90-4312-a753-afabb6f419db
REPORT RequestId: cde35bb2-be90-4312-a753-afabb6f419db  Duration: 4856.86 ms

所以我想知道这是我的代码问题还是从云端请求到 s3 源时的延迟?Tks

'use strict';

const aws = require('aws-sdk');
const https = require('https');

const s3 = new aws.S3({
  region: 'us-east-1', httpOptions: {
    agent: new https.Agent({
      keepAlive: true,
    }),
  }, useAccelerateEndpoint: true
});


const TTL = 3600

let cachedShopStatus = undefined;


async function fetchShopFromDynamoDB() {
  console.log("getingggggggggggggggggggg")

  let params = { Bucket: "gptempo", Key: "shop_status.json" };

  let json = {}
  await (new Promise((resolve, reject) => {
    s3.getObject(params, function (err, data) {
      if (err) {
        console.error(err.code, "-", err.message);
      } else {
        console.log("hehehehehe");
        var fileContents = data.Body.toString();
        json = JSON.parse(fileContents);
        console.log("done");
        // return json
        resolve(void(0));
      }
    });
  }))
  return json
}

async function fetchShopStatus() {
  if (!cachedShopStatus) {
    console.log("need to feed new ")
    cachedShopStatus = await fetchShopFromDynamoDB();
    // console.log(cachedShopStatus)
    setTimeout(() => {
      cachedShopStatus = undefined;
    }, TTL);
  }

  return cachedShopStatus;
}


// const querystring = require('querystring');

function extractHostname(url) {
    var hostname;
    //find & remove protocol (http, ftp, etc.) and get hostname

    if (url.indexOf("//") > -1) {
        hostname = url.split('/')[2];
    }
    else {
        hostname = url.split('/')[0];
    }

    //find & remove port number
    hostname = hostname.split(':')[0];
    //find & remove "?"
    hostname = hostname.split('?')[0];

    return hostname;
}

exports.handler = async (event, context, callback) => {
  let t1 = new Date
  console.log("start request edge")
  let shopStatus = await fetchShopStatus()
  console.log("done fetch shop status")
  // console.log(shopStatus)
  // console.log(JSON.stringify(event, null, 4));
  const request = event.Records[0].cf.request;

if (!( request.headers.referer && request.headers.referer[0] && request.headers.referer[0].value )) {
    callback(null, request);
    return
  }
  
  console.log("start watermark request")
  // console.log(JSON.stringify(event, null, 4));

  if ( request.headers.referer && request.headers.referer[0] && request.headers.referer[0].value ) {
    console.log(request.headers.referer[0])
    console.log(request.headers.referer[0].value)
    let shopifyDomain = extractHostname(request.headers.referer[0].value)
    console.log(shopifyDomain)
    console.log(shopStatus[shopifyDomain])
    if (shopStatus[shopifyDomain]) {
      if (shopStatus[shopifyDomain].plan > 0) {
        //ok
      } else {
        // not ok 
        let dateToCompare = new Date(shopStatus[shopifyDomain].end_trial_date)
        let today = new Date()
        console.log(dateToCompare)
        console.log(today)
        console.log(today > dateToCompare)
        if (today > dateToCompare) {
          console.log("here")
          request.uri = request.uri.replace(".js","_watermark.js")
          // let headerName = 'X-File'
          // request.headers[headerName.toLowerCase()] = [{ key: headerName, value: "watermark" }];
        }
      }
    } else {
    
    }
    
  }

  console.log(request.uri)
  console.log("done");
  callback(null, request);
  let t2 = new Date
  console.log("it take more ",t2 - t1)
}


// exports.handler()

标签: node.jsamazon-web-servicesaws-lambdaamazon-cloudfrontaws-lambda-edge

解决方案


推荐阅读