2016-11-17 11 views
0

Я нашел скрипт PowerShell, чтобы скопировать все файлы из ведра Amazon S3 в локальную папку на одном из наших серверов на месте:Copy Amazon S3 Ковш Содержание к локальной папке с помощью PowerShell Script

# Your account access key - must have read access to your S3 Bucket 
$accessKey = "MyAccessKey" 
# Your account secret access key 
$secretKey = "MySecretKey" 
# The region associated with your bucket e.g. eu-west-1, us-east-1 etc. (see http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-regions) 
$region = "eu-west-1" 
# The name of your S3 Bucket 
$bucket = "MyBucket/" 
# The folder in your bucket to copy, including trailing slash. Leave blank to copy the entire bucket 
$keyPrefix = "" 
# The local file path where files should be copied 
$localPath = "C:\test\" 

$objects = Get-S3Object -BucketName $bucket -KeyPrefix $keyPrefix -AccessKey $accessKey -SecretKey $secretKey -Region $region 

foreach($object in $objects) { 
$localFileName = $object.Key -replace $keyPrefix, '' 
if ($localFileName -ne '') { 
    $localFilePath = Join-Path $localPath $localFileName 
    Copy-S3Object -BucketName $bucket -Key $object.Key -LocalFile $localFilePath -AccessKey $accessKey -SecretKey $secretKey -Region $region 
} 
} 

Если я запустить первую часть на своем собственном (вплоть до линии Get-S3Object), а затем отобразить $ объектов переменных отображает подробную информацию о файлах, один за другие с ниже информацией в PowerShell

ETag : "38763873d83763c3876" 
BucketName : MyBucketName 
Key : 3287653_32876_to_38763_3876_client.xml 
LastModified : 14/10/2016 11:26:51 
Owner : Amazon.S3.Model.Owner 
Size : 485 
StorageClass : Standard 

Так что это успешно g Эттинг файлов из ведра ... Однако, если я бег всего сценария, я получаю сообщение об ошибке для каждой итерации цикла, который говорит:

Copy-S3Object : The specified key does not exist. 
At line:5 char:9 
+   Copy-S3Object -BucketName $bucket -Key $object.Key -LocalFile ... 
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo   : InvalidOperation: (Amazon.PowerShe...yS3ObjectCmdlet:CopyS3ObjectCmdlet) [Copy-S3Object] 
, InvalidOperationException 
+ FullyQualifiedErrorId : Amazon.S3.AmazonS3Exception,Amazon.PowerShell.Cmdlets.S3.CopyS3ObjectCmdlet 

поэтому я подозреваю, что это что-то сделать с помощью команды или переменных из петля ...

foreach($object in $objects) { 
$localFileName = $object.Key -replace $keyPrefix, '' 
if ($localFileName -ne '') { 
    $localFilePath = Join-Path $localPath $localFileName 
    Copy-S3Object -BucketName $bucket -Key $object.Key -LocalFile $localFilePath -AccessKey $accessKey -SecretKey $secretKey -Region $region 
} 
} 

... но не смогли выяснить, что.

У кого-нибудь есть яркие идеи о том, что я делаю неправильно, пожалуйста?

ответ

0

Вы можете использовать команды AWSCLI для S3 в Powershell, они должны быть уже установлены, поскольку они поставляются с командными командами AWS Powershell.

Это также намного проще команда, чтобы понять:

aws s3 cp s3://bucketname C:\folder --recursive 
0

Проблема заключается в том, что вы пытаетесь использовать Copy-S3Object на то, что не является объектом. То, что вы воспринимаете как папки в S3, действительно не папки, а просто префиксы имени объекта.

я имел успех с конструкцией, таких как: Get-S3Object -BucketName $bucket -KeyPrefix $key | Copy-S3Object -LocalFolder $localPath