使 powershell 脚本更快地从 AWS S3 下载文件

Making a powershell script download files quicker from AWS S3

提问人:Xanthus 提问时间:9/19/2023 更新时间:9/19/2023 访问量:62

问:

我们有一个第三方服务,可以将文件上传到我们账户中的某个 s3 存储桶。数量各不相同,有时可以在几分钟内达到几百个文件。此外,每次收到文件时,我们都会更新一个 SQS 队列。我们需要为此存储桶中收到的每个文件执行三件事:

  1. 下载到本地 Windows 服务器
  2. 将其移动到存储桶中名为“Done”的文件夹中
  3. 从存储桶的根目录中删除文件

为了做到这一点并且没有重复项,我们使用以下脚本,该脚本使用列表并每 10 分钟运行一次:

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue"
$date = Get-Date -DisplayHint Date -Format "dd-MM-yyyy-HH-mm-ss"
Start-Transcript -path C:\temp\log_$date.txt -append

Set-AWSCredential -ProfileName profile
Set-DefaultAWSRegion -Region eu-west-1

$BucketName = “example-bucket”
$SqsURL = ”https://sqs.eu-west-1.amazonaws.com/xxxxxxxxxxxx/example-bucket”
$BucketRootObjects = Get-S3Object -BucketName $BucketName 
Clear-SQSQueue -QueueUrl $SqsURL -Force
$BucketDirsToSync = @()
foreach ($BucketObject in $BucketRootObjects) {
if($BucketObject.Key.contains(“Done/”))
{continue}
$BucketDirsToSync += $BucketObject.Key
}
foreach( $dirname in $BucketDirsToSync){
Copy-S3Object -BucketName $BucketName -Key $dirname -LocalFile \\winserver\files\$dirname
}
Foreach( $dirname in  $BucketDirsToSync){
Copy-S3Object -BucketName $BucketName -Key $dirname  -DestinationKey "Done/$dirname"
}
Foreach( $dirname in  $BucketDirsToSync){
Remove-S3Object -BucketName $BucketName -Key $dirname -Force
}
Stop-Transcript

问题是,当收到大量文件时,可能需要很长时间才能完成。有没有办法使这个脚本更有效率并更快地处理文件?似乎在不使用列表的情况下是可能的,但是我们会遇到重复文件的问题。

Amazon-Web-Services PowerShell 文件 Amazon-S3 下载

评论

0赞 jdweng 9/19/2023
这取决于限制速度的原因,这通常是由于以下五件事之一:1)网络速度:使用更快的网卡或连接2)处理器速度:使用更快的计算机3)磁盘存储时间:使用更快的磁盘。磁盘可能已满或碎片化 4) 内存 : 当内存使用率很高时,程序运行速度要慢得多。获得更多内存。5)数据库类型:使用更好的数据库,并确保数据库附加到服务器而不是备用文件。
0赞 Anon Coward 9/20/2023
我希望 SQS 消息包含有关要对哪些 S3 对象进行操作的信息,并且工作人员使用此信息而不是枚举存储桶本身。我还希望工作人员在完成后删除一条消息,而不是事先清空队列。

答: 暂无答案