
























继上次在 亚马逊云科技 页面试用了 EC2 云主机 之后,最近又试用了 亚马逊云科技 的对象存储服务 Amazon S3。和上次一样,我把试用的过程记录下来,希望对你有用。
在介绍如何使用亚马逊云科技的对象存储服务之前,我们应当建立对象存储的概念。对象存储和我们更为熟悉的文件存储一样,都是存储数据的形式。我们首先回顾一下日常使用的文件存储。
一个文件在操作系统里看起来是个图标,可以拷贝到移动硬盘上、通过网络分享给同伴,可以组织为树形结构:文件放在文件夹中,文件夹又可以放在更高一级的文件夹里。这一切都非常符合人类的直觉,如下图所示:

( ☝ 树状的组织形式 )
文件存储还有一个特点,就是自带元信息,比如文件格式、协议版本、文件大小、访问权限、创建时间等,这些元信息都随着文件的 “图标” 一起携带或者修改。

( ☝ Windows 中显示的文件元信息 )
以二进制角度观察一个文件,就能看到文件的开头部分并不是数据,而是保存着很多元信息。比如 PDF 文件格式,总是以 %PDF 开头,用 xxd 命令查看:
$ xxd dictionary.pdf
00000000: 2550 4446 2d31 2e35 0a25 e2e3 cfd3 0a0a %PDF-1.5.%......
00000010: 3120 3020 6f62 6a0a 3c3c 2f54 7970 6520 1 0 obj.<</Type
00000020: 2f43 6174 616c 6f67 0a2f 5061 6765 7320 /Catalog./Pages
00000030: 3220 3020 520a 2f50 6167 654c 6179 6f75 2 0 R./PageLayou
00000040: 7420 2f54 776f 436f 6c75 6d6e 5269 6768 t /TwoColumnRigh
00000050: 740a 2f4f 7574 6c69 6e65 7320 3636 3320 t./Outlines 663
00000060: 3020 523e 3e0a 656e 646f 626a 0a0a 3636 0 R>>.endobj..66
……
可以看到,文件的开头以 ASCII 码形式记录了文件的格式(PDF)、协议的版本(1.5),还有数据段长度等信息。这些信息随着文件的数据一起复制、传输。
这样的存储方式,对人类非常友好,方便复制、传输、权限控制。但是,在文件数量增多的时候,元信息产生的存储开销便不可忽略,而且按照元信息中的字段 搜寻文件的过程 比如找出一个月内创建的所有文件 会变得非常耗时,从而遇到性能瓶颈。另外,单个文件的大小受到 许多因素限制, 比如 FAT32单个文件大小限制 4GB,最大文件数量:228-19 而不能无限制的增长。
文件就像快递包裹,内容物就是要传送的数据,外包装箱上自带了标签,标签上记录了订单号、寄件人、收件人等与此包裹相关的所有信息。这样包装的好处就是方便运输、派送,方便集中在更大的邮包里,进一步可以放进卡车、集装箱里运输,而且外观符合寄件人和收件人的感受,是最直观的存储方法。

( ☝ 自带标签的快递包裹 )
然而没有免费的午餐,方便总是有代价的:每个包裹都必须包含外面的纸盒和里面的泡沫,还有纸盒内的空隙,这些都是除了内容物以外的开销。当快递包裹数量多起来后,这些开销的数量便不可忽略,加在一起会占据很大的存储空间,使存储效率低下的问题摆在桌面上,于是我们经常会听说 “双11” 时快递站的 “爆仓”。
( ☝ 爆仓的包裹 )
另外,树状的管理结构虽然符合人类组织管理的直觉,但是在寻找单个包裹时,却增加了难度,就像你要去 “快递转运中心” 寻找属于自己的包裹一样,需要按层级找到某一辆卡车、集装箱、邮包,才能找到自己想要的。同样的,寻找单个文件时,必须先找到其上层所有父级目录。
为了解决上述问题,发展出了另一类存储方法。货物 紧密的、平等地 放在一起,没有空隙、没有层级关系。就像宜家的货仓:

( ☝ 宜家的货架 )
宜家展厅内的标签上方白色部分记录了货物的元信息,下方的红色部分则标记了位于仓库里的位置,方便顾客在仓库中寻找。

