Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

Amazon S3 简介

本 Amazon Simple Storage Service 简介旨在向您介绍此 Web 服务的详细摘要。在阅读本部分之后,您应当对 Web 服务提供的内容及其如何适应您的业务有比较深入的了解。

Amazon S3 和本指南的概述

Amazon S3 提供了一个简单 Web 服务接口,可用于随时在 Web 上的任何位置存储和检索任何数量的数据。

本指南介绍如何发送请求以创建存储桶、如何存储和检索对象,以及如何管理资源的权限。本指南还介绍访问控制和身份验证过程。访问控制定义哪些人可以访问 Amazon S3 中的对象和存储桶以及访问类型 (例如,READ 和 WRITE)。身份验证过程验证尝试访问 Amazon Web Services (AWS) 的用户的身份。

Amazon S3 的优势

Amazon S3 特意内置了着重于简易性和稳健性的最小功能集。以下是 Amazon S3 服务的一些优势:

  • 创建存储桶 – 创建和命名存储数据的存储桶。存储桶是 Amazon S3 中用于数据存储的基础容器。

  • 在存储桶中存储数据 – 在存储桶中存储无限量的数据。可将所需数量的对象上传到 Amazon S3 存储桶。每个对象可包含最多 5 TB 的数据。使用开发人员分配的唯一键值存储和检索每个对象。

  • 下载数据 – 下载您的数据或允许其他人进行下载。随时下载您的数据或允许其他人执行相同的操作。

  • 权限 - 对于要在您的 Amazon S3 存储桶中上传或下载数据的其他人员,您可以授予其访问权限或拒绝其访问。将上传和下载的许可授予三种类型的用户。身份验证机制可帮助确保数据安全,以防未授权访问。

  • 标准接口 – 使用基于标准的 REST 和 SOAP 接口,它们可与任何 Internet 开发工具包搭配使用。

    注意

    HTTP 上的 SOAP 支持已弃用,但是仍可在 HTTPS 上使用。对于 SOAP 将不支持新 Amazon S3 功能。我们建议您使用 REST API 或 AWS 开发工具包。

Amazon S3 概念

本部分介绍了有效使用 Amazon S3 必需了解的主要概念和术语。这些概念和术语是按照您最有可能遇到它们的顺序显示的。

存储桶

存储桶是 Amazon S3 中用于存储对象的容器。每个对象都储存在一个存储桶中。例如,如果名为 photos/puppy.jpg 的对象存储在 johnsmith 存储桶中,则可使用 URL http://johnsmith.s3.amazonaws.com/photos/puppy.jpg 对该对象进行寻址

存储桶有以下几种用途:组织最高等级的 Amazon S3 命名空间、识别负责存储和数据传输费用的账户、在访问控制中发挥作用以及用作使用率报告的汇总单位。

您可以配置存储桶,以便在特定区域进行创建。有关详细信息,请参阅存储桶和区域。您也可以配置存储桶,以便在每次向它添加对象时,Amazon S3 都会生成一个唯一的版本 ID 并将其分配给对象。有关详细信息,请参阅版本控制

有关存储桶的更多信息,请参阅 使用 Amazon S3 存储桶

对象

对象是 Amazon S3 中存储的基本实体。对象由对象数据和元数据组成。数据部分对 Amazon S3 不透明。元数据是一组描述对象的名称-值对。其中包括一些默认元数据 (如上次修改日期) 和标准 HTTP 元数据 (如 Content-Type)。您还可以在存储对象时指定自定义元数据。

在存储桶中,对象将由键 (名称) 和版本 ID 进行唯一地标识。有关详细信息,请参阅版本控制

键是指存储桶中对象的唯一标识符。存储桶内的每个对象都只能有一个键。由于将存储桶、键和版本 ID 组合在一起可唯一地标识每个对象,可将 Amazon S3 视为一种“存储桶 + 键 + 版本”与对象本身间的基本数据映射。将 Web 服务终端节点、存储桶名、键和版本 (可选) 组合在一起,可唯一地寻址 Amazon S3 中的每个对象。例如,在 URL http://doc.s3.amazonaws.com/2006-03-01/AmazonS3.wsdl 中,“doc”是存储桶的名称,而“2006-03-01/AmazonS3.wsdl”是键。

区域

