代码之家  ›  专栏  ›  技术社区  ›  silverfighter

lambda中来自S3的流文件不工作

  •  0
  • silverfighter  · 技术社区  · 9 年前

    我想从S3加载一个具有行分隔值的文件,并将其放入数组中。

    SDK不同吗?由于在超时之外没有收到任何错误消息,我在这里错过了什么?

    访问S3的权限设置如下

    "Statement": [{
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::mybucket",
        "arn:aws:s3:::mybucket/*"
      ]
    }]
    

    代码如下所示

    var AWS = require('aws-sdk');
    var s3 = new AWS.S3({region:'eu-central-1'});
    
    exports.index = function(event, context, callback){
      var params = {
      Bucket: 'mybucket',
      Key: 'file.txt'
    }
    
    urls=[];
    
    var stream = s3.getObject(params);
    
    stream.on('httpError',function(err){
      console.log(err);
      throw err;
    });
    
    stream.on('httpData', function(chunk) {
      urls.push(chunk.toString());
    });
    
    stream.on('httpDone', function() {
      urls2 = urls.join('\n\r');
      callback(urls2);
    });
    
    stream.send();
    
    }
    

    通过AWS控制台执行lambda时出现以下错误

    {
      "errorMessage": "2017-07-04T18:25:20.271Z 19ab7138-60e6-11e7-9e1e-c318d929bc39 Task timed out after 15.00 seconds"
    }
    

    谢谢你的帮助!

    2 回复  |  直到 9 年前
        1
  •  0
  •   anand    9 年前

    调用lambda函数需要处理程序。此外,您需要在lambda函数配置中提及处理程序名称。

    exports.handler = (event, context, callback) => {
      const bucket = event.Records[0].s3.bucket.name;
      const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
      const params = {
        Bucket: bucket,
        Key: key,
      };
      var stream = s3.getObject(params);
      ....
      stream.send();
    }
    

    eports.handler 在lambda函数触发时调用。确保必须定义处理程序名称( filename.handler )在lambda函数配置中。

    如果在s3文件上传时触发此代码,它将读取上传的s3文件。您可以更换铲斗&用于读取任何文件(存在)的密钥名。 遵循文档 http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html

        2
  •  0
  •   silverfighter    9 年前

    这个问题与专有网络设置有关。

    推荐文章