( ☝ 宜家的标签 )
比如上图中的货物元信息可以表示为:
{
"Catetory": "Children's chair",
"Name": "MAMMUT",
"Colour": "Pink",
"descriptions":[
"Perfect for small children...",
"Easy to assemble,...",
],
"AvailbleColours":[
"Red",
"White",
"Blue"
],
"Price": 799,
"Designers":[
"M Kjelstrup",
"A Ostgaard",
]
}
这些元信息可以贴在货物上,作为货物的基本描述。下面会了解到,对象存储的元信息是随着存储对象一起保存的。
上图标签中的索引位置可以如下表达:
{"SELF_SERVE AREA": "603.823.22", "RACK": 4, "LOC": 4}
很明显这种存储形式的空间效率高,可以存放很大尺寸的货物,不限制货物类型。对应到数据存储上来,就是对存储的数据规模和数据类型不作限制。
又比如停车场,其内容物就是一辆辆紧密排列的汽车,只要停车场面积够大,对车子的类型并没有限制,你可以停放摩托车、小汽车、大卡车甚至坦克、飞机,停放好之后,只需要记录车位的号码就可以随时找到。

( ☝ 车位编号 )
以上就是对象存储的思想。
对象存储的思想总结下来有这些特点:
对象存储的应用场合有
和文件存储一样,对象存储也有符合自身特点的一些术语。了解了对象存储的概念后,就容易明白对象存储的术语了。下面简单介绍:
上面提到,对象存储的数据是扁平化组织的,没有树状的层级结构。这个扁平化组织的 “场地” 就称为 “存储桶”。在存储桶内,对存放内容的数据容量、对象个数、数据格式、数据类型几乎都没有限制,用户不需要考虑底层的种种 限制因素。 比如操作系统类型、物理硬盘的大小 关于 Amazon S3 的存储桶,可以参考 这篇文档。
存储对象就是真实存储的内容,正像前面提到的停车场模型,一个对象只需要两部分:数据和元数据。关于 Amazon S3 的存储对象,可以参考 这篇文档。
获取存储对象的数据,只需要一个数据桶内唯一标识符即可。这个标识符称为 “键”。从这个角度看,可以把数据桶看作从 “键” 到 “存储对象” 的一张映射表。关于 Amazon S3 的键的使用,可以参考 这篇文档。
对象存储的数据桶本质上是一张映射表,修改映射关系的操作相对比较容易,所以对象存储可以很方便的保留数据的每次修改。对于用户来说,备份、还原指定版本都 非常方便。 相比之下,文件系统默认不提供版本控制:同名文件被覆盖后,正常情况下是无法找回的 默认情况下,Amazon S3 禁用版本控制,如果需要可以明确的启用即可。关于 Amazon S3 的版本控制,可以参考 这篇文档。
一种使用 HTTP 访问对象存储的方式,与编程语言无关。当存储服务开放 REST API 后,用户就可以使用客户端或者自己编写程序,以标准的 HTTP 接口方便地创建数据桶、提取存储数据、删除对象等等 操作。 相比之下,文件系统默认不提供 HTTP 接口,对文件的增删改查必须通过操作系统提供的接口。
为了方便用户以编程形式请求 REST API,对象存储服务商还会提供各类编程语言的 SDK 和示例代码。SDK将底层的 HTTP 请求语句封装为简单的语句,大大简化了用户的编程任务。
亚马逊云科技 的 S3 服务是 Simple Storage Service 的简称。Amazon S3 已经成为事实上的行业标准,其他公司在推出对象存储服务时,总是不约而同的声明兼容Amazon S3接口。Amazon S3 提供的存储服务、访问管理、安全性、日志监控等等功能为用户提供了可靠的数据保障。
根据亚马逊云科技的页面显示,目前 Amazon S3 免费试用的配额是:
您可以免费开始使用 Amazon S3。注册后,亚马逊云科技 新客户将每个月获得 S3 Standard 存储类中的 5GB Amazon S3 存储空间、20,000 个 GET 请求、2,000 个 PUT、COPY、POST 或 LIST 请求以及 100 GB 的数据传出量。
为了能顺利试用 Amazon S3 对象存储云服务器,需要事先具备以下条件:
一台联网的电脑
进入控制台后,点击左上角的服务按钮,从菜单中部找到 “存储”,就可以在子菜单里找到 S3,如下图所示:

( ☝ 菜单入口 )
控制台中会列出你当前拥有的存储桶。

( ☝ 存储桶列表 )
如果是第一次访问Amazon S3服务,你名下没有存储桶,会自动跳转到创建存储桶的页面,点击最醒目的橘红色按钮,进入 “创建存储桶” 界面。

