LAMBDA中的S3创建对象触发器没有拉入S3数据



问题

我正在尝试使用Lambda(NODEJS(从S3 Bucket加载数据。我研究了这里发布类似问题的各种主题,并试图结合阅读其中许多主题的数据(这里和这里以及更多(。

设置为S3(创建事件(>SNS>SQS>λ。从S3一直到LAMBDA的调用都运行得很好。下面的代码和下面的Cloudwatch日志表明S3中的每个PUT事件都成功调用了lambda。我已将IAM角色配置为读取LAMBDA的SQS和S3我没有在S3桶或对象上使用SSE

但不管我采用了什么方法(两者都在下面的代码中(->Lambda不输出以控制台CSV文件的内容->您可以看到,在代码试图读取S3数据的地方,没有输出最终的控制台日志。多年来,S3 API调用中是否有其他需要更新的内容发生了变化?

代码

const readline = require('readline');
const AWS = require("aws-sdk");
const s3 = new AWS.S3({apiVersion: '2006-03-01'});
exports.handler = async (event) => {
console.log('###### Received event:', JSON.stringify(event, null, 2));
for (const record of event.Records) {
try {
const body = JSON.parse((record.body));
// console.log(`###### Record BODY ${JSON.stringify(body, null, 2)}`);
const message = JSON.parse(body.Message);
//console.log(`##### Record BODY MESSAGE ${JSON.stringify(message, null, 2)}`);
const bucket = message.Records[0].s3.bucket.name;
const key = message.Records[0].s3.object.key;
console.log(`###### Record BODY bucket ${bucket}`);
console.log(`###### Record BODY key ${key}`);

const params = {
Bucket: bucket, Key: key
};

console.log(`###### THE PARAMS ${JSON.stringify(params, null, 2)}`);
s3.getObject(params , function (err, data) {
if (err) {
console.log(`###### ERR ${err}`);
throw err;
} else {
console.log(`###### ${data.Body.toString()}`);
}

})            
const rl = readline.createInterface({
input: s3.getObject(params).createReadStream()
});

rl.on('line', function(line) {
console.log(`####### RECORD DATA LINE ${line}`);
})
.on('close', function() {
console.log(`####### RECORD DATA CLOSED!!!!!`);
});
} catch (e ) {
console.log(`###### Error ${JSON.stringify(e, null, 2)}`);
}
}
return `Successfully processed ${event.Records.length} messages.`;
};

IAM角色

为了简洁起见,我删除了工作正常的SQS特定细节。我已经给出了S3的所有访问权限,但为了简洁起见,这里再次列出了getObject。

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
..
"s3:GetObject",
..
],
"Resource": "arn:aws:s3:::my-REDACTED-bucket"
}
]
}

CLOUDWATCH日志

2022-08-31T12:00:07.897Z    0191e48d-f3ac-5af8-9334-bf04bcd815d8    INFO    ###### Record BODY bucket my-REDACTED-bucket
2022-08-31T12:00:07.897Z    0191e48d-f3ac-5af8-9334-bf04bcd815d8    INFO    ###### Record BODY key test.csv
2022-08-31T12:00:07.897Z    0191e48d-f3ac-5af8-9334-bf04bcd815d8    INFO    THE PARAMS 
{
"Bucket": "my-REDACTED-bucket",
"Key": "test.csv"
}
END RequestId: 0191e48d-f3ac-5af8-9334-bf04bcd815d8

基本问题在于异步代码。您的代码将在发生任何事情之前退出。您需要修改代码以等待异步结果。

用途:

const data = await s3.getObject(params).promise();

如果您更喜欢使用流式读取线方法,请参阅以下答案。

最新更新