node.js - 无法让 Lambda 函数读取 S3 对象内容
问题描述
我使用 IAM 角色部署了一个 AWS Lambda 函数,该角色对 Lamba、S3 和 Cloudwatch 资源具有“完全访问权限”。它在大多数情况下都有效。
我aws-sdk
在函数入口点中包含了一个 npm 模块index.js
。我的目标是让函数在.json
文件上传到存储桶后读取文件的内容。我为 Lambda 函数创建了一个触发器,以便对存储桶的 S3 PUT 操作执行此操作。
这是我正在使用的代码,主要取自另一个 StackOverflow 答案。当我部署时,似乎一切正常——我可以获取上传到存储桶的 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(
读取 S3 JSON 对象这一行);
不会显示在 Cloudwatch 日志中,尽管该console.log
方法之外的消息可以正常工作。我已确保该node_modules
文件夹也已上传。如果 AWS 开发工具包模块未上传到 Lambda,日志不会报告错误吗?感谢任何有关故障排除的建议,以便我理解为什么我无法读取存储桶对象。
解决方案
推荐阅读
- python - Python Flask Node.js 加载资源失败 404
- azure - Microsoft 的 Azure ARM 模板中的“Flow_type”属性是什么?
- java - View 无法转换为 MotionEvent 和 MotionEvent 无法转换为 View
- javascript - 导航栏切换按钮在 Bootstrap v4.1.3 中不起作用
- android - Android Studio 正在删除书架内容
- php - 提交表格不再在 Chrome 中工作
- android - 是否可以通过 Android 中的反射来获取系统类?
- php - 使用 Google Chrome 浏览器播放的背景视频不一致
- c# - 如何在 .net Odata web api 的 $metadata 页面中向 Enums 添加注释
- css - 如何浮动按钮超过中心而不是右?