AWS PowerShell Significativamente mais lento o AWS CLI

1

Estou tendo um problema em que um script do PowerShell leva 10 vezes mais do que um arquivo em lotes para fazer download de arquivos do AWS S3.

Eu tenho um script de arquivo em lotes existente para mover arquivos de um S3 Bucket para outro, leva cerca de 30 segundos para mover 1000 arquivos.

O script é assim     aws s3 mv s3: // pasta / pasta / s3: // balde /% destKey% /% subDestKey% / --recursive --include "*. json" -profile etl

Prefiro fazer isso no PowerShell, pois gostaria de aplicar muito mais lógica e estou mais confortável no PowerShell.

Meu script do Powershell para fazer as mesmas coisas é assim

$files = Get-S3object -BucketName bucket | where {$_.Key -like "*.json" -and 
$_.Key -notlike "inprogress*"}
foreach ($file in $files){

Copy-S3Object -BucketName bucket -Key $file.Key -DestinationKey 
"$date/$($file.key)" -DestinationBucket newbucket
Remove-S3Object -BucketName bucket -Key $file.Key -Force


}

No entanto, no PowerShell, esse script leva cerca de 300 segundos para mover 1000 arquivos. Alguém mais tem essa mesma experiência? Espero que a resposta seja que estou adotando a abordagem errada aqui, pois adoraria poder usar o PowerShell para essa tarefa!

    
por Harrison 11.10.2018 / 10:05

2 respostas

0

Existem duas razões para a diferença de desempenho aqui:

  • Uploads do Powershell em um único segmento
  • Você está copiando cada arquivo em série

O AWS CLI é muito mais rápido porque usa vários segmentos (até 10 por padrão) e, portanto, está executando várias operações simultâneas.

Você pode acelerar o processo alterando seu script para usar a opção -parallel , limitando o número de operações simultâneas.

O foreach ficaria assim:

foreach -parallel -throttlelimit 10 ($file in $files){

Copy-S3Object -BucketName bucket -Key $file.Key -DestinationKey "$date/$($file.key)" -DestinationBucket newbucket Remove-S3Object -BucketName bucket -Key $file.Key -Force

}

Dependendo do seu sistema, o Windows pode limitar você a apenas 5 processos paralelos, mas isso ainda deve proporcionar uma velocidade razoável.

    
por 11.10.2018 / 10:29
0

Meu palpite é que aws s3 está fazendo o movimento através de uma única conexão HTTPS reutilizada para todos os arquivos.

Por outro lado, cada chamada do PowerShell Copy-S3Object e Remove-S3Object abre uma nova conexão HTTPS, faz o handshake SSL, etc. Isso é uma grande sobrecarga se você precisar fazer isso 1000x.

Esse é o meu palpite:)

    
por 11.10.2018 / 10:15