使用AWS CLI将文件上传到S3:全面指南

当使用亚马逊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 Users Menu

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

Set IAM user details

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

Assign IAM user permissions

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

IAM user tags

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

IAM user summary

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

IAM user key credentials

在计算机上设置AWS配置文件

现在您已经创建了具有访问Amazon S3权限的IAM用户,下一步是在您的计算机上设置AWS CLI配置文件。

这一部分假设您已经按照要求安装了AWS CLI版本2工具。对于配置文件的创建,您将需要以下信息:

  • IAM用户的访问密钥ID
  • IAM用户关联的秘密访问密钥
  • 与AWS S3存储桶位置对应的默认区域名称。您可以使用此链接查看端点列表。在本文中,AWS S3存储桶位于亚太地区(悉尼),相应的端点是ap-southeast-2
  • 默认输出格式。对于此操作,请使用JSON

要创建配置文件,请打开PowerShell,输入以下命令并按照提示操作。

aws configure

输入访问密钥ID、秘密访问密钥、默认区域名称默认输出名称。请参考以下演示。

Configure an AWS CLI profile

测试AWS CLI访问

配置AWS CLI配置文件后,您可以通过在PowerShell中运行以下命令来确认配置文件是否有效。

aws s3 ls

上述命令应列出您帐户中拥有的Amazon S3存储桶。下面的演示显示了该命令的实际操作。结果显示可用S3存储桶的列表,表明配置文件配置成功。

List S3 buckets

要了解与Amazon S3特定的AWS CLI命令,您可以访问AWS CLI命令参考S3页面。

管理S3中的文件

使用AWS CLI,可以执行典型的文件管理操作,如将文件上传到S3,从S3下载文件,删除S3中的对象,以及将S3对象复制到另一个S3位置。只需了解正确的命令、语法、参数和选项。

在接下来的部分中,使用的环境包括以下内容。

  • 两个S3存储桶,分别是atasync1atasync2。 下面的截图显示了Amazon S3控制台中现有的S3存储桶。
List of available S3 bucket names in the Amazon S3 console
  • 本地目录和位于c:\sync下的文件。
Local Directory

将单个文件上传到S3

当您将文件上传到S3时,可以一次上传一个文件,也可以通过递归上传多个文件和文件夹。根据您的要求,您可以选择您认为合适的一个。

要将文件上传到S3,您需要向aws s3 cp命令提供两个参数(源和目标)。

例如,要将文件c:\sync\logs\log1.xml上传到atasync1存储桶的根目录,您可以使用以下命令。

aws s3 cp c:\sync\logs\log1.xml s3://atasync1/

注意:使用AWS CLI时,S3存储桶名称始终以S3://为前缀。

运行上述命令在 PowerShell 中,但先更改适合您环境的源和目标。输出应类似于以下演示。

Upload file to S3

上述演示显示文件名为c:\sync\logs\log1.xml的文件已成功上传到 S3 目标s3://atasync1/而没有错误。

使用以下命令列出 S3 存储桶根目录中的对象。

aws s3 ls s3://atasync1/

在 PowerShell 中运行上述命令将产生类似的输出,如下演示所示。如下输出所示,在 S3 位置的根目录中存在文件log1.xml

List the uploaded file in S3

递归上传多个文件和文件夹至 S3

上一节向您展示了如何将单个文件复制到 S3 位置。如果您需要从文件夹和子文件夹上传多个文件,该怎么办?您肯定不想为不同的文件名多次运行相同的命令,对吧?

aws s3 cp命令有一个选项可以递归处理文件和文件夹,这就是--recursive选项。

例如,目录c:\sync包含 166 个对象(文件和子文件夹)。

The folder containing multiple files and sub-folders

使用--recursive选项,c:\sync文件夹的所有内容都将上传到 S3,同时保留文件夹结构。要进行测试,请使用下面的示例代码,但确保根据您的环境更改源和目标。

你将从下面的代码中注意到,源目录是 c:\sync,目标目录是 s3://atasync1/sync。紧随 S3 存储桶名称之后的 /sync 键指示 AWS CLI 将文件上传到 S3 中的 /sync 文件夹中。如果 S3 中不存在 /sync 文件夹,它将被自动创建。

aws s3 cp c:\sync s3://atasync1/sync --recursive

上述代码将产生以下输出,如下面的演示所示。

Upload multiple files and folders to S3

选择性地上传多个文件和文件夹到 S3

