Node.js 16.x Lambda中s3.listObjects()无响应问题求助
问题根源
你的Lambda handler是async函数,但使用了回调式的s3.listObjects()——Lambda的async函数会在同步代码执行完毕后立即终止,不会等待异步回调执行,导致回调内的代码完全没机会运行,所以你看不到Listing objects的日志。
解决方案
1. 改用Promise+Async/Await(推荐)
AWS SDK支持Promise接口,配合async/await可以确保Lambda等待异步操作完成。另外,listObjects已被官方弃用,建议使用listObjectsV2:
const AWS = require('aws-sdk'); exports.handler = async (event, context) => { const awsOptions = { region: "你的实际区域" }; const s3 = new AWS.S3(awsOptions); const params = { Bucket: '你的存储桶名称', Delimiter: '/', Prefix: 'myPrefix/' }; console.log("Before listing"); try { // 用promise()转换为Promise,并用await等待结果 const data = await s3.listObjectsV2(params).promise(); console.log("Listing objects"); console.log(data); } catch (err) { console.error(err, err.stack); } console.log("After listing"); };
2. 验证IAM权限
确保Lambda关联的IAM角色拥有s3:ListBucket权限(列表存储桶对象需要这个独立权限,和操作单个对象的权限不同),示例权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::你的存储桶名称" }, // 如果后续需要操作对象,添加对应权限 { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::你的存储桶名称/myPrefix/*" } ] }
3. 额外注意点
- 移除不必要的
https模块引入,你的代码里没用到它。 - 不要在async handler中混用
callback参数,async函数默认返回Promise,Lambda会自动处理返回值。
内容的提问来源于stack exchange,提问作者Anshu
相关产品推荐
相关产品推荐

