gpt4 book ai didi

java - AWS Lambda : How to extract a tgz file in a S3 bucket and put it in another S3 bucket

转载 作者:行者123 更新时间:2023-12-02 01:27:01 46 4
gpt4 key购买 nike

我有一个名为“Source”的 S3 存储桶。许多“.tgz”文件被实时推送到该存储桶中。我编写了一个 Java 代码来提取“.tgz”文件并将其推送到“目标”存储桶中。我将代码作为 Lambda 函数推送。我在 Java 代码中将“.tgz”文件作为 InputStream 获取。如何在 Lambda 中提取它?我无法在 Lambda 中创建文件,它在 JAVA 中抛出“FileNotFound(权限被拒绝)”。

AmazonS3 s3Client = new AmazonS3Client();
S3Object s3Object = s3Client.getObject(new GetObjectRequest(srcBucket, srcKey));
InputStream objectData = s3Object.getObjectContent();
File file = new File(s3Object.getKey());
OutputStream writer = new BufferedOutputStream(new FileOutputStream(file)); <--- It throws FileNotFound(Permission denied) here

最佳答案

由于其中一个响应是用 Python 编写的,因此我提供了这种语言的替代解决方案。

使用 /tmp 文件系统的解决方案的问题是,AWS 只允许在那里存储 512 MB ( read more )。为了解压或解压缩较大的文件,最好使用 io 包和 BytesIO类和进程文件内容纯粹在内存中。 AWS 允许为 Lambda 分配高达 3GB 的 RAM,这显着扩展了最大文件大小。我成功测试了 1GB S3 文件的解压。

在我的例子中,将约 2000 个文件从 1GB tar 文件解皮到另一个 S3 存储桶需要 140 秒。它可以通过利用多个线程将未压缩的文件上传到目标 S3 存储桶来进一步优化。

下面的示例代码展示了单线程解决方案:

import boto3
import botocore
import tarfile

from io import BytesIO
s3_client = boto3.client('s3')

def untar_s3_file(event, context):

bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']

input_tar_file = s3_client.get_object(Bucket = bucket, Key = key)
input_tar_content = input_tar_file['Body'].read()

with tarfile.open(fileobj = BytesIO(input_tar_content)) as tar:
for tar_resource in tar:
if (tar_resource.isfile()):
inner_file_bytes = tar.extractfile(tar_resource).read()
s3_client.upload_fileobj(BytesIO(inner_file_bytes), Bucket = bucket, Key = tar_resource.name)

关于java - AWS Lambda : How to extract a tgz file in a S3 bucket and put it in another S3 bucket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35226804/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com