替代在不使用AWS SDK for .NET的情况下从Powershell上传文件到S3?

时间:2015-04-24 12:20:54

标签: powershell amazon-web-services file-upload amazon-s3

我需要从PowerShell脚本向S3上传文件(总共100GB,包含10GB的几个文件): http://docs.aws.amazon.com/powershell/latest/reference/Index.html(亚马逊简单存储服务)

我使用的是AWS SDK for .NET,适用于少量文件。我只是在前面的代码中创建了存储桶,并尝试使用Write-S3Object

上传所有文件
Write-S3Object -Region $S3_Region -AccessKey $S3_AccessKey -SecretKey $S3_SecretKey -ServerSideEncryption "AES256" -Folder $sourceFolder -BucketName $S3_Bucket -Recurse -KeyPrefix "/" 

但我有几个稳定性问题。它经常失败,有两种类型的错误。 (有4683个文件要上传)

  • 突然没有错误就完成了上传部分文件
  

将2664个对象上传到存储桶'bucket.test'   带有keyprefix'/'

的'R:\ temp \ files'
  • 失败但有例外:
  

将35个对象上传到存储桶'bucket.test'   带有keyprefix'/'的'R:\ temp \ files'   System.InvalidOperationException:指定的上载不存在。   上传ID可能无效,或者上传可能已中止或   完成。 ---> Amazon.S3.AmazonS3Exception:指定的上传功能   不存在。上传ID可能无效,或者上传可能已经无效   中止或完成。 --->   Amazon.Runtime.Internal.HttpErrorResponseException:远程服务器   返回错误:(404)未找到。 ---> System.Net.WebException:The   远程服务器返回错误:(404)Not Found。

所以我的问题是:

  • 我做错了吗?
  • 我的问题是否有解决方法或修复方法?
  • 有没有其他方法可以在不使用AWS SDK for .NET的情况下上传文件?

2 个答案:

答案 0 :(得分:4)

我使用S3 TransferUtility对象,而不是使用Write-S3Object,而该对象能够使用分段上传来上传大文件。

我一直在使用下面的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)
    }    
}

答案 1 :(得分:2)

如果你是Golang粉丝,你可以尝试https://github.com/minio/mc。我们还有一个64位的Windows预编译二进制文件,可以与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。