AWS Lambda 使用 s3 getObject 函数没有任何反应
AWS Lambda using s3 getObject function nothing happening
这是使用内联编辑器的 node.js 代码:
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
console.log('Loading function');
exports.handler = async (event) => {
// TODO implement
var responseMsg = '';
var bucket = '';
var key = '';
if ('Records' in event) {
var s3Data = event.Records[0].s3;
console.log('s3Data: ' + JSON.stringify(s3Data));
bucket = s3Data.bucket.name;
key = s3Data.object.key;
}
console.log('Bucket:' + bucket);
console.log('Key:' + key);
var params = {
Bucket: bucket,
Key: key
};
console.log('Params:' + JSON.stringify(params));
s3.getObject(params, function (err, data) {
console.log('getObject');
if (err) {
console.log(err, err.stack);
return err;
}
responseMsg = data;
});
const response = {
statusCode: 200,
body: JSON.stringify(responseMsg),
};
return response;
};
我知道我正在测试的密钥和存储桶存在于我的 S3 控制台中。我知道我可以在 LINQPad 中使用 C# 访问它们。
当我 运行 这样做时,我没有收到任何错误。我在响应正文中得到一个空字符串,而不是对象的内容。我也没有从 s3.getObject.
中收到任何日志消息
对s3.getObject
的调用是异步调用。当 s3
代码为 运行 时,代码将继续执行。您需要明确 await
才能解决调用的承诺。
这就是您要执行的操作(请注意 s3.getObject
调用中的更改):
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.handler = async (event) => {
var params = {
Bucket: <bucket>,
Key: <key>,
};
const data = await s3.getObject(params).promise();
const response = {
statusCode: 200,
body: JSON.stringify(data),
};
return response;
};
您可以使用 try/catch
块进行错误处理。
这里要理解的重要一点是执行的时间。调用 lambda 时,函数中的主线代码将按顺序调用。当来自 S3 的响应到达时,您传递给 s3.getObject
调用的回调函数将在您的 lambda 完成执行很久之后被调用。
您的 return
调用在回调 运行 之前执行,因此您会看到 JSON.strigify(responseMsg)
的结果,其中 responseMsg
保存您给它的初始值,这是空字符串 ''
.
这是使用内联编辑器的 node.js 代码:
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
console.log('Loading function');
exports.handler = async (event) => {
// TODO implement
var responseMsg = '';
var bucket = '';
var key = '';
if ('Records' in event) {
var s3Data = event.Records[0].s3;
console.log('s3Data: ' + JSON.stringify(s3Data));
bucket = s3Data.bucket.name;
key = s3Data.object.key;
}
console.log('Bucket:' + bucket);
console.log('Key:' + key);
var params = {
Bucket: bucket,
Key: key
};
console.log('Params:' + JSON.stringify(params));
s3.getObject(params, function (err, data) {
console.log('getObject');
if (err) {
console.log(err, err.stack);
return err;
}
responseMsg = data;
});
const response = {
statusCode: 200,
body: JSON.stringify(responseMsg),
};
return response;
};
我知道我正在测试的密钥和存储桶存在于我的 S3 控制台中。我知道我可以在 LINQPad 中使用 C# 访问它们。
当我 运行 这样做时,我没有收到任何错误。我在响应正文中得到一个空字符串,而不是对象的内容。我也没有从 s3.getObject.
中收到任何日志消息对s3.getObject
的调用是异步调用。当 s3
代码为 运行 时,代码将继续执行。您需要明确 await
才能解决调用的承诺。
这就是您要执行的操作(请注意 s3.getObject
调用中的更改):
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.handler = async (event) => {
var params = {
Bucket: <bucket>,
Key: <key>,
};
const data = await s3.getObject(params).promise();
const response = {
statusCode: 200,
body: JSON.stringify(data),
};
return response;
};
您可以使用 try/catch
块进行错误处理。
这里要理解的重要一点是执行的时间。调用 lambda 时,函数中的主线代码将按顺序调用。当来自 S3 的响应到达时,您传递给 s3.getObject
调用的回调函数将在您的 lambda 完成执行很久之后被调用。
您的 return
调用在回调 运行 之前执行,因此您会看到 JSON.strigify(responseMsg)
的结果,其中 responseMsg
保存您给它的初始值,这是空字符串 ''
.