当使用亚马逊S3(简单存储服务)时,您可能会使用S3网络控制台来下载、复制或上传文件到S3存储桶。使用控制台是完全可以的,因为它最初就是为此而设计的。
特别是对于习惯于使用鼠标点击而不是键盘命令的管理员来说,网络控制台可能是最简单的方式。然而,管理员最终会遇到需要使用亚马逊S3执行大规模文件操作的需求,比如无人值守文件上传。图形用户界面并不是最适合这种任务的工具。
对于这样的自动化需求,包括亚马逊S3在内的亚马逊网络服务,AWS CLI工具为管理员提供了命令行选项,用于管理亚马逊S3存储桶和对象。
在本文中,您将学习如何使用AWS CLI命令行工具与亚马逊S3上传、复制、下载和同步文件。您还将学习如何提供对您的S3存储桶的访问,并配置该访问配置文件以与AWS CLI工具配合使用。
先决条件
由于这是一篇操作指南文章,在接下来的章节中将包含示例和演示。为了能够成功跟随,您需要满足一些要求。
- 一个AWS账号。如果您还没有现有的AWS订阅,您可以注册一个AWS免费套餐。
- 一个AWS S3存储桶。如果您愿意,可以使用现有的存储桶。但建议创建一个空的存储桶。请参考创建存储桶。
- A Windows 10 computer with at least Windows PowerShell 5.1. In this article, PowerShell 7.0.2 will be used.
- 必须在您的计算机上安装AWS CLI版本2工具。
- 您将上传或与Amazon S3同步的本地文件夹和文件
准备您的AWS S3访问
假设您已经具备所需条件。您可能认为您可以直接开始使用AWS CLI操作S3存储桶了。我是说,如果那是那么简单就好了,是吗?
对于那些刚开始使用Amazon S3或AWS的人,本部分旨在帮助您设置对S3的访问并配置AWS CLI配置文件。
在下面的链接中可以找到有关在AWS中创建IAM用户的完整文档。在您的AWS账户中创建IAM用户
创建具有S3访问权限的IAM用户
在使用CLI访问AWS时,您需要创建一个或多个IAM用户,这些用户具有足够的访问权限,以便您可以使用它们来处理所需的资源。
创建具有访问Amazon S3权限的IAM用户,首先需要登录到您的AWS IAM控制台。在访问管理组下,点击用户。接下来,点击添加用户。

在用户名*框中输入要创建的IAM用户的名称,例如s3Admin。在访问类型*选择中,选中程序化访问。然后,点击下一步:权限按钮。

接下来,点击直接附加现有策略。然后,搜索AmazonS3FullAccess策略名称并选中它。完成后,点击下一步:标签。

在添加标签页面中,创建标签是可选的,您可以直接跳过这一步,点击下一步:审核按钮。

在审核页面,您将看到正在创建的新帐户的摘要。点击创建用户。

最后,一旦用户创建完成,您必须复制访问密钥ID和秘密访问密钥的值并保存以备将来使用。请注意,这是您唯一一次可以看到这些值的时候。

在计算机上设置AWS配置文件
现在您已经创建了具有访问Amazon S3权限的IAM用户,下一步是在您的计算机上设置AWS CLI配置文件。
这一部分假设您已经按照要求安装了AWS CLI版本2工具。对于配置文件的创建,您将需要以下信息:
- IAM用户的访问密钥ID。
- IAM用户关联的秘密访问密钥。
- 与AWS S3存储桶位置对应的默认区域名称。您可以使用此链接查看端点列表。在本文中,AWS S3存储桶位于亚太地区(悉尼),相应的端点是ap-southeast-2。
- 默认输出格式。对于此操作,请使用JSON。
要创建配置文件,请打开PowerShell,输入以下命令并按照提示操作。
输入访问密钥ID、秘密访问密钥、默认区域名称和默认输出名称。请参考以下演示。

测试AWS CLI访问
配置AWS CLI配置文件后,您可以通过在PowerShell中运行以下命令来确认配置文件是否有效。
上述命令应列出您帐户中拥有的Amazon S3存储桶。下面的演示显示了该命令的实际操作。结果显示可用S3存储桶的列表,表明配置文件配置成功。

要了解与Amazon S3特定的AWS CLI命令,您可以访问AWS CLI命令参考S3页面。
管理S3中的文件
使用AWS CLI,可以执行典型的文件管理操作,如将文件上传到S3,从S3下载文件,删除S3中的对象,以及将S3对象复制到另一个S3位置。只需了解正确的命令、语法、参数和选项。
在接下来的部分中,使用的环境包括以下内容。
- 两个S3存储桶,分别是atasync1和atasync2。 下面的截图显示了Amazon S3控制台中现有的S3存储桶。

- 本地目录和位于c:\sync下的文件。

将单个文件上传到S3
当您将文件上传到S3时,可以一次上传一个文件,也可以通过递归上传多个文件和文件夹。根据您的要求,您可以选择您认为合适的一个。
要将文件上传到S3,您需要向aws s3 cp
命令提供两个参数(源和目标)。
例如,要将文件c:\sync\logs\log1.xml上传到atasync1存储桶的根目录,您可以使用以下命令。
注意:使用AWS CLI时,S3存储桶名称始终以S3://为前缀。
运行上述命令在 PowerShell 中,但先更改适合您环境的源和目标。输出应类似于以下演示。

