S3协议入门
本文最后更新于:2024年7月6日 早上
前言
S3是AWS服务最早推出的几项服务之一,也是使用最为频繁的几个AWS服务之一。官网文档以及网上文章零零散散看了不少,实际使用中也用过S3的大多数功能,但“纸上得来终觉浅,绝知此事要躬行”,决定给自己挖个坑,结合已读资料和实际使用经验,系统地来梳理一下S3的已有功能。
S3 是什么
- Amazon Simple Storage Service(简称S3),是亚马逊AWS服务在2006年第一个正式对外推出的云计算服务。
- Amazon S3 是互联网存储解决方案。该服务旨在降低开发人员进行网络规模级计算的难度。
Amazon S3 提供了一个简单 Web 服务接口,可用于随时在 Web 上的任何位置存储和检索任何数量的数据。此服务让所有开发人员都能访问同一个具备高扩展性、可靠性、安全性和快速价廉的数据存储基础设施, Amazon 用它来运行其全球的网站网络。此服务旨在为开发人员带来最大化的规模效益。 - 对象存储
- 数据(包括文件/视频/图片)以及相关的源数据都是以对象(objects)的方式来存储的
- 不能以S3来当做操作系统的文件系统
- 对象(object)最大支持5TB
- 高耐用
- Object 提供11个9,99.999999999%的持久性
- 意味着每一亿个object才会丢失一个object
- S3存储的对象会在同一个Region的多个AZ中保存多份拷贝
- Object 提供11个9,99.999999999%的持久性
- 高可用
- 提供99.99%的可用性
- 高扩展
- 提供无限的存储空间
- 基于WEB
- 上传和下载数据基于HTTP/HTTPS请求
- 安全性
- 可以选择多种方式来加密数据
- 计费模式
- Pay as you go - Pay only for what you use
S3 能用来做什么
- 备份
- 存储内容
- 大数据分析
- 挂载静态网站
- 灾难恢复
S3桶(Bucket)
- Bucket就是用来存储对象(object)的一个集合
- Bucket和Object都是资源(resources), 也就是aws能操作的一个实体(entity)
- 可以容纳无限的Object
- 默认一个账户可以创建100个bucket,这个上限是软性限制,可以通过向AWS提交case来提高上限
- Bucket需要归属于某个Region,不是Global的。虽然S3的web console页面是Global的。
- Bucket由附属的子资源(subresources)来定义bucket的配置
S3 命名空间(Namespace)
- S3需要唯一的命名空间
- Bucket名字必须在AWS的整个S3生态中是唯一的,而不仅仅是只在Region中唯一。
- 访问Bucket的方式
- Virtual
- Path
- Bucket名字必须要全局唯一的原因就是因为Bucket名字也会是域名的一部分
区域(Region)
- Region就是bucket实际存放的位置
- 存放在某个Region的Object永远不会离开这个Region,除非你显式地将它传输出去
- 选取Bucket的Region的时候,需要考虑延迟,费用等因素。因为建造和运营成本不同,AWS各个Region的S3费用并不相同。而一般来说,选择最近的Region,延迟就越小。
对象Object
- S3是一个可以存储近似无限数量Object的Key-Value存储系统
- Object包括如下元素
- Key - object的名字
- Value - 存储的数据,大小范围是0~5TB
- Version ID - 当versioning功能开启后,每个Object都会拥有一个Version ID,用来区分有相同Key的不同的Object
- Bucket + Key + Version ID 三要素唯一定义了S3中的一个Object
- Metadata - 用来存储Object其他相关信息的Name-value键值对
- Subresources - 定义了一个Object的额外的资源
- Access Control Information - 控制每个对象的访问策略
Object名字
- S3是平面结构的
- 和文件系统不同,S3没有目录
- 可以通过使用prefixed来模拟目录
- Object的键的名称是一序列的 Unicode 字符,它的 UTF-8 编码长度最大为 1024 个字节
- 强烈建议Object的命名要符合DNS命名要求,采用如下字符集
- 字母数字字符 [0-9a-zA-Z]和特殊字符 !、-、_、.、*、’、( 以及 )
对象标签(Object Tagging)
- 利用对象标签,您可以对存储进行分类。每个标签都是一个键-值对
- 例如
- Department=Development
- DeployEnv=demo
- 好处
- 可以支持精细的访问控制
- 可以支持精细的生命周期管理(Lifecycle management)
- 使用S3 Analytics时,可以使用tag来配置筛选条件
- 可以自定义Amazon CloudWatch和CloudTrail的筛选条件
- 例如
子资源(Subresources)
- 子资源
- S3子资源提供了存储和管理Bucket配置信息的支持
- S3子资源只能依附于某一个确定的bucket或者object
- bucket和object可以有一组关联的子资源
- S3子资源必须归属于某个Bucket或者Object,而不能独立存在
- Bucket和Object分别提供了不同的子资源
- Bucket提供的子资源
- 位置(Location)
- 策略(Policy)和访问控制列表(ACL)
- 跨资源共享(CORS)
- 静态网站托管(Static Website Hosting)
- 日志记录(Logging)
- 时间通知(Event Notification)
- 版本控制(Versioning)
- 生命周期(Lifecycle)
- 跨区域复制(Cross-Region Replication)
- 标记(Tagging)
- 下载人员付费(RequestPayment)
- 传输加速(Transfer Acceleration)
- Object提供的子资源
- 访问控制列表(ACL)
- torrent (用于支持BitTorrent协议)
一致性模型(Consistency Model)
- 对put的新object,S3提供了read-after-write的一致性
- read-after-write: 只有在对象成功写入所有的设备,返回成功的返回值后,对象才能被读取
- 对更新和删除操作,S3提供了最终一致性(eventual consistency)
- 正在更新时,此时请求对象,旧数据可能会被返回
- 在删除旧数据时,此时请求对象,旧数据仍然可能会被返回
- 最终一致性(Eventual consistency)提供了低延迟和高吞吐的性能
- S3不提供锁的机制
- 如果两个写操作并发,结果最终会以最后一个为准
- 如果需要类似锁的机制,那只能在使用S3的Application层进行控制
存储类别(Storage Classes/Tiers)
- S3提供了如下几种存储类型
- S3 Standard: 默认的存储类型,提供99.99%可用性,99.999999999%持久性。数据文件会冗余地存储在多个设施的多个设备中。设计目的是可以支持同时两个设施损坏。适合性能敏感的使用案例和需要经常访问的数据。
- S3 Standard - Infrequent Access: 提供99.99%可用性,99.999999999%持久性。 针对需要长期储存且不常访问, 但是需要立即能够访问到的数据 (例如备份以及访问频率已减少的较旧数据) 进行了优化。存储费用比S3 Standard要低,但是每个访问请求的费用要远高于S3 Standard。
- Reduced Redundancy Storage(RRS): 提供99.99%可用性和99.99%的持久性。适用于能再次生成的数据,比如图片的缩略图等。
- Glacier: 最便宜的存储方案,但是没法实时访问数据,必须要先恢复数据后才能进行访问。不适用于需要经常访问的数据。
- S3 提供了生命管理周期(Lifecycle Management)的机制,可以将Object从S3 Standard转换到S3 Standard-Infrequent Access,再到Glacier。也可以在设定的时间过后自动删除object。但需要注意的是,不是一到达设定的时间后就立马开始转换,设定Lifecycle Management后,S3会将需要转换的object标记上转换时间,实际转换时间一般会延后。
- 存储类别之间额比较如下:
安全性
- S3提供了11个9的持久性和99.99%的可用性
- 提供数据的checksums机制,如果数据有损坏,可以使用冗余数据来修复
- 跨域复制(Cross-Region replication)提供了更强的数据保护措施
- 版本控制(Versioning),可以提供额外的保护。开启Versioning后,提供了存储在S3中每个Object的每个版本的恢复能力,即使Object已经被删除。
- S3的Object默认是私有的,只有Bucket和object的拥有者才能访问他们创建的资源
- 可以通过Policies和ACL来授予访问objects和buckets的权限
- S3提供了服务端加密和传输加密的功能
- 所有访问S3 resources的请求都可被记录,用于审计
发送请求的方式
- S3是一个RESTful的web service
- 提供http&https的交互方式
- 通过REST API来发送请求
- 可以通过以下几种方式来操作S3
- AWS Management console
- AWS CLI (Command Line Interface)
- AWS SDK’s (Software Development Kits)
- 操作方式
- GET 对等于 Download/Read
- PUT 对等于 Upload/Write
- DELETE 对等于 Delete
计费
- 使用多少就计费多少的原则
- 计费项目
- 存储(Storage)
- 请求(Requests)
- 数据传输费用(Data Transfer Pricing)
- 数据传输加速(Transfer Acceleration)
- 管理功能(Management Functions)
- Metrics
- 存储类别分析(Storage Class Analysis)
- S3存储清单(S3 Inventory)
延伸阅读
小故事
2017-03-01当天,AWS的一个程序员在调试系统时,输错了一个字母,导致US-EAST-1 region的大量S3服务器被误删除,导致大半个互联网将近瘫痪了4个小时。
问题发生后,AWS的SERVICE HEALTH DASHBOARD却显示Service一切正常。听说是因为Dashboard本身也是依赖于US-EAST-1的S3的, S3出了问题导致Dashboard也出问题了。
从这个小事故中可以看出AWS S3服务应用的普遍程度。
Reference
S3协议入门
https://yance.wiki/S3前言/