( ☝ 创建存储桶按钮 )
然后配置存储桶的各项参数。
存储桶名称在 所在的分区 目前有三个分区:标准区域、中国区域 和 GovCloud (US) 内必须是必须是唯一的,并遵循存储桶命名规则。
最基本的命名规则有:
如果填入非法的名称,会在提交时发出警告:

( ☝ 存储桶名称不能包含大写 )
填入正确的名称:

( ☝ 正确的存储桶名称 )
这里的对象所有权是指桶级别的设置,可以用来控制上传到桶内的对象的所有权。但目前 Amazon S3 中的大多数使用场景都不再要求使用 ACL。所以这里建议将 ACL 保持为默认的禁用状态。
公开访问,即从互联网上访问到存储桶内的对象。对于不同的应用需求,可能需要放开或者关闭公开访问权限。比如,CDN和托管静态网站,就需要放开权限;如果是云备份或是训练数据,则需要关闭公开访问。
默认情况下,Amazon S3 存储桶会关闭公开访问权限。这里暂时先保留默认的关闭公开访问设置。
上面 讲过存储桶的版本控制概念。这里先保留默认的关闭版本控制功能。
接下来可以为存储桶添加标签,用标签可以方便的管理组织多个桶。为存储桶添加标签不是必须的,由于这次仅试用一个桶,所以不添加标签,保留无标签的配置。
任何数据都有一定的私密性,所以在 Amazon S3 服务端硬盘上保存的数据都是经过加密过的。按加密方式的不同,可以是 SSE-S3、SSE-KMS、DSSE-KMS 等。这里使用默认的 SSE-S3 加密类型。
上面 见过,对象存储适合 “一次写入,多次读取” 的应用场合。在这类应用中,往往希望写入的数据不会被再次修改或者覆盖,从而保证数据读取的一致性。这时候可以启用对象锁定设置。对象锁定设置仅适用于受版本控制的存储桶,所以这里保留默认的禁用设置。
当上面的所有设置都完成后,点击页面最下方的橘红色 “创建存储桶” 按钮。会看到绿色的创建成功提示。

( ☝ 成功提示 )
从存储桶的列表中能看到刚刚创建的桶名称:

( ☝ 桶列表 )
成功创建存储桶之后,我们可以看到存储桶有一个目标名称:S3://lfhacks.com

( ☝ 目标名称 )
点击这个目标名称就可以进入存储桶的配置界面。下面来看如何配置存储桶。
在存储桶的详情界面,有一些标签可以用来配置存储桶。

( ☝ 配置存储桶 )
下面逐一查看:
在对象标签页,列出当前桶下所有存储对象的列表。

( ☝ 存储桶配置项 )
存储桶成功创建以后,我们自然希望首先向存储桶中上传数据。点击桶的名称,可以进入到桶中查看对象列表。

( ☝ 对象列表 )
可以看到现在桶里面是没有任何对象。点击上传按钮,可以将本地的文件上传到桶里面。
在上传的界面中,可以将文件拖到虚线框内完成上传动作。

( ☝ 上传界面 )
上传过程中会有传输状态的提示。

( ☝ 上传过程 )
上传结束后提示上传成功。

( ☝ 上传结果 )
返回到对象列表,可以看到刚刚上传的文件,和可用的操作,包括打开、删除、移动、重命名等。

( ☝ 对象列表 )
点击对象的名称,可以进一步查看对象的属性。

( ☝ 对象属性 )
在对象的概览里面有一条叫对象 URL,这个 URL 用于 公开访问。 即从互联网的任何角落都可以匿名访问

( ☝ 对象URL )
但是因为 前面创建桶 的时候,没有允许公开访问,所以这里点击url,会看到提示拒绝访问(Access denied)。

( ☝ 拒绝访问 )
为了能让这个文件从互联网访问,我们需要同时关闭所在桶的ACL和当前账户的ACL:

( ☝ 设置公共访问权限 )
关闭当前账户的ACL

( ☝ 当前账户的ACL )
关闭所在桶的ACL

( ☝ 所在桶的ACL )
这样就可以单独设置该文件的权限

( ☝ 设置单个文件的公开访问权限 )
设置读取权限时,会有警告提示劝你三思。

( ☝ 警告 )
当开启了该文件的公共访问权限后,就可以使用 对象URL 从互联网上不经任何认证访问到该文件。

( ☝ 使用对象URL公开访问文件的效果 )
正如前面所讲,Amazon S3 是扁平的组织结构,而不是类似常见文件系统中所看到的层次结构。但是为了用户使用上的方便,在控制台页面仍然提供了 “创建文件夹” 操作。