上述演示显示文件名为c:\sync\logs\log1.xml的文件已成功上传到 S3 目标s3://atasync1/而没有错误。
使用以下命令列出 S3 存储桶根目录中的对象。
在 PowerShell 中运行上述命令将产生类似的输出,如下演示所示。如下输出所示,在 S3 位置的根目录中存在文件log1.xml。

递归上传多个文件和文件夹至 S3
上一节向您展示了如何将单个文件复制到 S3 位置。如果您需要从文件夹和子文件夹上传多个文件,该怎么办?您肯定不想为不同的文件名多次运行相同的命令,对吧?
aws s3 cp
命令有一个选项可以递归处理文件和文件夹,这就是--recursive
选项。
例如,目录c:\sync包含 166 个对象(文件和子文件夹)。

使用--recursive
选项,c:\sync文件夹的所有内容都将上传到 S3,同时保留文件夹结构。要进行测试,请使用下面的示例代码,但确保根据您的环境更改源和目标。
你将从下面的代码中注意到,源目录是 c:\sync,目标目录是 s3://atasync1/sync。紧随 S3 存储桶名称之后的 /sync 键指示 AWS CLI 将文件上传到 S3 中的 /sync 文件夹中。如果 S3 中不存在 /sync 文件夹,它将被自动创建。
上述代码将产生以下输出,如下面的演示所示。

选择性地上传多个文件和文件夹到 S3
在某些情况下,上传所有类型的文件并不是最佳选择。例如,当您只需要上传具有特定文件扩展名的文件时(例如,*.ps1)。cp
命令的另外两个选项是 --include
和 --exclude
。
虽然在前一部分使用的命令包括递归上传中的所有文件,但下面的命令将仅包括与 *.ps1 文件扩展名匹配的文件,并排除上传的其他所有文件。
下面的演示显示了执行上述代码时的效果。

另一个例子是,如果您想要包括多个不同的文件扩展名,您将需要多次指定 --include
选项。
下面的示例命令将仅包括 *.csv 和 *.png 文件到复制命令中。
在 PowerShell 中运行上述代码将呈现出与下面示例中所示的类似结果。

从 S3 下载对象
根据您在本节中学到的例子,您也可以执行相反的复制操作。意味着,您可以从S3桶位置下载对象到本地机器。
从S3复制到本地将要求您交换源和目的地的位置。源是S3位置,目的地是本地路径,如下所示。
请注意,上传文件到S3时使用的相同选项在从S3下载对象到本地时也同样适用。例如,使用下面的命令下载所有对象,并使用--recursive
选项。
在S3位置之间复制对象
除了上传和下载文件及文件夹,使用AWS CLI,您还可以在两个S3桶位置之间复制或移动文件。
您会注意到下面的命令使用一个S3位置作为源,另一个S3位置作为目的地。
下面的演示显示了使用上述命令将源文件复制到另一个S3位置。

与S3同步文件和文件夹
到目前为止,您已经学会了如何使用AWS CLI命令在S3中上传、下载和复制文件。在本节中,您将学习AWS CLI为S3提供的另一个文件操作命令,即sync
命令。sync
命令只处理更新的、新的和删除的文件。
有一些情况需要保持 S3 存储桶的内容与服务器上的本地目录同步和更新。例如,您可能有一个要求,需要定期将服务器上的事务日志与 S3 同步。
使用下面的命令,位于本地服务器上 c:\sync 目录下的所有 *.XML 日志文件将同步到 S3 位置 s3://atasync1。
下面的演示显示,在 PowerShell 中运行上述命令后,所有 *.XML 文件都被上传到了 S3 目标位置 s3://atasync1/。

与 S3 同步新文件和更新文件
在下一个示例中,假设修改了日志文件 Log1.xml 的内容。sync
命令应该捕捉到这种修改,并将在本地文件上所做的更改上传到 S3,如下面的演示所示。
要使用的命令仍然与前面的示例相同。

从上面的输出中可以看到,由于只有文件 Log1.xml 在本地发生了变化,它也是唯一同步到 S3 的文件。
与 S3 同步删除操作
默认情况下,sync
命令不处理删除操作。从源位置删除的任何文件都不会从目标位置移除。嗯,除非您使用 --delete
选项。
在下一个示例中,名为 Log5.xml 的文件已从源位置删除。同步文件的命令将附加 --delete
选项,如下面的代码所示。
当您在PowerShell中运行上述命令时,应该还会删除名为Log5.xml的已删除文件的目标S3位置。示例结果如下。

摘要
Amazon S3是存储云文件的优秀资源。通过使用AWS CLI工具,您可以进一步扩展对Amazon S3的利用方式,并开启自动化流程的机会。
在本文中,您已经学会了如何使用AWS CLI工具在本地位置和S3存储桶之间上传、下载和同步文件和文件夹。您还了解到S3存储桶的内容也可以复制或移动到其他S3位置。
使用AWS CLI工具自动化文件管理与Amazon S3可以有许多其他用例场景。您甚至可以尝试将其与PowerShell脚本结合使用,并构建您自己的工具或模块以便重复使用。发掘这些机会并展示您的技能取决于您。