您如何写入 aws lambda 实例的文件系统?

Posted

技术标签:

【中文标题】您如何写入 aws lambda 实例的文件系统?【英文标题】:How do you write to the file system of an aws lambda instance? 【发布时间】:2016-05-02 14:31:05 【问题描述】:

我没有成功尝试写入 aws lambda 实例的文件系统。 The docs say 标准 lambda 实例在 /tmp/ 有 512mb 的可用空间。但是,在我的本地机器上运行的以下代码在 lambda 实例上根本不起作用:

  var fs = require('fs');
  fs.writeFile("/tmp/test.txt", "testing", function(err) 
      if(err) 
          return console.log(err);
      
      console.log("The file was saved!");
  );

匿名回调函数中的代码永远不会在 lambda 实例上被调用。有人在这方面取得过成功吗?非常感谢您的帮助。

这可能是一个相关的question。 s3代码和我试图用fs回调函数做的事情之间是否可能存在某种冲突?下面的代码是当前正在运行的代码。

console.log('Loading function');

var aws = require('aws-sdk');
var s3 = new aws.S3( apiVersion: '2006-03-01' );
var fs = require('fs');

exports.handler = function(event, context) 
    //console.log('Received event:', JSON.stringify(event, null, 2));

    // Get the object from the event and show its content type
    var bucket = event.Records[0].s3.bucket.name;
    var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
    var params = 
        Bucket: bucket,
        Key: key
    ;
    s3.getObject(params, function(err, data) 
        if (err) 
            console.log(err);
            var message = "Error getting object " + key + " from bucket " + bucket +
            ". Make sure they exist and your bucket is in the same region as this function.";
            console.log(message);
            context.fail(message);
         else 

            //console.log("DATA: " + data.Body.toString());
            fs.writeFile("/tmp/test.csv", "testing", function (err) 

                if(err) 
                    context.failed("writeToTmp Failed " + err);
                 else 
                    context.succeed("writeFile succeeded");
                
            );
        
    );
;

【问题讨论】:

我对 aws-lambda 的理解是代码运行是为了响应一些 event - event 那段代码是否“响应”甚至被触发? @JaromandaX 是的,这是正确的。事件被成功触发。这是一组更大的代码的一部分,它试图编写从 S3 获取的 CSV 文件,然后将其转换为 Json 并再次将其上传到另一个 s3 存储桶,以便可以通过另一个 lambda 实例将其摄取到 dynamoDB 中。一切正常,但这件作品...... 您正在使用console.log - console.log 输出以某种方式可供您使用(我不使用 aws-lambda,这就是我问的原因) - 如果是这样,控制台是否可用。在执行 fs.writeFile 之前记录日志? 只是出于好奇,为什么要在 lambda 上写入文件系统?感觉有点不像 lambda-ish...愿意分享用例吗? 我认为这个问题很相关;在某些情况下,需要写入文件系统(而不是在内存中)。我认为解决发布的具体问题很有用。 【参考方案1】:

将您的代码修改为 Lambda 模板对我有用。我认为您需要为exports.handler 分配一个函数并调用适当的context.succeed()context.fail() 方法。否则,您只会得到一般性错误。

var fs = require("fs");

exports.handler = function(event, context) 
    fs.writeFile("/tmp/test.txt", "testing", function (err) 
        if (err) 
            context.fail("writeFile failed: " + err);
         else 
            context.succeed("writeFile succeeded");
        
    );
;

【讨论】:

感谢您的建议。我已经修改了我的代码并包含了更多上下文,但我的回调函数仍然没有被调用。我怀疑 s3.getObject 函数和我正在尝试做的事情之间存在某种冲突。我在这里看到了你的回答***.com/questions/30927172/…,想知道它是否与我的问题无关。【参考方案2】:

所以答案在于context.fail()context.succeed() 函数。作为 aws 和 lambda 世界的新手,我不知道调用这些方法中的任何一个 stops execution of the lambda instance。

根据文档:

context.succeed() 方法表示成功执行并返回 一个字符串。

通过消除这些并仅在我运行了我想要的所有代码后调用它们,一切都运行良好。

【讨论】:

能否粘贴您成功的代码?我遇到了同样的问题,并且无法在我的 Lambda 中编写 html 文件,然后我想将其放入 S3 存储桶中。 只是不要保存它。直接从内存中转发给 putObject 方法。 @Pavelloz - 是否有代码示例可以做到这一点? 嗯,我不知道。当我不得不将大文件解压缩到 S3 存储桶中而不会耗尽内存时,我自己编写了它。事实证明,流在这方面更有效。这是我的代码库中的一个 sn-p(我从中删除了一些代码,因此它不会开箱即用,但据我所知,转发流是完整的),希望你能理解这一点:gist.github.com/pavelloz/91b2d140134635b3c9ad8aaa85549ff7【参考方案3】:

我遇到了这个问题,似乎 AWS Lambda 可能使用的是旧版本(或修改后的)fs。我通过记录来自fs.writeFile 的响应发现了这一点,并注意到这不是一个承诺。

为了解决这个问题,我将调用包装在一个承诺中:

var promise = new Promise(function(resolve, reject) 
    fs.writeFile('/tmp/test.txt', 'testing', function (err) 
        if (err) 
            reject(err);
         else 
            resolve();
        
    );
);

希望这对其他人有所帮助 :hug-emoji:

【讨论】:

以上是关于您如何写入 aws lambda 实例的文件系统?的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda 函数写入 S3

我如何使用 aws lambda 将文件写入 s3 (python)?

使用 python 写入 aws lambda 中的 /tmp 目录

AWS Lambda Task在3.00秒后超时

AWS Lambda Python 读取所有行但不写入所有行

使用 Learner Lab - 使用 AWS Lambda 将图片写入 S3