Contents

在Linux中使用AWS S3 CLI

1. 简介

在本教程中,我们将了解如何利用Amazon Webservices (AWS) 命令行界面 (CLI) 与 Amazon 的Simple Storage Service 一起工作。

2. 亚马逊S3

通常所说的 S3 是 AWS 提供的一种云托管存储服务,由于其灵活性、可扩展性和耐用性以及相对较低的成本而非常受欢迎。**S3 使用术语对象来指代存储在存储桶中的单个项目,例如文件和图像。**存储桶类似于根文件夹,存储桶中的文件夹称为前缀。

S3 让我们可以完全控制谁可以访问我们的数据以及他们在编辑数据时拥有哪些权限。权限范围从完全可公开访问和可编辑的存储桶到完全私有的。我们甚至可以配置 S3 来托管网站!

让我们看看我们可以使用**AWS S3 CLI **在 S3 上执行的一些常见任务。

3. 在 S3 中创建存储桶

3.1. 在默认区域中创建 S3 存储桶

我们要查看的第一个命令是mb(制作存储桶)命令,它用于在 S3 中创建一个新存储桶。通过使用mb,我们能够在安装 AWS CLI 时选择作为默认区域的区域中创建存储桶:

$ aws s3 mb s3://linux-is-cool

让我们检查输出以确认存储桶已成功创建:

make_bucket: linux-is-cool

我们已经在 S3 中成功创建了一个名为linux-is-cool的存储桶。存储桶将在 CLI 配置期间设置的 AWS 默认区域中创建。

3.2. 在特定区域创建 S3 存储桶

我们可以在任何 AWS 区域中创建存储桶,只需将 region 参数的值添加到我们的基本mb 命令

$ aws s3 mb s3://linux-is-awesome --region eu-central-1

我们再次确认存储桶已成功创建:

make_bucket: linux-is-awesome

我们现在所做的是在指定区域创建一个名为linux-is-awesome的存储桶。

4. 列出桶

4.1. 列出所有可用的存储桶

现在我们已经创建了几个存储桶,让我们看看如何使用ls (list) 命令获取 S3 中所有存储桶的列表

$ aws s3 ls

这是ls 命令的基本形式,我们从其执行中得到的输出是 S3 中所有存储桶的列表以及每个存储桶的创建日期和时间:

2019-11-16 19:10:17  linux-is-awesome
2019-11-16 19:09:59  linux-is-cool

4.2. 列出特定存储桶根目录中的项目

假设我们只对特定存储桶的内容感兴趣。我们可以通过将存储桶名称添加为参数来改进基本ls命令以获取该特定存储桶的详细信息。这为我们提供了该存储桶根中包含的项目的视图:

$ aws s3 ls s3://linux-is-awesome

让我们看看这次的输出是什么样子的:

                    PRE      subFolder/
2019-11-16 19:53:53 232059   README.md
2019-11-16 20:03:22 0        delete-me
2019-11-16 19:54:50 5242880  output.log

还会返回每个对象的创建日期和时间以及大小。前缀(文件夹)在详细信息列中由“PRE”表示,并且没有为其返回创建日期或大小。

4.3. 列出特定存储桶中的所有项目

将存储桶名称添加到ls命令仅返回存储桶根目录的内容。幸运的是,我们可以在使用ls命令时递归地列出存储桶的所有内容:

$ aws s3 ls s3://linux-is-awesome --recursive --human-readable

这个命令中发生了一些额外的事情,所以让我们分解一下。首先,我们添加了*–recursive标志,它告诉ls命令递归地列出linux-is-awesome*存储桶的所有前缀(文件夹)中的所有对象。

我们进一步包含的是*–human-readable*标志,它以人类可读的格式返回对象大小。让我们看看这个命令的输出:

2019-11-16 19:53:53  226.6 KiB   README.md
2019-11-16 20:03:22  0 Bytes     delete-me
2019-11-16 19:54:50  5.0 MiB     output.log
2019-11-16 19:53:47  226.6 KiB   subFolder/README.md

正如预期的那样,我们会看到存储桶中每个对象的列表以及人类可读格式的对象大小。

5. 删除 S3 存储桶

5.1. 删除空的 S3 存储桶

有时我们想删除一个空桶。这就是rb(删除存储桶)命令发挥作用的时候:

$ aws s3 rb s3://linux-is-cool

我们只需将要删除的存储桶的名称传递给rb命令。只有当桶为空时,rb命令才会删除桶。

我们收到的输出确认存储桶已被删除:

remove_bucket: linux-is-cool

5.2. 强制删除 S3 存储桶

我们已经看到了如何使用rb命令的基本形式来删除一个空的桶。删除不为空的存储桶怎么办?

我们可以通过在rb命令中添加–force*标志来删除包含对象的存储桶*。这将强制移除存储桶:

$ aws s3 rb s3://bucket-with-objects --force

与往常一样,我们检查输出以确认命令已成功执行。我们在此实例中获得的输出将列出在存储桶本身最终被删除之前被删除的每个单独对象:

