Я сохранил много файлов пользователя в своем хранилище 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 как службу.