Python скачивание / архивирование файлов с S3: ECS Fargate достигает предела хранилища - PullRequest
2 голосов
/ 04 августа 2020

У меня есть задача ECS Fargate, которая загружает около 2 миллионов CSV, находящихся в ведре S3, сжимает их в один zip-архив и затем сохраняет этот архив в S3. Размер CSV составляет ~ 40 КБ. Мой код, который выполняется в контейнере Docker, приведен ниже.

Однако у меня возникла ошибка: «OSError: [Errno 28] На устройстве не осталось места: '/app/data/temp/myfile.csv' «

В документах Fargate сказано:« Для задач Amazon ECS на Fargate, использующих платформу версии 1.4.0 или более поздней, каждая задача получает 20 ГБ временного хранилища ». (https://docs.aws.amazon.com/AmazonECS/latest/developerguide/fargate-task-storage.html)

Это имеет смысл, что я столкнулся с ошибкой диска, потому что 40kb * 2000000 файлов = 80000000kb = 80Gb

У меня осталась проблема о том, как загрузить эти файлы с S3 и заархивировать их. Есть ли способ решить эту проблему параллельно, создав несколько zip-файлов из параллельных контейнеров? (Или лучший подход для создания zip-архива этой корзины S3.) в один файл локально, как только все они будут загружены на мою машину, моя машина выйдет из строя (следовательно, это происходит на 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")

1 Ответ

1 голос
/ 04 августа 2020

С недавнего времени (апрель 2020 г.) ECS и Fargate встроили поддержку EFS:

Задачи ECS, использующие EFS, будут автоматически подключать файловые системы, указанные заказчиком в определении задачи, и делать их доступными для контейнеров в задаче по всем зонам доступности в регионе. Это позволяет определять и использовать постоянное совместно используемое хранилище на уровне задач и контейнеров в ECS.

Таким образом, использование EFS может быть одним из возможных способов решения проблемы нехватки хранилища.

...