【问题标题】:Node.js Lambda Function Not Working When Downloading S3 File下载 S3 文件时 Node.js Lambda 函数不起作用
【发布时间】:2015-10-05 04:06:15
【问题描述】:

我正在尝试按照 AWS Lambda 示例下载 S3 文件并处理结果,但我的结果中不断收到以下错误消息:

Process exited before completing request

我的代码如下:

'use strict';

var async = require('async');
var AWS = require('aws-sdk');

AWS.config.region = 'us-west-2';
var s3 = new AWS.S3();

console.log('Loading event');

exports.handler = function(event, context) {
    console.log('Getting values from event.');
    var tenant = event.tenant;
    var key = event.key

    async.waterfall([
        function download(next) {
            console.log('Creating request.');
            var keyFile = "secret";
            var sourceBucket = "mybucket";
            console.log('Retrieving secret key using bucket ' + sourceBucket + ' and keyfile ' + keyFile);
            var params = {Bucket: sourceBucket, Key: key};
            s3.getObject(params, next);
        },
        function returnFile(response, next) {
            console.log('Executing returnFile.');
            // Do return stuff here.
            console.log(response);
        }, function (err) {
            if (err) {
                console.error('Error: ' + err);
            } else {
                console.log('Successfully completed.');
            }
            context.done();
        }
    ]);
}

以及返回的日志文件:

START RequestId: 15327019-2b3b-11e5-a94b-e72d67a1fe04
2015-07-15T21:47:26.627Z    15327019-2b3b-11e5-a94b-e72d67a1fe04    Getting values from event.
2015-07-15T21:47:26.628Z    15327019-2b3b-11e5-a94b-e72d67a1fe04    Creating request.
2015-07-15T21:47:26.628Z    15327019-2b3b-11e5-a94b-e72d67a1fe04    Retrieving secret key using bucket mybucket and keyfile secret
END RequestId: 15327019-2b3b-11e5-a94b-e72d67a1fe04
REPORT RequestId: 15327019-2b3b-11e5-a94b-e72d67a1fe04  Duration: 921.08 ms Billed Duration: 1000 ms    Memory Size: 128 MB Max Memory Used: 14 MB  
Process exited before completing request

我对如何进一步解决此问题感到有些困惑。任何帮助或指点将不胜感激!

编辑

好的,感谢您的回复。我错误地使用了异步瀑布方法。我没有正确调用回调,也没有正确指定瀑布方法的回调。如果有人遇到类似问题,以下是工作代码:

'use strict';

var waterfall = require('async-waterfall');
var AWS = require('aws-sdk');

AWS.config.region = 'us-west-2';
var s3 = new AWS.S3();

var keyFile = "secret";
var sourceBucket = "mybucket";

exports.handler = function(event, context) {
    console.log('Loading event');
    console.log('Getting values from event.');
    var fileType = event.fileType;
    var key = event.key;
    console.log('fileType: "' + fileType + '", key: "' + key + '"');

    waterfall([
        function downloadSecret(next) {
            console.log('Retrieving secret key using bucket "' + sourceBucket + '" and keyfile "' + keyFile + '"');
            var params = {Bucket: sourceBucket, Key: keyFile};
            s3.getObject(params, next);
        },
        function extractKey(response, next) {
            console.log('Executing checkKey.');
            var secretKey = response.Body.toString('utf-8').trim();

            console.log('key: "' + key + '", secretKey: "' + secretKey + '"');
            if (key!=secretKey) {
                context.fail("Invalid key specified.");
            } else {
                next();
            }
        },
        function getFile(next) {
            console.log('Executing getFile.');
            var file;
            if (fileType == "1") {
                file = "file1";
            } else {
                file = "file2";
            }
            console.log('file: "' + file + '"');
            var params = {Bucket: sourceBucket, Key: file};
            s3.getObject(params, next);
        },
        function returnFile(response) {
            console.log('Executing returnFile.');
            var output = JSON.stringify(response);
            console.log(output);
            context.succeed(response.Body.toString('utf-8').trim());
        }
    ]);
}

【问题讨论】:

  • 您的代码是否有可能无法处理导致 Lambda 函数在调用 context.done/fail/succeed 之前退出的异常?也许您可以尝试 Amazon 提供的 s3-get-object 蓝图并从那里构建。
  • 所以,问题在于 a) 我的回调处理程序语法设置不正确,b) 您必须在每个瀑布函数中显式调用下一个回调方法。

标签: node.js amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

我很确定您错误地使用了 async 库。 returnFile 函数回调参数似乎不正确。

此外,请确保您的 Lambda 具有访问通过其 IAM Policy 授予的存储桶的适当权限。然后您无需向AWS SDK 提供您的访问凭据,它会自动提取它们。

【讨论】:

  • 是的。这绝对是问题所在。我有一些与库不相符的基本语法错误和用法。
猜你喜欢
  • 2021-06-09
  • 2016-12-22
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 2019-03-01
  • 2017-05-25
  • 2020-06-22
  • 2019-01-19
相关资源
最近更新 更多