将最新上传的文件从 S3 存储桶复制到本地计算机

Copy the latest uploaded file from S3 bucket to local machine

提问人:rocky_alpine 提问时间:12/16/2022 最后编辑:rocky_alpine 更新时间:12/20/2022 访问量:672

问:

我有一个 cron 作业集,用于将文件从 EC2 实例移动到 S3

aws s3 mv --recursive localdir s3://bucket-name/ --exclude "*" --include "localdir/*"

之后,我在 .bat 文件中使用并在 Windows 中运行任务计划程序来运行该命令。aws s3 sync s3://bucket-name/data1/ E:\Datafolder

问题是 s3 sync 命令复制了前缀中的所有文件。/data1/

因此,假设我有以下文件:

Day1:file1 同步到本地。 第 2 天:file1 和 file2 已同步到本地,因为 file1 已从本地计算机的文件夹中删除。

我不希望它们在本地机器上占用空间。在第 2 天,我只想复制 file2。

这可以通过 AWS CLI 命令完成吗?还是我需要编写 lambda 函数?

遵循了使用 AWS CLI 从 S3 获取最后修改的对象中的答案

但在 Windows 上,和命令未按预期工作。|awk

Amazon-Web-Services 批处理文件 Amazon-S3 PowerShell-2.0 Windows-Server-2008-R2

评论

0赞 jarmod 12/16/2022
请注意,有一个选项,在同步过程中,将从目标中删除存在于目标中但不在源中的文件。aws s3 sync--delete
0赞 rocky_alpine 12/16/2022
就我而言,在第 1 天,当 file1 同步到目标时,文件被移动到另一个文件夹进行处理。因此,在第 2 天,目标没有任何文件,但源有 file1 和 file2。我只想在第 2 天同步 file2 等。
0赞 jarmod 12/16/2022
为此,一些本地进程需要记住之前上传到 S3 的内容。它无法从同步目标存储桶中确定这一点,因为如果我理解正确的话,对象已经从该目标存储桶移动到另一个处理存储桶。
0赞 rocky_alpine 12/16/2022
存储桶是源,目标是 Windows Server 2008 R2 上的文件夹。源存储桶将每天从 EC2 实例上传一个文件。当我在本地 Windows Server 上使用命令时,它会将文件从 S3 复制到 Windows 上的文件夹。file1 将移动到 Windows 上的另一个文件夹。目标文件夹现在为空。在下次同步时,我将有 file1 和 file2,但我只想将 file2 复制到目标,因为它是最新的。sync

答:

1赞 John Rotenstein 12/16/2022 #1

若要获取具有最近“上次修改”日期的对象的名称,可以使用:

aws s3api list-objects-v2 --bucket BUCKET-NAME --query 'sort_by(Contents, &LastModified)[-1].Key' --output text

因此(使用 shell 语法),您可以使用:

object=`aws s3api list-objects-v2 --bucket BUCKET-NAME --prefix data1/ --query 'sort_by(Contents, &LastModified)[-1].Key' --output text`

aws s3 cp s3://BUCKET-NAME/$object E:\Datafolder

您可能需要对其进行调整才能使其在 Windows 上运行。

基本上,它获取存储桶列表,按 排序,然后获取列表中最后一个对象的名称。LastModified

评论

0赞 rocky_alpine 12/16/2022
这适用于 AWS CLI v1 吗?这就是我在 Windows Server 上安装它的原因,因为 CLI v2 与 Windows Server 2008 不兼容。
0赞 John Rotenstein 12/16/2022
是的,它应该可以正常工作。
0赞 rocky_alpine 12/17/2022
不,这在 Windows 上不起作用。我收到一个错误:C:Windows \system32\object= 'object' is not recognized as an internal or external command, operatable program or batch file.aws s3api list-objects-v2 --bucket BUCKET-NAME --prefix data1/ --query 'sort_by(Contents, &LastModified)[-1].Key' --output text
1赞 John Rotenstein 12/17/2022
需要使用等效于存储另一个命令结果的 PowerShell。我不是 PowerShell 人员,但查看 Powershell 中将 cmdlet 的结果值存储在变量中 - Stack Overflow 建议您可以在前面使用(带有美元符号)。$object=
-1赞 rocky_alpine 12/20/2022 #2

修改了答案以使用 Windows 文件。使用 Windows cmd.exe.bat

for /f "delims=" %%i in ('aws s3api list-objects-v2 --bucket BUCKET-NAME --prefix data1/ --query "sort_by(Contents, &LastModified)[-1].Key" --output text') do set object=%%i
aws s3 cp s3://BUCKET-NAME/%object% E:\Datafolder