( ☝ 创建文件夹界面 )
在上图中,我创建了一个名为 “Folder” 的文件夹。返回对象列表后,就能看到刚刚创建的文件夹:

( ☝ 创建文件夹 )
除了手动创建文件夹的方法以外,还可以在上传界面直接拖入文件夹的方式创建文件夹。

( ☝ 上传文件夹 )
上传文件夹后,返回对象列表界面可以看到刚刚创建的文件夹:

( ☝ 上传文件夹 )
在选中几个对象之后,支持一些操作。除了基本的复制和移动外,有一个比较实用的功能就是“计算总大小”。可以查看所选择对象(包括文件或文件夹)的总占用空间。

( ☝ 对象操作 )
在桶属性的标签页,可以查看到当前桶的基本属性的概述,还可以设置桶的各方面属性:
可以查看桶所在的区域、资源名称和创建日期。

( ☝ 查看桶属性 )
当启用版本控制后,上传一个同名文件并不会覆盖已经存在的文件,而且创建一个新的版本。这样做虽然占用了更多的空间,但是可以避免意外操作,或者方便的保存一个文件的多个快照版本。
另外,版本控制还可以为删除操作设置门槛,必须经过多点认证(MFA)后才可以实施删除操作。为文件的安全存储多了一道保障。

( ☝ 版本控制 )
为方便组织管理,可以为桶添加任意键值对的标签(tag),例如:
| 键 | 值 |
|---|---|
| Project | Tomato |
| Level | Prod |
设置效果如下:

( ☝ 添加标签 )
可以查看当前使用的加密类型:

( ☝ 添加标签 )
在 亚马逊云科技产品免费试用攻略(1) - 注册账户 一文中讲述了利用对象存储开静态网站的方法。可以将整个桶设置为托管静态网站。

( ☝ 设置静态网站托管 )
由于用户需求的多样性,存储桶内的对象如何被外部访问是个复杂的问题。可以由以下三者单独或者共同决定访问逻辑:
权限关系简图如下:
( ☝ S3 存储桶权限设置 )
这个设置是设置在 ACL 和 存储桶策略前方的一道总开关,类似对外部访问的防火墙。可以用来阻止所有的公开访问,不需要再单独使用桶策略和ACL

( ☝ 屏蔽公共访问权限 )
用 JSON 格式精细化的设置单个用户对单个资源的访问权限。基本格式如下:
{
"Version": "2012-10-17",
"Id": "ExamplePolicy01",
"Statement": [
{
"Sid": "ExampleStatement01",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/Akua"
},
"Action": [
"s3:GetObject",
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::amzn-s3-demo-bucket1/*",
"arn:aws:s3:::amzn-s3-demo-bucket1"
]
}
]
}
其中 Statement 条目下有多条策略,每条策略包含以下字段,其含义为:
| 字段名 | 含义 |
|---|---|
| Resource | 本条策略所针对的资源,可以是对象、桶、访问接入点等等 |
| Action | 针对资源的操作,比如列出、获取、等等,可以使用通配符*表示全部操作 |
| Effect | 操作的允许逻辑,可以是 allow 或者 deny |
| Principal | 本条策略所针对的用户 |
| Condition | 满足一定条件下,本条策略生效,例如来源IP地址等 |
访问控制列表(ACL) 用于向其他账户授予基本的读/写权限,这一点类似于 Linux 文件系统的权限控制,根据用户、用户组赋予单个存储对象或者整个桶的权限。

( ☝ 访问控制列表 )
在指标标签页可以查看桶的静态和动态使用情况。例如总大小、对象总数等。

( ☝ 存储桶指标 )
还可以按照自身需求创建自定义的筛选器,将分析的对象缩小到一定的范围内,比如最近一周创建的对象,等等。
为了更方便的访问数据桶,还可以为数据桶创建一个或多个接入点。

( ☝ 创建接入点 )
创建好接入点后,就可以从互联网上沿着接入点访问到桶内的资源。
以上就是这次免费试用 Amazon S3 的过程,只是浮光掠影地感受了 Amazon S3 的冰山一角。希望以后有时间能继续深入地探寻 Amazon S3 的魅力。
最后请注意:当你不再试用对象存储的时候,请记得删除桶,不然如果超过了免费期,会自动从你 注册 时候预留的信用卡中扣除费用。
下一篇将介绍亚马逊云科技的哪款产品,请拭目以待,持续关注。
各位读后有什么想法,请在下方留言吧!如果对本文有疑问或者寻求合作,欢迎 联系邮箱 。邮箱已到剪贴板
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。