如何解决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 举报,一经查实,本站将立刻删除。