首页 > 解决方案 > 如何利用 shell 脚本和 AWS CLI 每天自动将文件从一个 S3 存储桶复制到另一个存储桶?

问题描述

我想创建一种方法(使用 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”开头的文件并排除其他所有文件,尽可能以自动化方式进行。另外,是否可以排除非常旧的文件?

问题的第二部分是我需要在我的 shell 脚本中添加什么以便尽可能地自动化这个过程,因为“AU”文件每天都会被丢弃在这个文件夹中?

标签: bashamazon-web-servicesshellamazon-s3aws-cli

解决方案


复制对象

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

aws s3 sync命令当然是一种简单的方法,因为它会将任何文件从源复制到目标,而无需具体说明要复制哪些文件。

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

请参阅:使用排除和包含过滤器

您询问了排除旧文件的问题 - 该sync命令将同步所有文件,因此以前复制的任何文件都不会再次复制。默认情况下,除非特别请求,否则从源中删除的任何文件都不会在目标中删除。

自动化

如何自动化?最适合云计算的方法是创建一个AWS Lambda 函数。Lambda 函数可以由Amazon CloudWatch Events 规则定期自动触发。

但是,AWS CLI 并未默认安装在 Lambda 中,因此可能更具挑战性。请参阅:在 AWS Lambda 函数中运行 aws-cli 命令 - Alestic.com

最好让 Lambda 函数自己进行复制,而不是调用 AWS CLI。

另类的想法

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


推荐阅读