您可以选择一个地理区域供 Amazon S3 存储您创建的存储桶。您可以选择一个区域,以优化延迟、最大限度地降低成本并满足法规要求。Amazon S3 当前支持以下区域:

  • 美国东部(弗吉尼亚北部)地区 使用在弗吉尼亚北部的 Amazon S3 服务器

  • 美国东部(俄亥俄)区域 使用在俄亥俄州哥伦布的 Amazon S3 服务器

  • 美国西部(加利福利亚北部)区域 使用在加利福尼亚北部的 Amazon S3 服务器

  • 美国西部(俄勒冈)区域 使用在俄勒冈的 Amazon S3 服务器

  • 加拿大 (中部) 区域 使用在蒙特利尔的 Amazon S3 服务器

  • 亚太地区(孟买)区域 使用在孟买的 Amazon S3 服务器

  • 亚太区域(首尔) 使用在首尔的 Amazon S3 服务器

  • 亚太区域(新加坡) 使用在新加坡的 Amazon S3 服务器

  • 亚太区域(悉尼) 使用在悉尼的 Amazon S3 服务器

  • 亚太区域(东京) 使用在东京的 Amazon S3 服务器

  • 欧洲(法兰克福)区域 使用位于法拉克福的 Amazon S3 服务器

  • 欧洲(爱尔兰)区域 使用在爱尔兰的 Amazon S3 服务器

  • 欧洲 (伦敦) 区域 使用在伦敦的 Amazon S3 服务器

  • 南美洲(圣保罗)区域 使用在圣保罗的 Amazon S3 服务器

在某一区域存储的对象将一直留在该区域,除非您特意将其传输到另一区域。例如,在 欧洲(爱尔兰) 区域存储的对象将一直留在该区域。有关 Amazon S3 区域和终端节点的更多信息,请访问 AWS 一般参考 中的 区域和终端节点

Amazon S3 数据一致性模型

Amazon S3 在所有区域为 S3 存储桶中的新对象的 PUTS 提供写后读一致性,不过有一条说明。说明如下,如果在创建对象之前对键名发出 HEAD 或 GET 请求 (查看该对象是否存在) Amazon S3 提供写后读最终一致性。

Amazon S3 在所有区域提供最终一致性用于覆盖 PUTS 和 DELETES。

单个键的更新是原子更新。例如,如果您对一个现有键执行 PUT 操作,则后续读取可能会返回旧数据或已更新的数据,但它永远不会写入损坏的数据或部分数据。

Amazon S3 通过在卓越亚马逊数据中心内的多个服务器之间复制数据,从而实现高可用性。如果 PUT 请求成功,则数据已安全存储。但是,有关更改的信息必须在 Amazon S3 间进行复制,这可能需要一些时间,因此您可能会观察到以下行为:

  • 这是一个过程,会将一个新对象写入 Amazon S3,并立即列出其存储桶内的键。在充分传播此更改前,此对象可能不会显示在列表中。

  • 这是一个过程,会替换一个现有的对象,并立即尝试读取此对象。在充分传播此更改前,Amazon S3 可能会返回先前的数据。

  • 这是一个过程,会删除一个现有的对象,并立即尝试读取此对象。在充分传播此删除前,Amazon S3 可能会返回删除的数据。

  • 这是一个过程,会删除一个现有的对象,并立即列出其存储桶内的键。在充分传播此删除前,Amazon S3 可能会列出删除的对象。

注意

Amazon S3 目前不支持对象锁定。如果同时对同一键发出两个 PUT 请求,则以带有最新时间戳的请求为准。如果这会导致问题,您需要在应用程序中创建对象锁定机制。

更新是基于键值的;无法跨键值实现原子更新。例如,无法根据一个键值的更新对另一个键值进行更新,除非将此功能设计到应用程序中。

下表描述了最终一致性读取和一致性读取的特征。

最终一致性读取 一致性读取
过时读取可能性 无过时读取
最低读取延迟 潜在的更高读取延迟
最高读取吞吐量 潜在的更低读取吞吐量

并发应用程序

本节提供了在多个客户端写入同一项目时,最终一致性读取和一致性读取请求的示例。

在本示例中,W1 (写入 1) 和 W2 (写入 2) 会在 R1 (读取 1) 和 R2 (读取 2) 启动之前完成。为了实现一致性读取,R1 和 R2 都会返回 color = ruby。为了实现最终一致性读取,R1 和 R2 可能会返回 color = redcolor = ruby 或无结果,具体取决于耗费的时间。

在下一个示例中,W2 不会在 R1 启动之前完成。因此,R1 可能会为一致性读取或最终一致性读取返回 color = rubycolor = garnet。此外,根据耗费的时间,最终一致性读取可能不会返回结果。

