如何利用Shell脚本和AWS CLI每天自动将文件从一个S3存储桶复制到另一个S3存储桶?

时间:2019-01-07 04:15:04

标签: bash amazon-web-services shell amazon-s3 aws-cli

我想创建一种方法(使用shell脚本和AWS的CLI),以便可以自动执行以下操作:

  1. 从s3存储桶中复制特定文件
  2. 将它们粘贴到S3中的另一个存储桶中。

下面的“同步”命令可以工作吗?

aws s3 sync s3://directory1/bucket1 s3://directory2/bucket2 --exclude "US*.gz" --exclude "CA*.gz" --include "AU*.gz"

此处的目标是仅以自动方式传输文件名以“ AU”开头的文件,并排除其他所有文件。另外,是否可以排除非常旧的文件?

问题的第二部分是,随着每天“ AU”文件被丢弃到此文件夹中,我需要向我的shell脚本中添加什么以使该过程尽可能自动化?

1 个答案:

答案 0 :(得分:0)

复制对象

AWS CLI当然可以在存储桶之间复制对象。实际上,它甚至不需要下载文件-即使文件位于不同的区域,S3也会在存储桶之间直接复制。

aws s3 sync命令无疑是一种简便的方法,因为它会将所有文件从源复制到目标,而不必特别指出要复制的文件。

要仅复制AU*个文件,请使用:--exclude "*" --include "AU*"

请参阅:Use of Exclude and Include Filters

您询问是否要排除旧文件-sync命令将同步所有文件,因此以前复制的所有文件将再次复制。默认情况下,除非明确要求,否则从源中删除的所有文件将在目标中删除。

自动化

如何自动执行此操作?实现此目标的最有价值的方法是创建一个 AWS Lambda函数。 Lambda函数可以由 Amazon CloudWatch Events规则定期触发。

但是,默认情况下,Lambda中未安装AWS CLI,因此可能更具挑战性。参见:Running aws-cli Commands Inside An AWS Lambda Function - Alestic.com

最好让Lambda函数自己执行副本,而不是调用AWS CLI。

替代方案

只要将新对象添加到S3存储桶,就可以将Amazon S3配置为触发AWS Lambda函数。这样,一旦在S3中添加了对象,该对象就会被复制到另一个Amazon S3存储桶中。 Lambda函数中的逻辑可以确定是否复制文件,例如检查以AU开头的文件。