AWS Lambda 从 S3 解压到 S3

Pau*_*lin 3 amazon-s3 amazon-web-services node.js aws-lambda

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

我正在尝试使用该unzipper包,并且能够使用 获取 zip 文件中的文件列表unzipper.Open.S3,但我不知道如何将 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()
  };
}
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*lin 5

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

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);

};
Run Code Online (Sandbox Code Playgroud)