为了实现一致性读取,R2 会返回 color = garnet。为了实现最终一致性读取,R2 可能会返回 color = rubycolor = garnet 或无结果,具体取决于耗费的时间。

在最后一个示例中,客户端 2 会在 Amazon S3 为 W1 返回成功结果之前执行 W2,因此最终值的结果未知 (color = garnetcolor = brick)。接下来的任意读取 (一致性读取或最终一致性读取) 可能会返回二者中的任意值。此外,根据耗费的时间,最终一致性读取可能不会返回结果。

特色

本部分介绍重要的 Amazon S3 功能。

低冗余存储

客户可以使用 Amazon S3 低冗余存储 (RRS) 选项存储其数据。RRS 允许客户以低于 Amazon S3 标准存储的冗余级别存储非关键性、可再生的数据,从而降低成本。它提供了一种经济实惠、可用性高的解决方案来分配或共享在其他位置耐久存储的内容,或者用于存储缩略图、转码媒体或其他可轻松复制的处理数据。RRS 选项在多个设施间的多个设备上存储对象,提供的持久性是典型磁盘驱动器的 400 倍,但复制对象的次数不像标准 Amazon S3 存储那样多,因此更加经济高效。

RRS 可以在特定年度内为对象提供 99.99% 的持久性。这种耐久性级别对应的平均年对象损失率预计为 0.01%。

与标准 Amazon S3 存储相比,对使用 RRS 的收费更低。有关定价信息,请参阅 Amazon S3 定价

有关更多信息,请参阅 存储类别

存储桶策略

基于各种条件,包括 Amazon S3 操作、请求者、资源和请求的其他方面 (例如,IP 地址),存储桶策略可提供对存储桶和对象的集中访问控制。这些策略使用访问策略语言进行描述并且允许对许可进行集中管理。附加到存储桶的许可适用于该存储桶中的所有对象。

个人和公司都可以使用存储桶策略。在公司向 Amazon S3 进行注册时,它们会创建一个账户。然后,该公司即等同于此账户。账户在财务上承担支付公司 (及其员工) 所创建的 Amazon 资源的责任。账户有权基于各种条件,授予存储桶策略许可以及分配员工许可。例如,账户可以创建一个策略,授予用户对以下内容的写入权限:

  • 特殊的 S3 存储桶

  • 从账户的企业网络

  • 在工作时间

  • 从账户的自定义应用程序 (由用户代理字符串识别)

