0%

用 AWS S3 搭建个人云存储平台

你可能用过 Dropbox 和百度网盘之类的云存储服务,不过 AWS S3 才是当今世界上最大的云存储。虽然 S3 服务的对象多为企业用户,你同样可以使用它搭建个人云存储平台。在这篇文章中,我们来看看 S3 API 的配置,以及如何使用 s3cmd 工具与 S3 存储服务交互。

S3 的特性和价格

S3 不是会员制的订阅服务,而是像水电一样按使用量计费。费用主要由两个部分组成:

  1. $0.023 每 GB 的存储费,这一部分按月收取。
  2. $0.09 每 GB 的下载费。

与其它云储存服务相比,S3 最大的优势在于靠谱。官方宣称 S3 数据的完整性(不会丢失和破坏)可达小数点后 12 个 9。与百度网盘等免费存储服务相比,S3 没有政策风险,不会有人检查和删除你的数据,也不会有限速和强制安装客户端之类的事情。与 Dropbox / iCloud 等订阅存储服务相比,S3 按需付费的机制在一些情形下更为廉价。S3 便捷和不受限制的共享能力也是一个加分项。

API 配置

每个 AWS 账户可以创建不超过 100 个 S3 存储筐 (bucket)。每个 bucket 的名字都是全球唯一的。在一个 bucket 里面,你可以创建任意多的文件夹,上传和下载文件。这一切操作都可以在浏览器中进行,就像用浏览器打开了一个云端的资源管理器一样。不过,手动维护文件实在是太过辛苦了。我们需要一个能够自动化同步的工具,而 API 的协助是必不可少的。

AWS 使用 IAM (Identity and Access Management) 服务来管理所有 API 的使用。我们要在 IAM 中创建一个独立的“用户”,添加 S3 所需的权限,并获取 access key 和 secret key。下面是图解的详细操作流程:

在 AWS 服务列表中搜索 IAM

进入 IAM 主页,点击左侧的 Users 选项

添加一个新用户

指定用户名,并开启应用程序访问

为用户添加 S3 完全访问权限

回顾当前的设定

下载当前用户的 access key 和 secret key

创建用户时,你只有一次机会查看和下载 secret key。所以请务必下载 csv 文件,并存放在一个安全的地方。如果 secret key 丢失或被盗用,你可以吊销当前的 key 并重新生成一个 access key - secret key 密钥对。

现在你已经拥有了一个可以控制 S3 的用户,并获取了调用 API 所需的 access key 和 secret key。下面就可以使用 s3cmd 工具管理你的存储空间了。

s3cmd 工具的配置和使用

s3cmd 是一个强大的 S3 交互工具。它由 Python 写成,可以通过 pip 安装到个人电脑上。

1
pip install s3cmd

第一次使用 s3cmd 前,需要先填写必要的信息。运行 s3cmd --configure,填入 csv 文件中的 access key 和 secret key,其余选项通常可以使用默认设定。设置结束后,在 $HOME 目录下会出现一个 .s3cfg 文件,里面存储了所有的设置信息。你可以使用文本编辑器进一步修改它。

下面列举了 s3cmd 的基本操作。

创建一个 bucket

1
s3cmd mb s3://bucket-name

显示所有已创建的 bucket

1
s3cmd ls

显示一个 bucket 中的内容

1
2
3
4
5
6
7
# 只显示根目录下的文件和文件夹
s3cmd ls s3://bucket-1

# 显示所有文件和文件夹
# -r 可以用 --recursive 代替,下同
s3cmd ls -r s3://bucket-1
s3cmd la s3://bucket-1

上传文件

1
2
3
4
5
6
7
8
9
10
11
# 上传单个文件
s3cmd put file-1 s3://bucket-1/dir-1/file-1

# 上传整个文件夹
# dir-1 将存放在 dir-2 之下
s3cmd put -r dir-1 s3://bucket-1/dir-2/

# 与 put -r 类似
# 但只上传已修改的文件
# 相当于 Linux 中的 rsync
s3cmd sync dir-1 s3://bucket-1/dir-2/

下载文件

1
2
3
4
5
6
7
8
9
10
# 下载单个文件
s3cmd get s3://bucket-1/dir-1/file-1 file-1

# 下载整个文件夹
# 将在当前路径创建 dir-1 文件夹
s3cmd get -r s3://bucket-1/dir-1

# 下载整个文件夹
# 直接下载内容,不创建 dir-1 文件夹
s3cmd get -r s3://bucket-1/dir-1/

复制文件

1
2
3
4
5
# 复制单个文件
s3cmd cp s3://bucket-1/file-1 s3://bucket-2/file-2

# 复制整个文件夹的内容
s3cmd cp s3://bucket-1/dir-1/ s3://bucket-2/dir-2/

移动文件

1
2
3
4
5
# 移动单个文件
s3cmd mv s3://bucket-1/file-1 s3://bucket-2/file-2

# 移动整个文件夹的内容
s3cmd mv s3://bucket-1/dir-1/ s3://bucket-2/dir-2/

删除文件

1
2
3
4
5
# 删除单个文件
s3cmd rm s3://bucket-1/file-1

# 删除整个文件夹
s3cmd rm -r s3://bucket-1/dir-1/

删除 bucket

1
2
3
4
5
# 删除一个空的 bucket
s3cmd rb s3://bucket-1

# 删除 bucket 和其中的所有内容
s3cmd rb --force s3://bucket-1

有关 s3cmd 的更多信息,可以访问其官方网站 http://s3tools.org/s3cmd