У меня есть файл, который зашифрован в ключе KMS1 в моем ведре1.Мне нужно перенести его в bucket2 и зашифровать его с помощью ключа KMS2.Первоначально я использовал GetObject и PutObject API.Но это занимает много времени для больших файлов (5 ГБ и более).Также я выполняю эту задачу на лямбде, поэтому время ожидания составляет 15 минут.
Я пытался использовать API загрузки TransferManager, но для этого требуется файл, и я столкнулся с приведенной ниже ошибкой.Я планировал сделать загрузку из нескольких частей, а затем сделать загрузку из нескольких частей.Насколько я понимаю, из-за моего требования расшифровать мой файл с помощью ключа 1, а затем зашифровать мой файл с помощью ключа 2, я не могу использовать многочастную копию, так как он использует тот же клиент Amazon S3.
TransferManager sourceTransferManager = TransferManagerBuilder
.standard().withS3Client(sourceS3Client).build();
GetObjectRequest getObjectRequest = new GetObjectRequest(srcBucket, srcKey);
File modelFile = File.createTempFile("BigFile", "gz");
logger.log("Starting download");
Download download = sourceTransferManager.download(getObjectRequest, modelFile);
download.waitForCompletion();
sourceTransferManager.shutdownNow();
logger.log("Finishing download");
logger.log("Downloaded the object, let's upload it");
//For a decrypted object, the content length in metadata still has the encrypted length
//Set the content length to the unencrypted-data-length
PutObjectRequest putObjectRequest = new PutObjectRequest(destS3Uri.getBucket(), destS3Uri.getKey(), modelFile);
transferManager = TransferManagerBuilder
.standard()
.withS3Client(destS3Client)
.build();
Upload upload = transferManager.upload(putObjectRequest);```
aused by: com.amazonaws.SdkClientException: Unable to store object contents to disk: No space left on device
at com.amazonaws.services.s3.internal.ServiceUtils.downloadToFile(ServiceUtils.java:314)
at com.amazonaws.services.s3.transfer.DownloadCallable.retryableDownloadS3ObjectToFile(DownloadCallable.java:275)
at com.amazonaws.services.s3.transfer.DownloadCallable.downloadAsSingleObject(DownloadCallable.java:92)
at com.amazonaws.services.s3.transfer.internal.AbstractDownloadCallable.call(AbstractDownloadCallable.java:102)
at com.amazonaws.services.s3.transfer.internal.AbstractDownloadCallable.call(AbstractDownloadCallable.java:40)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: No space left on device
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:326)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122)
at com.amazonaws.services.s3.internal.ServiceUtils.downloadToFile(ServiceUtils.java:309)
... 8 more