【问题标题】:Stream file from S3 in lambda does not work来自 lambda 中的 S3 的流文件不起作用
【发布时间】:2017-07-04 17:52:16
【问题描述】:

我想从 S3 加载具有行分隔值的文件并将其推送到数组中。

以下代码可以在我的本地机器上运行,但不能作为 lambda 函数执行。 lambda 函数超时(即使我将超时时间增加到 15 秒)。 SDK的不同吗?我在这里错过了什么,因为除了超时之外我没有收到任何错误消息?

Lambda 环境:节点 6.10 访问 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"
}

感谢您的帮助!

【问题讨论】:

  • lambda 函数需要事件来触发脚本。您在什么事件上触发脚本?
  • 当然,我现在通过控制台的“测试”按钮手动执行 lambda。执行开始了,但看起来没有任何事件被命中......所以 callback() 永远不会被调用并且 lambda 超时。

标签: javascript node.js amazon-s3 lambda aws-lambda


【解决方案1】:

调用 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 函数触发时被调用。确保您必须在 lambda 函数配置中定义处理程序名称 (filename.handler)。

如果您在 s3 文件上传时触发此代码,它将读取上传的 s3 文件。您更改存储桶和密钥名称以读取任何文件(存在)。 按照文档http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html

【讨论】:

  • 感谢您的回复。如上所述,lambda 被执行。我可以通过 AWS 控制台运行它。事件永远不会受到影响。 =/ ..(编辑了帖子,sry)
  • 更改存储桶和键名,因为如果未通过 s3 put 或 post 触发 lambda 函数,export.handler 将不会传递值。而是使用固定值。
  • 使用 const params = { Bucket: 'mybucket', Key: 'file.txt' } 并确保 lambda 函数具有读取 s3 存储桶的权限。
  • 是的,正如你在我的帖子中看到的那样,我做了。我也发布了权限,我错过了一些吗?
  • 你在使用任何节点模块吗?如果你是,那么你需要压缩所有依赖的代码,然后上传
【解决方案2】:

此代码按预期工作 感谢@anand 验证它。 该问题与 VPC 设置有关。 不幸的是,一个好的正确错误消息会有所帮助。但最终吸取了教训。 如果您在 VPC 上运行并且您的 lambda 代码应该可以运行,但您遇到了超时,最好检查您的安全和网络设置 =)

【讨论】:

  • 您能否提供更多关于网络/安全设置出了什么问题的信息?我假设 S3 设置为不可公开访问,但很好奇您为使您的东西正常工作所做的更新。
猜你喜欢
  • 2021-05-20
  • 2021-12-05
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多