web-dev-qa-db-ja.com

AWSラムダインスタンスのファイルシステムにどのように書き込みますか?

AWSラムダインスタンスのファイルシステムへの書き込みに失敗しました。 ドキュメントによると 標準のラムダインスタンスには、/tmp/。ただし、ローカルマシンで実行される次のコードは、ラムダインスタンスではまったく機能しません。

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

匿名コールバック関数のコードは、ラムダインスタンスで呼び出されることはありません。誰もこれを成功させましたか?ご協力ありがとうございます。

これが関連する可能性があります 質問 。 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");
                }
            });
        }
    });
};
31
Rymnel

したがって、答えはcontext.fail()またはcontext.succeed()関数にあります。 AWSとラムダの世界ではまったく新しいので、これらのメソッドのいずれかを呼び出す ラムダインスタンスの実行を停止する という事実に無知でした。

ドキュメントによると:

Context.succeed()メソッドは、実行の成功を通知し、文字列を返します。

これらを削除し、必要なすべてのコードを実行した後にのみ呼び出すことで、すべてがうまく機能しました。

10
Rymnel

コードを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");
        }
    });
};
_
16
James