node.js - 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()
解决方案
推荐阅读
- php - 提交表单时文件输入抛出错误
- python - 从 .rtf 文件导入数据时使用 int() 出错
- c# - 如何在 DataGrid 的单元格上应用数据模板
- sql - SQL将字符串列表/varchar的参数值更改为整数列表
- markdown - 如何使用 Pandoc 启用 Markdown 内联代码的语法突出显示?
- r - 在 mutate 中使用匿名函数
- angular - Uncaught (in promise): TypeError: component.canDeactivate is not a function
- java - 如何在某些代码执行之间禁用 GC 或获取 GC 暂停时间?
- javascript - d3.stack() 类型错误:无法读取未定义的属性“”
- swift - 我想在 dequeueReusableCell 中获取 firestore 数据