微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AWS Cloudfront Lambda@Edge Origin 请求触发时间长于函数显示

如何解决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

所以我想知道这是我的代码有问题还是在从 cloudfront 请求到 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,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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。