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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:12:28