账户不仅可以授予应用程序有限的读取和写入访问权限,还可以允许其他人创建和删除存储桶。账户允许多个现场办公室将他们的日常报告存储在单个存储桶中,并使每个办公室仅可以从办公室的 IP 地址范围写入特定的名称集 (例如,“Nevada/*”或“Utah/*”)。

与仅可以为单个对象添加 (授予) 许可的访问控制列表 (如下所述) 不同,策略可以为存储桶内的所有对象 (或子集) 添加或拒绝许可。在一个请求中,账户可以为存储桶内任意数量的对象设置权限。账户可以对Amazon 资源名称 (ARN) 和其他值使用通配符 (类似于正则表达式操作符),从而控制对以常见前缀开头或以指定扩展名 (例如,.html) 结尾的对象组的访问权限。

仅允许存储桶拥有者将策略与存储桶关联。采用访问策略语言编写的策略将基于以下条件允许拒绝请求:

  • Amazon S3 存储桶操作 (如 PUT ?acl)和对象操作 (如 PUT ObjectGET Object)

  • 请求者

  • 在策略中指定的条件

账户可以基于特定的 Amazon S3 操作 (如 GetObjectGetObjectVersionDeleteObjectDeleteBucket) 控制访问权限。

这些条件可以是 IP 地址、CIDR 表示中的 IP 地址范围、日期、用户代理、HTTP 引用站点和传输 (HTTP 和 HTTPS)。

有关更多信息,请参阅 使用存储桶策略和用户策略。

AWS Identity and Access Management

例如,您可以将 IAM 用于 Amazon S3,控制用户或用户组对您的 AWS 账户所拥有 Amazon S3 存储段的具体部分的访问类型。

有关 IAM 的更多信息,请参阅下文:

访问控制列表

有关更多信息,请参阅 使用 ACL 管理访问

版本控制

有关更多信息,请参阅 对象版本控制

操作

下面是您将通过 API 执行的最常见操作。

常见操作

  • 创建存储桶 – 创建和命名要在其中存储对象的您自己的存储桶。

  • 写入对象 – 通过创建或覆盖对象存储数据。在编写对象时,在存储桶的命名空间中指定唯一键值。此时,也适合为对象指定任何您想要的访问控制。

  • 读取对象 – 读回数据。您可以通过 HTTP 或 BitTorrent 下载数据。

  • 删除对象 – 删除您的某些数据。

  • 列出键 – 列出包含在某个存储桶中的键。您可以基于前缀筛选键列表。

有关此内容以及其他所有功能的详细信息在本指南的后续部分有详细介绍。

Amazon S3 应用程序编程接口 (API)

Amazon S3 架构的设计与编程语言无关,它使用我们支持的接口来存储和检索对象。

Amazon S3 提供 REST 和 SOAP 接口。它们非常相似,但也有某些不同。例如,在 REST 接口中,元数据在 HTTP 标头中返回。由于我们仅支持最大 4 KB 的 HTTP 请求 (不包括正文),因此您能提供的元数据量是受限的。

注意

HTTP 上的 SOAP 支持已弃用,但是仍可在 HTTPS 上使用。对于 SOAP 将不支持新 Amazon S3 功能。我们建议您使用 REST API 或 AWS 开发工具包。

REST 接口

REST API 是面向 Amazon S3 的 HTTP 接口。借助 REST,您可以使用标准的 HTTP 请求创建、提取和删除存储桶和对象。

您可以借助任何支持 HTTP 的工具包来使用 REST API。只要对象是匿名可读的,您甚至可以使用浏览器来提取它们。

REST API 使用标准的 HTTP 标头和状态代码,以使标准的浏览器和工具包按预期工作。在某些区域中,我们向 HTTP 添加了功能 (例如,我们添加了标头来支持访问控制)。在这些情况下,我们已尽最大努力使添加的新功能与标准的 HTTP 使用样式相匹配。

SOAP 接口

注意

HTTP 上的 SOAP 支持已弃用,但是仍可在 HTTPS 上使用。对于 SOAP 将不支持新 Amazon S3 功能。我们建议您使用 REST API 或 AWS 开发工具包。

SOAP API 使用文档文字编码来提供 SOAP 1.1 接口。使用 SOAP 的最常见方法是下载 WSDL (转到 http://doc.s3.amazonaws.com/2006-03-01/AmazonS3.wsdl),使用 SOAP 工具包 (例如,Apache Axis 或 Microsoft .NET) 创建绑定,然后编写代码以使用这些绑定调用 Amazon S3。

为 Amazon S3 付费

Amazon S3 定价的设计可让您不必为应用程序的存储需求制定计划。大多数存储提供商会强迫您购买预定量的存储和网络传输容量:如果超过此容量,就会关闭您的服务或对您收取高额的超容量费用。如果没有超过此容量,又要按全部容量支付使用费用。

Amazon S3 仅按照您的实际使用容量收费,没有任何隐性收费和超容量收费。这为开发人员提供了一种可变成本服务,这种服务可以伴随他们的业务共同发展,同时还可以享受 Amazon 的基础设施成本优势。

在 Amazon S3 中存储任何内容之前,您需要注册服务并提供一个每月月底付费时使用的付款方式。开始使用服务时,没有安装费。月底时,将自动通过您的付款方式扣除当月使用费。

有关为 Amazon S3 存储付费的信息,请参阅 Amazon S3 定价

相关服务

一旦将数据加载 Amazon S3 中之后,便可以将其用于我们提供的其他服务。以下可能是您会频繁使用的服务:

  • Amazon Elastic Compute Cloud – 此 Web 服务提供云中的虚拟计算资源。有关更多信息,请参阅 Amazon EC2 产品详细信息页面

  • Amazon EMR – 此 Web 服务可让企业、研究人员、数据分析师和开发人员轻松地、经济实惠地处理海量数据。该服务的实现利用了在 Amazon EC2 和 Amazon S3 的 Web 规模基础设施上运行的托管 Hadoop 框架。有关更多信息,请参阅 Amazon EMR 产品详细信息页面

  • AWS Import/Export - 通过 AWS Import/Export,您可以将存储设备 (如 RAID 驱动器) 寄至 Amazon,我们可以将您的数据 (TB 字节) 上传到 Amazon S3。有关更多信息,请转到 AWS Import/Export Developer Guide