2021年3月12日星期五

How do I access an S3 object from a Lambda function?

I am attempting to access a text file stored in an AWS S3 bucket. At present, it contains only the word "Test".

At first, I thought I was having problems with fs.readfile, but now I've discovered that the problem is more fundamental. I cannot access the file at all. AWS from Node.js does not appear to be able to see the file at all.

I am using the following Lambda function:

const aws = require('aws-sdk');  const s3 = new aws.S3({ apiVersion: '2006-03-01' });        exports.handler = async (event, context, callback) => {       // Get the object from the event and show its content type      const bucket = event.Records[0].s3.bucket.name;      const key = event.Records[0].s3.object.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);      console.log('Calling s3.getObject');      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              callback(err);          } else {              console.log(data);           // successful response              callback(null, null);          }          console.log('Leaving s3.getObject');      });  };  

The testbed function contains the following code:

{    "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"          }        }      }    ]  }  

And the results look like this (I've trimmed off the timestamp and Request ID texts):

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

From this, I conclude that the S3 function is not being called, although I might be mistaken.

What am I doing wrong?

https://stackoverflow.com/questions/66583876/how-do-i-access-an-s3-object-from-a-lambda-function March 11, 2021 at 09:49PM

没有评论:

发表评论