提问者:小点点

如何从Lambda函数访问S3对象?


我正在尝试访问存储在AWS3桶中的文本文件。目前,它只包含“测试”一词。

起初,我以为我的fs.readfile有问题,但现在我发现问题更根本。我根本无法访问该文件。node.js的AWS似乎根本无法看到该文件。

我正在使用以下Lambda函数:

const aws = require('aws-sdk');
const s3 = new aws.S3; //({ apiVersion: '2006-03-01' });

    exports.handler = async (event, context) => { 
    // Get the object from the event and show its content type
    const bucket = 's3://'+ event.Records[0].s3.bucket.name;
    const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
    console.log('Bucket = ' + bucket);
    console.log('key = ' + key);

    var params = {Bucket: bucket, Key: key};
    console.log('Checking file existence');
    console.log(params);
    s3.getObject(params, function(err, data) {
        console.log('S3.getObject called');
        console.log('err = ' + err);
        if (err) console.log(err, err.stack); // an error occurred
        else     console.log(data);           // successful response
    });
};

测试床函数包含以下代码:

{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventSource": "aws:s3",
      "awsRegion": "us-east-1",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "responseElements": {
        "x-amz-request-id": "EXAMPLE123456789",
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "testConfigRule",
        "bucket": {
          "name": "wgtiplists",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          },
          "arn": "arn:aws:s3:::wgtiplists"
        },
        "object": {
          "key": "tiplist.txt",
          "size": 1024,
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901"
        }
      }
    }
  ]
}

结果如下所示(我删除了时间戳和请求ID文本):

INFO    Bucket = s3://wgtiplists
INFO    key = tiplist.txt
INFO    Checking file existence
INFO    { Bucket: 's3://wgtiplists', Key: 'tiplist.txt' }

由此,我得出结论,没有调用S3函数,尽管我可能弄错了。

我做错了什么?


共1个答案

匿名用户

我相信你需要在这里加上括号:

const s3 = new aws.S3();

您不应该将s3:/添加到bucket名称中,只需执行以下操作:

const bucket = event.Records[0].s3.bucket.name;