【发布时间】:2021-09-07 10:28:41
【问题描述】:
我使用 IAM 角色部署了一个 AWS Lambda 函数,该角色对 Lamba、S3 和 Cloudwatch 资源具有“完全访问权限”。它在大多数情况下都有效。
我在函数入口点index.js 中包含了一个npm 模块aws-sdk。我的目标是让函数在上传到存储桶后读取.json 文件的内容。我为 Lambda 函数创建了一个触发器,以便对存储桶的 S3 PUT 操作执行此操作。
这是我正在使用的代码,大部分来自another StackOverflow answer。当我部署时,一切似乎都正常——我可以获取上传到存储桶的 json 文件的名称,并将其打印到 Cloudwatch 上的日志中,而不会出现问题。问题是s3.getObject 方法似乎根本没有触发。我什至无法记录错误消息。
这是我正在使用的代码:
var AWS = require('aws-sdk');
var s3 = new AWS.S3();
exports.handler = async (event, context, callback) => {
console.log("Incoming Event: ", event);
var src_bucket = event.Records[0].s3.bucket.name;
var src_key = event.Records[0].s3.object.key;
const filename = decodeURIComponent(src_key.replace(/\+/g, ' '));
const message = `File is uploaded => ${src_bucket} -> ${filename}`;
console.log(message);
s3.getObject({
Bucket: src_bucket,
Key: src_key
}, function(err, data) {
console.log(`Read S3 JSON object`);
if (err) {
console.log(err, err.stack);
callback(err);
} else {
console.log("Raw text:\n" + data.Body.toString('ascii'));
callback(null, null);
}
});
};
我不确定如何进一步排除故障。我确实设置了 S3 存储桶权限,以明确让 IAM 角色对其进行读写。但这似乎并没有解决任何问题。为什么s3.getObject 方法中的函数不输出任何内容?例如,console.log(Read S3 JSON object); 行不会显示在 Cloudwatch 日志中,尽管该方法之外的 console.log 消息可以正常工作。我已确保node_modules 文件夹也已上传。如果 AWS 开发工具包模块未上传到 Lambda,日志不会报告错误吗?感谢任何有关故障排除的建议,以便我理解为什么我无法读取存储桶对象。
【问题讨论】:
-
您的 lambda 在 VPC 中吗?
-
不,不是,但@Marcin 的回答似乎解决了这个问题。
标签: node.js amazon-web-services amazon-s3 aws-lambda