最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

无法登录 AWS S3

网站源码admin46浏览0评论

无法登录 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
类的代码。

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论