2

Как скопировать файлы размером более 5 ГБ между ведрами S3 с помощью PowerShell?Как скопировать файлы размером более 5 ГБ между ведрами S3 с помощью PowerShell

Существует несколько примеров использования PowerShell для копирования файлов между ведрами AWS S3, но они использовали команду Copy-S3Object, которая равна limited to files less than 5GB.

ответ

3

Вы должны сначала download и установить AWS Tools for Windows PowerShell.

Это основано на C# example на сайте AWS.

$AWSCredentials = Get-AWSCredentials -ProfileName YourProfileName # use Get-AWSCredentials -ListProfiles 

$sourceBucket = " " #source Bucket 
$targetBucket = " " #target Bucket 
$sourceObjectKey = " " #source filename 
$targetObjectKey = " " #target filename 
$region="USEast1" #region 
$copyResponses = @() 

$s3Config = New-Object Amazon.S3.AmazonS3Config 
$s3Config.RegionEndpoint = [Amazon.RegionEndpoint]::$region 


$s3client = New-Object Amazon.S3.AmazonS3Client($AWSCredentials,$s3Config) 

$initiateRequest = New-Object Amazon.S3.Model.InitiateMultipartUploadRequest 
$initiateRequest.BucketName = $targetBucket 
$initiateRequest.Key = $targetObjectKey 

$initResponse = $s3client.InitiateMultipartUpload($initiateRequest) 
$uploadId = $initResponse.UploadId 
$uploadId 

$metadataRequest = New-Object Amazon.S3.Model.GetObjectMetadataRequest 
$metadataRequest.BucketName = $sourceBucket 
$metadataRequest.Key = $sourceObjectKey 

$metadataResponse = New-Object Amazon.S3.Model.GetObjectMetadataResponse 
$metadataResponse = $s3client.GetObjectMetadata($metadataRequest) 
$objectSize = $metadataResponse.ContentLength; # in bytes 
$objectSize 

$partSize = 1GB 
$objectSize/$partSize 

$bytePosition = 0 
for ($i = 1; $bytePosition -lt $objectSize; $i++) 
{ 
    $copyRequest = New-Object Amazon.S3.Model.CopyPartRequest 
    $copyRequest.DestinationBucket = $targetBucket 
    $copyRequest.DestinationKey = $targetObjectKey 
    $copyRequest.SourceBucket = $sourceBucket 
    $copyRequest.SourceKey = $sourceObjectKey 
    $copyRequest.UploadId = $uploadId 
    $copyRequest.FirstByte = $bytePosition 
    $copyRequest.LastByte = if ($bytePosition + $partSize - 1 -ge $objectSize) { $objectSize - 1} else {$bytePosition + $partSize - 1} 
    $copyRequest.PartNumber = $i 

    $copyResponses += $s3Client.CopyPart($copyRequest) 
    $bytePosition += $partSize      
} 

$completeRequest = New-Object Amazon.S3.Model.CompleteMultipartUploadRequest 
$completeRequest.BucketName = $targetBucket 
$completeRequest.Key = $targetObjectKey 
$completeRequest.UploadId = $uploadId 
$completeRequest.AddPartETags($copyResponses) 

$completeUploadResponse =$s3Client.CompleteMultipartUpload($completeRequest) 
+0

Это потрясающе, спасибо за перевод этого в PowerShell! Как и в стороне, Write-S3Object был реализован таким образом, что он обрабатывает прозрачную загрузку S3 прозрачно] (http://docs.aws.amazon.com/powershell/latest/reference/items/Write-S3Object.html), надеюсь, скопируйте -S3Object будет делать то же самое. –

+0

Если вы не хотите передавать учетные данные в «AmazonS3Client», вы можете использовать ctor и передать в регионе напрямую: 'New-Object Amazon.S3.AmazonS3Client ($ region)'. Это было ключевым при использовании этого подхода в eu-central-1. – boro2g