在不使用适用于 .NET 的 AWS 开发工具包的情况下从 Powershell 将文件上传到 S3 的替代方法?

Osc*_*ley 1 powershell file-upload amazon-s3 amazon-web-services

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

我已经使用了适用于 .NET 的 AWS 开发工具包,并且非常适合少量文件。我只是在之前的代码中创建了存储桶并尝试使用 Write-S3Object 上传所有文件

Write-S3Object -Region $S3_Region -AccessKey $S3_AccessKey -SecretKey $S3_SecretKey -ServerSideEncryption "AES256" -Folder $sourceFolder -BucketName $S3_Bucket -Recurse -KeyPrefix "/" 
Run Code Online (Sandbox Code Playgroud)

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

  • 突然没有错误,它只是上传了部分文件

将 2664 个对象从 'R:\temp\files' 上传到存储桶 'bucket.test' ,键前缀为 '/'

  • 它失败但有异常:

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

所以我的问题是:

  • 难道我做错了什么?
  • 有什么解决方法或修复我的问题吗?
  • 在不使用适用于 .NET 的 AWS 开发工具包的情况下,还有其他上传方式吗?

Raj*_*esh 5

我使用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)
    }    
}
Run Code Online (Sandbox Code Playgroud)