AWS S3"/>
无法登录 AWS S3
我使用无服务器框架和自定义设计的记录器将处理程序部署到 AWS Lambda 函数,该记录器将每次执行的数据记录到唯一的 AWS S3 对象。当我尝试从 HTTP 客户端调用此函数的端点时,它在第一次执行时按预期工作,但将 null 作为后续执行的输出。只有在很长的差距之后,它才再次给出预期的输出。我认为问题出在自定义记录器上,因为如果我从代码中删除记录器,我不会遇到任何问题,所以我在这里附加了 Logger 类的代码
const AWS = require('aws-sdk');
var os = require("os");
var stream = require("stream");
AWS.config.update({accessKeyId: process.env.ACCESS_KEY, secretAccessKey: process.env.SECRET_ACCESS_KEY, region: 'ap-south-1'});
const s3 = new AWS.S3();
const BUCKET = process.env.S3_BUCKET;
var s3Stream = require('s3-upload-stream')(new AWS.S3())
class Logger{
constructor(id){
var date = new Date().toLocaleString('en-US', {timeZone: 'Asia/Kolkata'});
var currentDate = new Date(date);
var month = currentDate.getMonth() + 1;
var date = currentDate.getDate()
this.file = currentDate.getFullYear().toString() + ((month.toString().length < 2) ? ('0' + month) : ('' + month)) + ((date.toString().length < 2) ? ('0' + date) : ('' + date)) + "-" + id;
console.log("FILE: "+this.file)
this.bucket = BUCKET;
this.prefix = "logs/";
this.stream = new stream.PassThrough();
this.id = id;
this.logContent = "";
}
streamLog(type,component,data){
var date = new Date();
var millis = date.getTime();
this.stream.write(millis.toString() + " - " + this.id + " - [" + type + "]" + " - (" + component + "): " + data + os.EOL);
this.logContent = this.logContent + millis.toString() + " - " + this.id + " - [" + type + "]" + " - (" + component + "): " + data + os.EOL;
}
uploadLogToS3(){
this.stream.end();
var upload = s3Stream.upload({
"Bucket": BUCKET,
"Key": this.prefix + this.file + ".log"
});
return new Promise((resolve,reject) => {
console.log("ENTERED PROMISE");
upload.on('error',function(error){
console.log("ERROR STREAMING LOG TO S3: " + error);
reject(0);
})
upload.on('uploaded',function(details){
console.log("log successfully streamed to S3");
resolve(1);
})
upload.on('part',function(details){
console.log("UPLOADING LOG TO S3");
})
this.stream.pipe(upload);
})
}
async finish(){
try {
console.log("ENTERED LOGGER FINISH");
await this.uploadLogToS3();
} catch (error) {
console.log("WRITING THE LOG STREAM TO CONSOLE");
console.log(this.logContent);
}
}
}
下面是handler的代码
module.exports.server = async function(event,context){
console.log("ENTERED HANDLER");
const MODULE_DESCRIPTION = "CONTROLLER GET BIRTHDAYS METHOD";
var birthDays;
var date = new Date().toLocaleString('en-US', {timeZone: 'Asia/Kolkata'});
var currentDate = new Date(date);
try {
console.log("ENTERED TRY OF CONTROLLER GET BIRTHDAYS");
[birthDays] = await Promise.all([API_LIB.getBirthDays(parseInt(currentDate.getDate()), parseInt(currentDate.getMonth() + 1),LOGGER)]);
if (birthDays.length == 1){
if (birthDays[0].hasOwnProperty("error")){
LOGGER.streamLog("ERROR",MODULE_DESCRIPTION, birthDays[0].error || "ERROR with API call");
await LOGGER.finish();
return {status: 501,body: {error: 1,message: birthDays[0].error || "Internal server error"}}
} else{
LOGGER.streamLog("INFO",MODULE_DESCRIPTION,birthDays.toString());
await LOGGER.finish();
return {status: 200,body: birthDays}
}
} else{
LOGGER.streamLog("INFO",MODULE_DESCRIPTION,birthDays.toString());
await LOGGER.finish();
return {status: 200,body: birthDays}
}
} catch (error) {
LOGGER.streamLog("ERROR",MODULE_DESCRIPTION,error || "Internal server error");
await LOGGER.finish();
return {status: 501,body: {error: 1,message: error || "Internal server error"}}
}
}
我在整个代码中使用 Logger.streamLog() 将日志写入 Logger。请帮我找出这个记录器的问题 谢谢
回答如下:我没有看到您的处理程序代码,只是一个
Logger
类。您没有展示您实际如何使用 Logger
课程。没有看到完整的 Lambda 函数代码,我只能猜测这个问题。
但是,根据您的描述,听起来您只初始化了一次
Logger
类,因此它正确地处理了第一次(冷)Lambda 函数执行,但在随后的(热)执行中,记录器没有重新初始化,因此它工作不正常。
然后,一段时间后,您的函数运行容器变得陈旧并终止,因此下次调用它时,您将进行另一次冷执行,这会导致它再次运行一次。
我建议阅读 Lambda 函数容器重用 的工作原理。
如果您需要更多帮助,请编辑您的原始问题以包括处理函数和任何使用
Logger
类的代码。
更多推荐
无法登录 AWS S3
发布评论