在某些情况下,上传所有类型的文件并不是最佳选择。例如,当您只需要上传具有特定文件扩展名的文件时(例如,*.ps1)。cp 命令的另外两个选项是 --include--exclude

虽然在前一部分使用的命令包括递归上传中的所有文件,但下面的命令将仅包括与 *.ps1 文件扩展名匹配的文件,并排除上传的其他所有文件。

aws s3 cp c:\sync s3://atasync1/sync --recursive --exclude * --include *.ps1

下面的演示显示了执行上述代码时的效果。

Upload files that matched a specific file extension

另一个例子是,如果您想要包括多个不同的文件扩展名,您将需要多次指定 --include 选项。

下面的示例命令将仅包括 *.csv 和 *.png 文件到复制命令中。

aws s3 cp c:\sync s3://atasync1/sync --recursive --exclude * --include *.csv --include *.png

在 PowerShell 中运行上述代码将呈现出与下面示例中所示的类似结果。

Upload files with multiple include options

从 S3 下载对象

根据您在本节中学到的例子,您也可以执行相反的复制操作。意味着,您可以从S3桶位置下载对象到本地机器。

从S3复制到本地将要求您交换源和目的地的位置。源是S3位置,目的地是本地路径,如下所示。

aws s3 cp s3://atasync1/sync c:\sync

请注意,上传文件到S3时使用的相同选项在从S3下载对象到本地时也同样适用。例如,使用下面的命令下载所有对象,并使用--recursive选项。

aws s3 cp s3://atasync1/sync c:\sync --recursive

在S3位置之间复制对象

除了上传和下载文件及文件夹,使用AWS CLI,您还可以在两个S3桶位置之间复制或移动文件。

您会注意到下面的命令使用一个S3位置作为源,另一个S3位置作为目的地。

aws s3 cp s3://atasync1/Log1.xml s3://atasync2/

下面的演示显示了使用上述命令将源文件复制到另一个S3位置。

Copy objects from one S3 location to another S3 location

与S3同步文件和文件夹

到目前为止,您已经学会了如何使用AWS CLI命令在S3中上传、下载和复制文件。在本节中,您将学习AWS CLI为S3提供的另一个文件操作命令,即sync命令。sync命令只处理更新的、新的和删除的文件。

有一些情况需要保持 S3 存储桶的内容与服务器上的本地目录同步和更新。例如,您可能有一个要求,需要定期将服务器上的事务日志与 S3 同步。

使用下面的命令,位于本地服务器上 c:\sync 目录下的所有 *.XML 日志文件将同步到 S3 位置 s3://atasync1

aws s3 sync C:\sync\ s3://atasync1/ --exclude * --include *.xml

下面的演示显示,在 PowerShell 中运行上述命令后,所有 *.XML 文件都被上传到了 S3 目标位置 s3://atasync1/

Synchronizing local files to S3

与 S3 同步新文件和更新文件

在下一个示例中,假设修改了日志文件 Log1.xml 的内容。sync 命令应该捕捉到这种修改,并将在本地文件上所做的更改上传到 S3,如下面的演示所示。

要使用的命令仍然与前面的示例相同。

Synchronizing changes to S3

从上面的输出中可以看到,由于只有文件 Log1.xml 在本地发生了变化,它也是唯一同步到 S3 的文件。

与 S3 同步删除操作

默认情况下,sync 命令不处理删除操作。从源位置删除的任何文件都不会从目标位置移除。嗯,除非您使用 --delete 选项。

在下一个示例中,名为 Log5.xml 的文件已从源位置删除。同步文件的命令将附加 --delete 选项,如下面的代码所示。

aws s3 sync C:\sync\ s3://atasync1/ --exclude * --include *.xml --delete

当您在PowerShell中运行上述命令时,应该还会删除名为Log5.xml的已删除文件的目标S3位置。示例结果如下。

Synchronize file deletions to S3

摘要

Amazon S3是存储云文件的优秀资源。通过使用AWS CLI工具,您可以进一步扩展对Amazon S3的利用方式,并开启自动化流程的机会。

在本文中,您已经学会了如何使用AWS CLI工具在本地位置和S3存储桶之间上传、下载和同步文件和文件夹。您还了解到S3存储桶的内容也可以复制或移动到其他S3位置。

使用AWS CLI工具自动化文件管理与Amazon S3可以有许多其他用例场景。您甚至可以尝试将其与PowerShell脚本结合使用,并构建您自己的工具模块以便重复使用。发掘这些机会并展示您的技能取决于您。

进一步阅读

Source:
https://adamtheautomator.com/upload-file-to-s3/