delete: s3://bucket-with-objects/console.log
delete: s3://bucket-with-objects/catalina.out
remove_bucket: bucket-with-objects

使用–force标志时必须小心,因为一旦命令成功执行,我们将无法恢复数据

6. 使用对象和桶

我们花了一些时间了解如何创建和操作存储桶。现在让我们看看如何使用 S3 CLI 处理 S3 中的对象。

6.1.将文件复制到存储桶

我们可以使用cp(复制)命令将文件从本地目录复制到 S3 存储桶。

我们为cp命令提供本地文件(源)的名称以及我们要将文件复制到的 S3 存储桶(目标)的名称:

$ aws s3 cp new.txt s3://linux-is-awesome

命令完成后,我们会确认文件对象已成功上传:

upload: .\new.txt to s3://linux-is-awesome/new.txt

我们可以更进一步,使用这个简单的命令给我们复制到 S3 的文件一个新名称。我们可以通过在执行复制时指定新文件名来实现这一点。让我们看看它是如何工作的:

$ aws s3 cp new.txt s3://linux-is-awesome/new-from-local.txt

我们现在所做的是将我们的new.txt上传到linux-is-awesome存储桶并将其重命名为new-from-local.txt

它不止于此。我们可以使用cp命令将对象从一个存储桶复制到另一个存储桶。在本例中,我们将指定一个存储桶作为源位置和目标位置:

$ aws s3 cp s3://linux-is-awesome/new-from-local.txt s3://a-back-up-bucket/file.txt

和以前一样,我们检查输出以确认一切正常:

copy: s3://linux-is-awesome/new-from-local.txt to s3://a-back-up-bucket/file.txt

6.2. 从存储桶中复制对象

** cp命令还可用于从 S3 存储桶中检索对象并将其存储在本地。**

我们再次使用cp命令,但这一次,我们将存储桶名称和对象键作为源,并使用我们的本地目录作为目标:

$ aws s3 cp s3://linux-is-awesome/new-from-local.txt copied-from-s3.txt

确认输出将告诉我们 S3 对象new-from-local.txt已下载到当前文件夹并重命名为copy-from-s3.txt

download: s3://linux-is-awesome/new-from-local.txt to .\copied-from-s3.txt

6.3. 移动对象

现在让我们看一下mv(移动)命令。** mv命令用于在使用 S3 存储桶时移动对象。**与cp命令一样,我们可以使用mv命令在存储桶之间移动项目,或者在存储桶和本地文件夹之间移动项目。

** mv命令的基本形式将源作为第一个参数,然后将目标作为第二个参数**。让我们看一个将本地文件移动到存储桶的示例:

$ aws s3 mv my-local-file.log s3://linux-is-awesome/moved-from-local.log

然后我们检查确认我们的文件已成功移动的输出:

move: .\my-local-file.log to s3://linux-is-awesome/moved-from-local.log

将文件从 S3 存储桶移动到我们的本地文件夹同样容易。让我们将move-from-local.log文件移回我们的本地文件夹:

$ aws s3 mv s3://linux-is-awesome/moved-from-local.log .

我们选择在上面的命令中只指定目标目录,并且没有指定文件的名称。我们期望的是该文件将被移动到我们的本地目录,其名称与以前相同——moved-from-local.log。我们的输出将证实这一点:

move: s3://linux-is-awesome/moved-from-local.log to .\moved-from-local.log

我们也可以使用相同的方法在存储桶之间移动对象

请记住使用ls命令查看存储桶中的项目,以确认文件已相应移动。

6.4. 删除对象

现在,我们将研究使用rm(删除)命令从存储桶中删除对象。

这是一个简单的命令,我们只需要指定要删除的对象的位置:

$ aws s3 rm s3://linux-is-awesome/delete-me

而且,像往常一样通过 CLI 执行命令时,我们会确认操作已成功完成:

delete: s3://linux-is-awesome/delete-me

7. 在 S3 上托管网站

S3 不仅仅是存储。我们可以使用独特的 S3 功能,使我们能够使用 S3 存储桶来托管网站。我们需要以特定方式配置我们的存储桶以启用此功能。让我们看一下网站命令

$ aws s3 website s3://linux-is-cool --index-document index.html --error-document error.html

** website命令指示 S3将存储桶配置为像网站一样运行**。我们还添加了两个关键参数:index-document很重要,因为它告诉 S3 将哪个页面用作我们网站访问者的默认登录页面,而error-document告诉 S3 哪个页面用作默认错误页面。存储桶权限是自动处理的。

S3 托管网站的默认 URL 采用以下形式:

http://<bucket-name>.s3-website-<region>.amazonws.com

因此,如果我们的示例存储桶linux-is-cool托管在us-east-1区域,则网站 URL 将是:

http://linux-is-cool.s3-website-us-east-1.amazonws.com

如果我们已经正确配置了所有内容,那么当我们导航到 URL 时将加载index.html文件。请记住,虽然我们有这个漂亮的功能,但它不是托管网站的推荐方法。我们将使用另一个名为 CloudFront 的 AWS 服务以及 Route 53 和 Certificate Manager 在 S3 上托管一个安全网站。