什么是 Amazon S3?
Amazon Simple Storage Service(Amazon S3)是一种对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能。
各种规模和行业的客户都可以使用 Amazon S3 存储和保护任意数量的数据,用于数据湖、网站、移动应用程序、备份和恢复、归档、企业应用程序、IoT 设备和大数据分析。
Amazon S3 提供了管理功能,使您可以优化、组织和配置对数据的访问,以满足您的特定业务、组织和合规性要求。
Amazon S3 的功能
存储类
Amazon S3 提供一系列适合不同使用案例的存储类。
例如,您可以将任务关键型生产数据存储在 S3 Standard 或 S3 Express One Zone 中以便频繁访问,将不经常访问的数据存储在 S3 Standard-IA 或 S3 One Zone-IA 中,并在 S3 Glacier Instant Retrieval、S3 Glacier Flexible Retrieval、和 S3 Glacier Deep Archive 中以极低的成本归档数据。
Amazon S3 Express One Zone 是高性能的单区 Amazon S3 存储类,专门用于为延迟要求极高的应用程序提供稳定的毫秒级数据访问。S3 Express One Zone 是目前具有极低延迟的云对象存储类,相比 S3 Standard,其数据访问速度要快 10 倍,且请求成本低 50%。S3 Express One Zone 是第一种可以在其中选择单个可用区的 S3 存储类,您可以选择将您的对象存储与计算资源联合托管在一个位置,从而提供尽可能高的访问速度。此外,为了进一步提高访问速度并支持每秒数十万个请求,数据存储在新的存储桶类型中:Amazon S3 目录存储桶。有关更多信息,请参阅什么是 S3 Express One Zone? 和目录桶。
您可以在 S3 Intelligent-Tiering 中存储具有不断变化或未知访问模式的数据,该分层可在访问模式发生变化时自动在四个访问层之间移动数据,从而优化存储成本。
这四个访问层包括两个低延迟访问层(针对频繁和不频繁访问进行了优化),以及两个为异步访问很少访问的数据而设计的 opt-in archive 访问层。
有关更多信息,请参阅 使用 Amazon S3 存储类。
存储管理
Amazon S3 具有存储管理功能,您可以使用这些功能来管理成本、满足法规要求、减少延迟并保存数据的多个不同副本以满足合规性要求。
S3 生命周期 - 配置生命周期配置以管理您的对象,并在整个生命周期内经济高效地存储这些对象。您可以将对象转换为其他 S3 存储类,也可以使其生命周期结束的对象过期。
S3 对象锁定 - 可以在固定的时间段内或无限期地阻止删除或覆盖 Amazon S3 对象。可以使用对象锁定来帮助您满足需要一次写入多次读取 (WORM) 存储的法规要求,或只是添加另一个保护层来防止对象被更改和删除。
S3 复制 - 将对象及其各自的元数据和对象标签复制到同一或不同的 AWS 区域 目标存储桶中的一个或多个目标存储桶,以减少延迟、合规性、安全性和其他使用案例。
S3 批量操作 - 通过单个 S3 API 请求或在 Amazon S3 控制台中单击几次,大规模管理数十亿个对象。您可以使用批量操作来执行诸如复制、调用 AWS Lambda 函数和恢复数百万或数十亿对象这样的操作。
访问管理和安全性
Amazon S3 提供了用于审核和管理对存储桶和对象的访问的功能。默认情况下,S3 存储桶和对象都是私有的。您只能访问您创建的 S3 资源。要授予支持您特定使用案例的细粒度资源权限或审核 Amazon S3 资源的权限,您可以使用以下功能。
S3 阻止公有访问 - 阻止对 S3 存储桶和对象的公有访问。默认情况下,“屏蔽公共访问权限”设置在存储桶级别处于开启状态。我们建议您将所有“屏蔽公共访问权限”设置保持为启用状态,除非您知道您需要为您的特定使用案例关闭其中一个或多个设置。有关更多信息,请参阅 为 S3 存储桶配置屏蔽公共访问权限设置。
AWS Identity and Access Management(IAM)– IAM 是一种 Web 服务,可帮助您安全地控制对 AWS 资源(包括 Amazon S3 资源)的访问。借助 IAM,您可以集中管理控制用户可访问哪些 AWS 资源的权限。可以使用 IAM 来控制谁通过了身份验证(准许登录)并获得授权(具有相应权限)来使用资源。
存储桶策略 - 使用基于 IAM 的策略语言为 S3 存储桶及其中的对象配置基于资源的权限。
Amazon S3 接入点 – 使用专用访问策略配置命名网络端点,以便大规模管理对 Amazon S3 中共享数据集的访问。
访问控制列表(ACL)- 向授权用户授予单个存储桶和对象的读写权限。作为一般规则,我们建议您使用基于 S3 资源的策略(存储桶策略和接入点策略)或 IAM 用户策略进行访问控制,而不是 ACL。策略是一种简化、更灵活的访问控制选项。借助存储桶策略和接入点策略,您可以定义广泛适用于针对 Amazon S3 资源的所有请求的规则。有关何时使用 ACL 而不是基于资源的策略或 IAM 用户策略的特定情况的更多信息,请参阅使用 ACL 管理访问。
S3 对象所有权 – 获取存储桶中每个对象的所有权,从而简化对存储在 Amazon S3 中的数据的访问管理。S3 对象所有权是 Amazon S3 存储桶级别的设置,您可以使用该设置来禁用或启用 ACL。默认情况下,ACL 处于禁用状态。禁用 ACL 后,存储桶拥有者拥有存储桶中的所有对象,并使用访问管理策略来专门管理对数据的访问权限。
适用于 S3 的 IAM Access Analyzer - 评估和监控您的 S3 存储桶访问策略,确保这些策略仅提供对 S3 资源的预期访问权限。
数据处理
要转换数据并触发工作流以大规模自动执行各种其他处理活动,您可以使用以下功能。
S3 Object Lambda - 您可以将自己的代码添加到 S3 GET、HEAD 和 LIST 请求中,以便在数据返回到应用程序时修改和处理数据。筛选行、动态调整图像大小、编辑机密数据等。
事件通知 - 当您的 S3 资源进行更改时,触发使用 Amazon Simple Notification Service (Amazon SNS)、Amazon Simple Queue Service (Amazon SQS) 和的工作流程和 AWS Lambda。
存储日志记录和监控
Amazon S3 提供日志记录和监控工具,您可以使用这些工具来监控和控制 Amazon S3 资源的使用情况。更多信息,请参阅监控工具。
自动监控工具
Amazon S3 的 Amazon CloudWatch 指标- 跟踪 S3 资源的运行状况,并在估计费用达到用户定义的阈值时配置计费警报。
AWS CloudTrail - 在 Amazon S3 中记录用户采取的行动、角色或 AWS 服务。CloudTrail 日志为您提供了 S3 存储桶级别和对象级操作的详细 API 跟踪。
手动监控工具
服务器访问日志- 详细地记录对存储桶提出的各种请求。您可以使用服务器访问日志对许多使用案例进行安全和访问审计,了解客户群或了解您的 Amazon S3 账单。
AWS Trusted Advisor - 通过使用 AWS 最佳实践检查以确定优化 AWS 基础架构、提高安全性和性能、降低成本以及监控服务配额。然后,您可以按照建议优化服务和资源。
分析和见解
Amazon S3 提供的功能可帮助您了解存储使用情况,从而使您能够更好地了解、分析和大规模优化存储。
Amazon S3 Storage Lens - 了解、分析和优化您的存储。S3 Storage Lens 存储统计管理工具提供了超过 60 个使用率和活动指标以及交互式控制面板,用于汇总整个组织、特定客户、AWS 区域、存储桶或前缀的数据。
存储类分析- 分析存储访问模式,以决定何时需要将数据移动到更经济高效的存储类。
带清单报告的 S3 清单- 审核和报告对象及其相应的元数据,并配置其他 Amazon S3 功能,在清单报告中采取措施。例如,您可以报告对象的复制和加密状态。有关清单报告中每个对象可用的所有元数据的列表,请参阅 Amazon S3 清单。
强一致性
Amazon S3 为所有 AWS 区域 中的 Amazon S3 存储桶中对象的 PUT 和 DELETE 请求提供了强大的先写后读一致性。
这个行为既适用于到新对象的写入,也适用于覆盖现有对象的 PUT 和 DELETE。
此外,针对 Amazon S3 Select、Amazon S3 访问控制列表 (ACL)、Amazon S3 对象标签和对象元数据(例如 HEAD 对象)的读取操作具有严格一致性。
有关更多信息,请参阅 Amazon S3 数据一致性模型。
Amazon S3 的工作原理
Amazon S3 是一种对象存储服务,可将数据以对象形式存储在存储桶中。对象指的是一个文件和描述该文件的任何元数据。存储桶是对象的容器。
要将数据存储在 Amazon S3 中,您需要先创建存储桶,然后指定存储桶名称和 AWS 区域。然后,您将数据作为 Amazon S3 中的对象上传到该存储桶。每个对象都带有密钥(或键名称),它是存储桶中对象的唯一标识符。
S3 提供了一些功能,您可以配置这些功能以支持您的特定使用案例。例如,您可以使用 S3 版本控制将对象的多个版本保持在同一个存储桶中,这允许您恢复意外删除或覆盖的对象。
存储桶及其中的对象是私有的,只有在您明确授予访问权限时才可以访问。您可以使用存储桶策略、AWS Identity and Access Management(IAM)策略、访问控制列表(ACL)和 S3 接入点管理访问。
存储桶
存储桶是 Amazon S3 中用于存储对象的容器。您可以在存储桶中存储任意数量的对象,并且账户中最多可以有 100 个存储桶。要请求提高限额,请访问服务限额控制台。
每个对象都储存在一个存储桶中。例如,如果名为 photos/puppy.jpg 的对象存储在美国西部(俄勒冈州)区域的 DOC-EXAMPLE-BUCKET 存储桶中,则可使用 URL https://DOC-EXAMPLE-BUCKET.s3.us-west-2.amazonaws.com/photos/puppy.jpg 对该对象进行寻址。有关更多信息,请参阅访问存储桶。
创建存储桶时,您可以输入存储桶名称,然后选择AWS 区域存储桶将驻留的位置。创建存储桶后,无法更改存储桶或区域的名称。存储桶名称必须遵循存储桶命名规则。您也可以将存储桶配置为使用 S3 版本控制或其他存储管理功能。
存储桶还:
在最高级别组织 Amazon S3 命名空间。
标识负责存储和数据传输费用的账户。
提供访问控制选项,例如存储桶策略、访问控制列表(ACL)和 S3 接入点,可用于管理对 Amazon S3 资源的访问。
用作使用情况报告的聚合单元。
有关存储桶的更多信息,请参阅 存储桶概述。
对象
对象是 Amazon S3 中存储的基础实体。
对象由对象数据和元数据组成。元数据是一组描述对象的名称-值对。
这些对值包括一些默认元数据(如上次修改日期)和标准 HTTP 元数据(如 Content-Type)。您还可以在存储对象时指定自定义元数据。
存储桶中的对象由密钥(名称) 和版本 ID唯一标识(如果在存储桶上启用了 S3 版本控制)。有关对象的更多信息,请参阅 Amazon S3 对象概述。
键
对象密钥(或密钥名称)是指存储桶中对象的唯一标识符。存储桶内的每个对象都只能有一个键。存储桶、对象密钥和可选版本 ID 的组合(如果为存储桶启用了 S3 版本控制)唯一标识每个对象。因此,您可以将 Amazon S3 看作“存储桶 + 键 + 版本”与对象本身之间的基本数据映射。
将 Web 服务端点、存储桶名称、密钥和版本(可选)组合在一起,可唯一地寻址 Amazon S3 中的每个对象。例如,在 URL https://DOC-EXAMPLE-BUCKET.s3.us-west-2.amazonaws.com/photos/puppy.jpg 中,DOC-EXAMPLE-BUCKET 是存储桶的名称,photos/puppy.jpg 是密钥。
有关对象键的更多信息,请参阅 创建对象键名称。
S3 版本控制
您可以使用 S3 版本控制功能将对象的多个变量保留在同一存储桶中。使用 S3 版本控制功能,您可以保留、检索和恢复存储桶中的各个版本。您能够轻松从用户意外操作和应用程序故障中恢复数据。
有关更多信息,请参阅 在 S3 存储桶中使用版本控制。
版本 ID
在存储桶中启用 S3 版本控制时,Amazon S3 会为添加到存储桶中的每个对象生成唯一的版本ID。
启用版本控制时存在于存储桶中的对象的版本 ID 为null。如果使用其他操作修改这些(或任何其他)对象,例如 CopyObject 和 PutObject 时,新对象将获得唯一的版本 ID。
有关更多信息,请参阅 在 S3 存储桶中使用版本控制。
存储桶策略
存储桶策略是基于资源的 AWS Identity and Access Management (IAM) 策略,您可以使用该策略向存储桶及其中对象授予访问权限。只有存储桶拥有者才能将策略与存储桶关联。附加到存储桶的权限适用于存储桶拥有者拥有的存储桶中所有对象。存储桶策略的大小限制为 20 KB。
存储桶策略使用基于 JSON 的访问策略语言,该语言是跨平台的标准语言 AWS。您可以使用存储桶策略添加或拒绝存储桶中对象的权限。存储桶策略根据策略中的元素允许或拒绝请求,包括请求者、S3 操作、资源以及请求的方面或条件(例如,用于发出请求的 IP 地址)。例如,您可以创建一个存储桶策略,该策略授予跨账户将对象上传到 S3 存储桶的权限,同时确保存储桶拥有者对上传的对象拥有完全控制权。有关更多信息,请参阅 Amazon S3 存储桶策略的示例。
在存储桶策略中,您可以在 Amazon 资源名称(ARN)和其他值上使用通配符来授予对对象子集的权限。例如,您可以控制对以通用前缀或以给定扩展名结尾的对象组的访问,例如 .html。
S3 接入点
Amazon S3 接入点被命名为网络端点,其专用访问策略描述了如何使用该端点访问数据。接入点附加到存储桶,您可以使用这些存储桶执行 S3 对象操作(如 GetObject 和 PutObject)。
接入点可简化对 Amazon S3 中的共享数据集的大规模数据访问管理。
每个接入点都有自己的接入点策略。您还可以为每个接入点配置阻止公有访问设置。
为了限制 Amazon S3 数据访问提供网络,您可以将任何接入点配置为仅接受来自私有云(VPC)的请求。
有关更多信息,请参阅 使用 Amazon S3 接入点管理数据访问。
访问控制列表(ACL)
您可以使用 ACL 向已授权的用户授予对单个存储桶和对象的读写权限。每个存储桶和对象都有一个作为子资源而附加的 ACL。ACL 定义了哪些 AWS 账户 或组将被授予访问权限以及访问的类型。
ACL 是一种访问控制机制,其早于 IAM。有关 ACL 的更多信息,请参阅 访问控制列表 (ACL) 概述。
S3 对象所有权是 Amazon S3 存储桶级别的设置,您可以使用该设置来控制上传到存储桶的对象的所有权和禁用或启用 ACL。默认情况下,对象所有权设为强制存储桶拥有者设置,并且所有 ACL 均处于禁用状态。禁用 ACL 后,存储桶拥有者拥有存储桶中的所有对象,并使用访问管理策略来专门管理对这些对象的访问权限。
Amazon S3 中的大多数现代使用案例不再需要使用 ACL。我们建议您将 ACL 保持为禁用状态,除非有需要单独控制每个对象的访问权限的特殊情况。
禁用 ACL 后,您可以使用策略来控制对存储桶中所有对象的访问权限,无论是谁将对象上传到您的存储桶。有关更多信息,请参阅 为您的存储桶控制对象所有权和禁用 ACL。。
区域
您可以选择一个 AWS 区域 供 Amazon S3 存储您创建的存储桶。
您可以选择一个区域,以便优化延迟、尽可能降低成本或满足法规要求。
存储在 AWS 区域 中的对象永远不会离开该区域,除非显式地将它们传输或复制到另一个区域。例如,在欧洲(爱尔兰)区域存储的对象将一直留在欧洲。
Amazon S3 数据一致性模型
Amazon S3 为所有 AWS 区域 中的 Amazon S3 存储桶中对象的 PUT 和 DELETE 请求提供了强大的先写后读一致性。
此行为既适用于对新对象的写入,也适用于覆盖现有对象的 PUT 请求和 DELETE 请求。此外,Amazon S3 Select、Amazon S3访问控制列表 (ACL)、Amazon S3对象标记和对象元数据(例如,HEAD对象)上的读取操作非常一致。
单个键的更新是原子更新。例如,如果您从一个线程对现有密钥执行 PUT 请求,并同时从另一个线程对同一密钥执行 GET 请求,则您将获得旧数据或新数据,但绝不会获得部分或损坏的数据。
Amazon S3 通过在 AWS 数据中心内的多个服务器之间复制数据,从而实现高可用性。如果 PUT 请求成功,则数据已安全存储。在收到成功的 PUT 响应后启动的任何读取(GET 或 LIST 请求)都将返回 PUT 请求写入的数据。
以下是此行为的示例:
这是一个过程,它将一个新对象写入 Amazon S3,并立即列出其存储桶内的密钥。新对象显示在列表中。
这是一个过程,会替换一个现有的对象,并立即尝试读取此对象。Amazon S3 返回新数据。
这是一个过程,会删除一个现有的对象,并立即尝试读取此对象。Amazon S3 不会返回任何数据,因为对象已被删除。
这是一个过程,会删除一个现有的对象,并立即列出其存储桶内的键。该对象不会显示在列表中。
存储桶配置具有最终一致性模型。
具体而言,这意味着:
如果您删除存储桶,然后立即列出所有存储桶,则所删除的存储桶可能仍会显示在列表中。
如果您首次对存储桶启用版本控制,则可能需要很短的时间即可完全传播更改。我们建议您在启用版本控制后等待 15 分钟,然后再对存储桶中的对象发出写入操作(PUT 或 DELETE 请求)。
并发应用程序
本部分提供了当多个客户端向同一项目写入时,Amazon S3 应采取的行为示例。
在本示例中,W1 (写入 1) 和 W2 (写入 2) 会在 R1 (读取 1) 和 R2 (读取 2) 启动之前完成。由于 S3 具有严格一致性,因此 R1 和 R2 都会返回 color = ruby。
在下一个示例中,W2 不会在 R1 启动之前完成。因此,R1 可能会返回 color = ruby 或 color = garnet。但是,由于 W1 和 W2 在 R2 开始之前完成,因此 R2 会返回 color = garnet。
在上一个示例中,W2 在 W1 收到确认之前开始。因此,这些写入被视为并发写入。
Amazon S3 在内部使用 last-writer-wins 语义来确定哪个写入优先。
但是,由于网络延迟等各种因素,无法预测 Amazon S3 接收请求的顺序和应用程序接收确认的顺序。
例如,W2 可能由同一区域中的 Amazon EC2 实例启动,而 W1 可能由距离更远的主机启动。确定最终值的最佳方法是在确认两次写入操作后执行读取。