从 AWS Lambda 上的文件系统读取 PNG 文件时出错

An error occured to read the PNG file from file system on AWS Lambda

我正在使用 AWS Lambda 并将从 Lambda 函数读取一些文件。

可以读取文本文件,即使无法读取 png 文件。好像有点奇怪。 AWS lambda 是否无法读取 PNG 文件?

我做了以下过程:

  1. 为了上传到AWS Lambda,正在归档一个项目。

    $ ls -1
    index.js
    test.png
    test.txt
    
    
    $ cat index.js
    exports.handler = function(event, context) {
      var fs = require('fs');
    
      var path = __dirname + '/test.txt';
    
      fs.readFile(path, function(err, buffer) {
          console.log('err = ' + err);
          console.log(buffer.length);
          context.done();
      });
    }
    
    $ zip -r lambda.zip .
      adding: index.js (deflated 35%)
      adding: test.png (deflated 1%)
      adding: test.txt (stored 0%)
    
  2. 将存档文件上传到 AWS Lambda 并调用函数。

  3. 调用结果成功

    START RequestId: 2997ce37-2628-11e5-9e15-456a1ab0c0d0
    2015-07-09T10:49:24.660Z    2997ce37-2628-11e5-9e15-456a1ab0c0d0    err = null
    2015-07-09T10:49:24.661Z    2997ce37-2628-11e5-9e15-456a1ab0c0d0    5
    END RequestId: 2997ce37-2628-11e5-9e15-456a1ab0c0d0
    REPORT RequestId: 2997ce37-2628-11e5-9e15-456a1ab0c0d0  Duration: 123.68 ms Billed Duration: 200 ms     Memory Size: 128 MB Max Memory Used: 9 MB   
    
  4. Cnahge 读取文件从 test.txt 到 test.png。

  5. 将存档文件上传到 AWS Lambda 并调用函数。

  6. 调用失败

    START RequestId: d9d5b6ff-2627-11e5-92ff-85a0d38392ee
    2015-07-09T10:47:10.689Z    d9d5b6ff-2627-11e5-92ff-85a0d38392ee    err = Error: EACCES, open '/var/task/resource/test.png'
    END RequestId: d9d5b6ff-2627-11e5-92ff-85a0d38392ee
    REPORT RequestId: d9d5b6ff-2627-11e5-92ff-85a0d38392ee  Duration: 214.73 ms Billed Duration: 300 ms     Memory Size: 128 MB Max Memory Used: 10 MB  
    Process exited before completing request
    

我认为文件权限有问题。 尝试 ls -l

AWS Lambda 使用v0.10.36,确实可以在本地测试。 例如,创建一个 test.js,如下所示:

var handler = require('.').handler;
var ctx = {
  done: function () {
    console.log('Done');
  }
};
handler('', ctx);

对于这种情况,您可以简单地使用 test.js,如下所示:

  var fs = require('fs');

  var path = __dirname + '/test.png';

  fs.readFile(path, function(err, buffer) {
      console.log('err = ' + err);
      console.log(buffer.length);
      context.done();
  });