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中保存多份拷贝
  • 高可用
    • 提供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)

区域(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-storage-class

安全性

  • 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前言/
作者
Yance Huang
发布于
2020年12月12日
许可协议