Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python从S3下载/压缩文件:ECS Fargate达到存储限制_Python_Amazon S3_Boto3_Aws Fargate - Fatal编程技术网

Python从S3下载/压缩文件:ECS Fargate达到存储限制

Python从S3下载/压缩文件:ECS Fargate达到存储限制,python,amazon-s3,boto3,aws-fargate,Python,Amazon S3,Boto3,Aws Fargate,我有一个ECS Fargate任务,可以下载S3存储桶中的大约200万个CSV,将它们压缩到一个zip存档中,然后将该存档保存到S3。CSV约为40kb。下面是我在Docker容器中运行的代码 但我遇到了一个错误,“OSError:[Errno 28]设备上没有剩余空间:'/app/data/temp/myfile.csv'” Fargate文档说:“对于使用平台版本1.4.0或更高版本的Fargate任务上的Amazon ECS,每个任务接收20GB的临时存储”。() 这说明我遇到了磁盘错误,

我有一个ECS Fargate任务,可以下载S3存储桶中的大约200万个CSV,将它们压缩到一个zip存档中,然后将该存档保存到S3。CSV约为40kb。下面是我在Docker容器中运行的代码

但我遇到了一个错误,“OSError:[Errno 28]设备上没有剩余空间:'/app/data/temp/myfile.csv'”

Fargate文档说:“对于使用平台版本1.4.0或更高版本的Fargate任务上的Amazon ECS,每个任务接收20GB的临时存储”。()

这说明我遇到了磁盘错误,因为40kb*2000000文件=80000000kb=80Gb

剩下的问题是如何从S3下载这些文件并压缩它们。有没有办法通过从并行容器生成几个zip文件来并行解决这个问题?(或者完全用于生成此S3 bucket的zip的更好方法)

我可以通过以下方式逐一下载:

aws s3 sync s3://mybucketname .
但我一直很难在本地将它们压缩成一个文件,一旦它们全部下载到我的机器上,我的机器就会崩溃(因此在AWS上这样做)

谢谢

import boto3
import os
from botocore.exceptions import ClientError
import shutil
from configs import *

s3_resource = boto3.resource('s3')
s3_client = boto3.client('s3')

source_bucket = s3_resource.Bucket(bucket)

# download CSVs
for s3_object in source_bucket.objects.all():
    path, filename = os.path.split(s3_object.key)
    source_bucket.download_file(s3_object.key, f"temp/{filename}")  # OSError: [Errno 28] No space left on device: '/app/data/temp/myfile.csv'

# archive
shutil.make_archive(f"temp/archive", 'zip', tmp_dir)

# save to s3
s3_client.upload_file(f"temp/archive.zip", bucket, "archive.zip")
自最近(2020年4月)以来,ECS和Fargate已经为EFS提供了内置支持:

使用EFS的ECS任务将自动装载客户在任务定义中指定的文件系统,并使其可供任务中的容器跨区域的所有可用区域使用。这使得可以在ECS中的任务和容器级别定义和使用持久共享存储

因此,使用EFS可能是解决存储短缺的一种可能方式