You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:20:26