在AWS Lambda中从S3下载Zip文件后无法找到文件的解决方法
解决Lambda中S3下载Zip文件后找不到的问题
我来帮你排查这个问题,你的代码里有几个关键问题导致找不到文件,咱们一步步来修正:
问题分析
- 目录读取路径错误:你在
file.on('close')里用fs.readdir('./')读取的是Lambda函数的工作目录(默认是/var/task),但你把文件写到了/tmp/temp0.zip,自然看不到目标文件。 - 缺少错误监听:你的代码没有监听S3读取流或写入流的
error事件,就算下载过程中出现权限问题(虽然你说权限没问题,但还是要排查)、网络问题,你也看不到错误信息,没法定位问题。 - 流的完成事件监听不完整:虽然
close事件会触发,但有时候用finish事件更可靠,它表示所有数据都已经写入完成,而close是文件描述符关闭的事件,可能存在时序问题。
修正后的代码
const fs = require('fs'); const s3 = require('aws-sdk/clients/s3'); // 初始化S3客户端(如果还没初始化的话) const s3Client = new s3(); const file = fs.createWriteStream('/tmp/temp0.zip'); // 监听写入流的错误 file.on('error', (err) => { console.error('写入文件时出错:', err); }); // 监听S3读取流的错误 const readStream = s3Client.getObject({ Bucket: 'myBucket', Key: 'temp0.zip' }).createReadStream(); readStream.on('error', (err) => { console.error('从S3读取文件时出错:', err); }); // 管道传输文件 readStream.pipe(file); // 监听写入完成事件 file.on('finish', function() { console.log('文件下载完成'); // 读取/tmp目录下的文件 fs.readdir('/tmp', (err, files) => { if (err) { console.error('读取/tmp目录出错:', err); return; } files.forEach((file) => { console.log('/tmp下的文件: ', file); }); }); });
额外注意事项
- Lambda的
/tmp目录是临时存储,最大容量是10GB(不同运行时可能有差异,目前主流运行时已支持10GB),确保你的Zip文件大小不超过这个限制。 - 确认S3对象的Key完全正确,注意S3的Key是区分大小写的,别因为大小写问题导致找不到源文件。
- 如果使用Node.js 18+等较新的运行时,可以考虑用
fs.promises结合s3.getObject().promise()的异步/await写法,代码可读性更强,异步流程处理也更清晰。
内容的提问来源于stack exchange,提问作者Tiago Castro
相关产品推荐
相关产品推荐

