【问题标题】:AWS Lambda unzip from S3 to S3AWS Lambda 从 S3 解压到 S3
【发布时间】:2021-02-12 02:54:24
【问题描述】:

我正在尝试编写一个 Lambda 函数,将 zip 文件解压缩到一个 S3 目录中并解压缩到另一个目录中。我在 Python 中工作过,但我的团队中没有其他人喜欢 Python,所以我将其转换为我不太擅长的 Node.js。

我正在尝试使用 unzipper 包,我可以使用 unzipper.Open.S3 获取 zip 文件中的文件列表,但我不知道如何流式传输 zip 文件中的文件进入 S3。

代码的肉看起来像

  const directory = await unzipper.Open.s3(s3,{Bucket: bucket, Key: zip_file});

  directory.files.forEach(file => {
    console.log("file name = " + file.path + ", type = " + file.type)
    const key = dir[0] + "/output/" + file.path;
    const params = { Bucket: bucket, Key: key };
    const { writeStream, promise } = uploadStream(params)
    file.stream().pipe(writeStream);
    promise.then(() => {
      console.log('upload completed successfully');
    }).catch((err) => {
      console.log('upload failed.', err.message);
    });
  });

const uploadStream = ({ Bucket, Key }) => {
  const pass = new stream.PassThrough();
  return {
    writeStream: pass,
    promise: s3.upload({ Bucket, Key, Body: pass }).promise()
  };
}

我得到了每个文件的 console.log,但 promise.then.catch 中的日志都没有出现,S3 中也没有出现新文件。

【问题讨论】:

    标签: node.js amazon-web-services amazon-s3 aws-lambda


    【解决方案1】:

    没关系,我发现这段代码效果更好:

    exports.handler = async (event) =>      {
        const params = {
        Key: zip_directory + "/" + zip_file,
        Bucket: input_bucket
      };
    
      const zip = s3
          .getObject(params)
          .createReadStream()
          .pipe(unzipper.Parse({ forceStream: true }));
    
      const promises = [];
    
      let num = 0;
    
      for await (const e of zip) {
        const entry = e;
    
        const fileName = entry.path;
        const type = entry.type;
        if (type === 'File') {
          const uploadParams = {
            Bucket: output_bucket,
            Key: output_directory + fileName,
            Body: entry,
          };
    
          promises.push(s3.upload(uploadParams).promise());
          num++;
        } else {
          entry.autodrain();
        }
      }
    
      await Promise.all(promises);
    
    };
    

    【讨论】:

    • 嗨。我想问一下你是如何初始化来自 Lambda 事件的 zip_directoryzip_file 变量(假设它是你用来初始化这些变量的方法。)我也在使用 unzipper,我是目前库存有同样的问题
    • @monkeybanana 我最终使用的代码并不完全是这样,但我从event.Records[0].s3 输入事件中获得了输入密钥,从process.env 获得了输出桶和目录
    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    相关资源
    最近更新 更多