Как транслировать архив в S3 по частям в лямбда-функции? - PullRequest
0 голосов
/ 01 ноября 2018

Я сохранил много файлов пользователя в своем хранилище Amazon S3. Я должен предоставить все эти файлы пользователю по запросу.

Для этого я реализовал лямбда-функцию, которая собирает путь к файлам пользователя, создает zip-архив и сохраняет этот архив на s3. Где пользователь может скачать его.

Мой код выглядит так:

using (var s3Client = new AmazonS3Client()){
    using (var memoryStream = new MemoryStream()){
        using (var zip = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)){
            foreach (var file in m_filePathsOnS3){
                var response = await s3Client.GetObjectAsync(m_sourceBucket, file);
                var name = file.Split('/').Last();
                ZipArchiveEntry entry = zip.CreateEntry(name);

                using (Stream entryStream = entry.Open()){
                    await response.ResponseStream.CopyToAsync(entryStream);
                }
            }
        }

        memoryStream.Position = 0;

        var putRequest = new PutObjectRequest{
            BucketName = m_resultBucket,
            Key = m_archivePath,
            InputStream = memoryStream
        };

        await s3Client.PutObjectAsync(putRequest);        
    }
}

Но лямбда-функция имеет ограничение при максимальном выделении памяти в 3008 МБ. Так что, если я правильно понимаю, у меня возникнет проблема при попытке сделать архив более 3008 МБ. Я искал способ потоковой передачи и архивирования файлов на лету. В настоящее время я вижу только один способ - переместить эту лямбда-функцию в экземпляр EC2 как службу.

1 Ответ

0 голосов
/ 02 ноября 2018

Вы правы. Существует также ограничение в 500 МБ дискового пространства, что может повлиять на это.

Следовательно, AWS Lambda не является хорошим вариантом для создания потенциально очень больших zip-файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...