2015-04-24 4 views
1

Мне нужно загрузить файлы (в общей сложности 100GB с несколькими файлами 10GB) из сценария PowerShell для S3: http://docs.aws.amazon.com/powershell/latest/reference/Index.html (Amazon Simple Service Storage)Альтернатива для загрузки файлов на S3 из Powershell без использования AWS SDK для .NET?

Я использовал AWS SDK для .NET и отлично работает для небольшое количество файлов. Я просто создать ведро в предыдущем коде и попытаться загрузить все файлы с Write-S3Object

Write-S3Object -Region $S3_Region -AccessKey $S3_AccessKey -SecretKey $S3_SecretKey -ServerSideEncryption "AES256" -Folder $sourceFolder -BucketName $S3_Bucket -Recurse -KeyPrefix "/" 

Но у меня есть несколько проблем со стабильностью. Это происходит очень часто с двумя типами ошибок. (Есть 4683 файлов для загрузки)

  • Вдруг без ошибок он заканчивает просто загружает часть файлов

Uploaded 2664 object(s) to bucket 'bucket.test' from 'R:\temp\files' with keyprefix '/'

  • Это терпит неудачу с исключением:

Uploaded 35 object(s) to bucket 'bucket.test' from 'R:\temp\files' with keyprefix '/' System.InvalidOperationException: The specified upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed. ---> Amazon.S3.AmazonS3Exception: The specified upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed. ---> Amazon.Runtime.Internal.HttpErrorResponseException: The remote server returned an error: (404) Not Found. ---> System.Net.WebException: The remote server returned an error: (404) Not Found.

Так что мои вопросы:

  • Я делаю что-то неправильно?
  • Есть ли обходной путь или решение проблемы?
  • Есть ли способ загрузить без использования AWS SDK для .NET?

ответ

3

Вместо использования Write-S3Object Я использую объект S3 TransferUtility, который имеет возможность загружать большие файлы, используя многостраничную загрузку.

Я использую приведенный ниже сценарий powershell для загрузки файлов на S3.

function UploadToAmazonUsingSDK() 
{ 
    param([string] $sourceLocation, [string] $bucketName, [string] $versionNumber)  

    Add-Type -Path "C:\Program Files (x86)\AWS SDK for .NET\bin\Net45\AWSSDK.dll" 

    $AccessKey= "your aws accesskey" 
    $SecretKey ="your secret key" 

    $s3Config=New-Object Amazon.S3.AmazonS3Config 
    $s3Config.UseHttp = $false 
    $s3Config.ServiceURL = "https://s3-eu-west-1.amazonaws.com" 
    $s3Config.BufferSize = 1024 * 32 

    $client=[Amazon.AWSClientFactory]::CreateAmazonS3Client($AccessKey,$SecretKey,$s3Config) 

    $transferUtility = New-Object -TypeName Amazon.S3.Transfer.TransferUtility($client) 

    $files = Get-ChildItem $sourceLocation 

    foreach ($fileName in $files) {   
     $amazonKey = $versionNumber + '/' + $fileName   
     Write-Host $amazonKey 
     Write-Host $fileName 
     Write-Host $fileName.FullName 

     $transferUtilRequest = New-Object -TypeName Amazon.S3.Transfer.TransferUtilityUploadRequest 
     $transferUtilRequest.BucketName = $bucketName 
     $transferUtilRequest.FilePath = $fileName.FullName 
     $transferUtilRequest.Key = $amazonKey 
     $transferUtilRequest.AutoCloseStream = $true 
     $transferUtility.Upload($transferUtilRequest) 
    }  
} 
+0

Похоже, что мне нужно. Я собираюсь проверить это ... –

+0

это работает как прелесть. Функция не совсем то, что мне нужно, но это нормально, так как у TransferUtility есть метод для каталогов. Благодаря :) –

2

Если вы поклонник Golang, вы можете попробовать https://github.com/minio/mc. У нас также есть скомпилированные двоичные файлы для Windows, на 64-битных, которые могут быть использованы с помощью PowerShell, командной строки и т.д.

https://dl.minio.io:9000/updates/2015/Sept/windows-amd64/mc.exe

Чтобы добавить учетные данные S3 просто сделать

C:\> mc.exe config host add s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 

mc.exe реализует хороший прогресс бар , цветной консольный выход, многостраничные закачки, управление сеансом и т. д.

Мы также будем выпускать новую версию предстоящей недели, в которой будут поддерживаться 32-битные и 64-битные Windows.

Смежные вопросы