【问题标题】:get zip files from one s3 bucket unzip them to another s3 bucket从一个 s3 存储桶获取 zip 文件 将它们解压缩到另一个 s3 存储桶
【发布时间】:2019-02-27 10:31:28
【问题描述】:

我在一个 s3 存储桶中有 zip 文件 我需要解压它们并将解压后的文件夹复制到另一个 s3 存储桶并保留源路径

例如 - 如果在源存储桶中

下的 zip 文件
"s3://bucketname/foo/bar/file.zip"

那么在目标存储桶中应该是"s3://destbucketname/foo/bar/zipname/files.."

怎么办? 我知道可以用 lambda 以某种方式做到这一点,所以我不必在本地下载它,但我不知道怎么做

谢谢!

【问题讨论】:

  • 你试过什么?您遇到什么问题?您希望代码在哪里运行——在您自己的计算机上,还是希望上传 zip 文件来触发执行这些步骤的 AWS Lambda 函数?随时编辑您的问题以提供更多信息。
  • 正如我所提到的,我知道使用 lambda 是可能的,但我不知道该怎么做。肯定 lambda 将是最好的解决方案,因为我不想在本地下载文件。你有一个例子吗?

标签: amazon-s3 aws-lambda zip unzip


【解决方案1】:

如果您希望在 Zip 文件上传到存储桶后立即触发上述过程,那么您可以编写一个 AWS Lambda 函数

当 Lambda 函数被触发时,它将被传递给上传的存储桶和对象的名称。该函数应该:

  • 下载压缩文件到/tmp
  • 解压缩文件(注意:最大可用存储空间:500MB)
  • 循环解压后的文件并将它们上传到目标存储桶
  • 删除所有创建的本地文件(为将来执行该函数腾出空间)

有关一般示例,请参阅:Tutorial: Using AWS Lambda with Amazon S3 - AWS Lambda

【讨论】:

  • 我知道最好的解决方案是使用 lambda,但我不知道该怎么做。你有例子吗?
  • 这里是使用 AWS Lambda 和 Amazon S3 的教程。当一张图片上传到一个存储桶时,它会下载它,调整它的大小并上传到另一个存储桶。所以,有一些类似的元素。 Tutorial: Using AWS Lambda with Amazon S3 - AWS Lambda
【解决方案2】:

您可以为此使用 AWS Lambda。您还可以在 S3 存储桶中设置事件通知,以便在每次新文件到达时触发 lambda 函数。您可以编写使用 boto3 连接到 S3 的 Python 代码。然后您可以将文件读入缓冲区,并使用这些库解压缩它们,gzip 压缩它们然后重新上传到您想要的文件夹/路径中的 S3:

import gzip
import zipfile
import io

with zipped.open(file, "r") as f_in:
     gzipped_content = gzip.compress(f_in.read())
     destinationbucket.upload_fileobj(io.BytesIO(gzipped_content),
                                                        final_file_path,
                                                        ExtraArgs={"ContentType": "text/plain"}
                                                )

这里也有教程:https://betterprogramming.pub/unzip-and-gzip-incoming-s3-files-with-aws-lambda-f7bccf0099c9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2020-05-29
    • 2018-06-02
    • 1970-01-01
    • 2020-07-05
    • 2018-11-22
    • 1970-01-01
    相关资源
    最近更新 更多