Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services S3桶全局唯一性_Amazon Web Services_Amazon S3_Dns - Fatal编程技术网

Amazon web services S3桶全局唯一性

Amazon web services S3桶全局唯一性,amazon-web-services,amazon-s3,dns,Amazon Web Services,Amazon S3,Dns,我一直在试图解释为什么S3 bucket名称必须是全局唯一的。我也遇到了stackoverflow的答案,即为了解析主机头,bucket名称必须是唯一的。然而,我的观点是,AWS不能将s3-region.amazonaws.com定向到特定于区域的web服务器,该服务器可以从该区域为bucket对象提供服务吗?这样,该名称可能仅对某个区域具有全局唯一性。也就是说,可以在不同的地区创建相同的bucket。请让我知道,如果我的理解是完全错误的名称解析工作或其他 只在特定区域创建S3 bucket,存

我一直在试图解释为什么S3 bucket名称必须是全局唯一的。我也遇到了stackoverflow的答案,即为了解析主机头,bucket名称必须是唯一的。然而,我的观点是,AWS不能将s3-region.amazonaws.com定向到特定于区域的web服务器,该服务器可以从该区域为bucket对象提供服务吗?这样,该名称可能仅对某个区域具有全局唯一性。也就是说,可以在不同的地区创建相同的bucket。请让我知道,如果我的理解是完全错误的名称解析工作或其他

只在特定区域创建S3 bucket,存储在bucket中的对象只存储在该区域本身。数据既不会复制,也不会存储在不同的区域中,除非您按每个存储桶设置复制

不过。AWS S3与所有帐户共享一个全局名称空间。给S3 bucket的名称应该是唯一的


此要求旨在支持每个bucket的全局唯一DNS名称,例如
http://bucketname.s3.amazonaws.com

严格来说,bucket名称空间必须是全局的,并没有技术原因。事实上,从技术上讲,它并不像大多数人想象的那样具有全局性,因为S3有三个完全相互隔离的不同分区,它们跨分区边界不共享同一个全局bucket名称空间——这些分区是aws(大多数人称之为“aws”的区域的全局集合),
aws美国政府
(美国政府云)和
aws中国
(北京和宁夏偏远地区)

因此,事情本来可以有不同的设计,每个区域都是独立的,但这与现在无关,因为全局名称空间已经根深蒂固

但是为什么呢

全局名称空间的具体原因没有公开说明,但几乎可以肯定与服务的发展、向后兼容性以及新区域的易采用性有关

S3是最古老的AWS服务之一,甚至比EC2还要古老。他们几乎肯定没有预见到它会有多大

最初,名称空间是全局的,因为没有多个区域。S3有一个单一的逻辑区域(很长一段时间称为“美国标准”),实际上至少由两个物理区域组成,位于US-east-1和US-west-2内或附近。您不知道或不关心每次上载到哪个物理区域,因为它们来回复制,透明且基于延迟的DNS解析会自动为您提供延迟最低的端点。许多用户从来不知道这个细节

您甚至可以使用
s3-external-1.amazonaws.com
端点显式覆盖DNS amd上传到东部的自动地理路由,或者使用
s3-external-2.amazonaws.com
端点显式覆盖到西部的自动地理路由,但是您的对象很快就可以从任一端点访问

到目前为止,S3并没有在新对象上提供即时读写一致性,因为在早期存在的主/主循环复制环境中,这是不切实际的

最终,S3在其他AWS地区上线时启动,但他们将其设计为任何地区的bucket都可以访问
${bucket}.S3.amazonaws.com
。 这使用DNS根据主机名中的bucket名称将请求路由到正确的区域,并且S3维护DNS映射
*.s3.amazonaws.com
过去是(现在仍然是)一条通配符记录,它将所有内容指向“s3美国标准”,但s3将为您的bucket创建一个CNAME,该CNAME将在bucket创建几分钟后自动覆盖通配符并指向正确的区域。在此之前,S3将返回一个临时HTTP重定向。这显然需要一个全局bucket名称空间。它仍然适用于除最新地区以外的所有地区

但他们为什么这样做?毕竟,大约在同一时间,S3还引入了样式为
${bucket}.S3-${region}.amazonaws.com
的端点,它们实际上是通配符DNS记录:
*.S3-${region}.amazonaws.com
直接路由到每个S3区域的区域S3端点,并且是一个响应(但不可用)端点,即使是不存在的桶。如果您在us-east-2中创建一个bucket并将该bucket的请求发送到eu-west-1端点,eu-west-1中的S3将抛出一个错误,告诉您需要将请求发送到us-east-2

而且,大约在这个时候,他们悄悄地放弃了整个东西方复制的事情,后来将美国标准重新命名为当时的样子——US-east-1。(支持“向后兼容性”的论点,s3-external-1和s3-external-2仍然是有效的端点,但它们都指向完全相同的位置,即us-east-1。)

那么为什么bucket名称空间仍然是全局的呢?一个局外人能给出的唯一真正正确的答案是“因为这是他们决定要做的。”

但可能一个因素是,AWS希望保持与使用
${bucket}.s3.amazonaws.com
的现有软件的兼容性,以便客户可以在其他地区部署bucket,而无需更改代码。在签名版本2(及更早版本)的旧版本中,签名请求的代码不需要知道API端点区域。签名版本4需要了解端点区域才能生成有效签名,因为签名密钥是根据日期、区域和服务派生的。。。但以前不是这样的,所以您只需输入一个bucket名称,客户机代码不需要任何区域意识,甚至不需要S3有区域意识,就可以在任何区域使用bucket

AWS以其保持向后兼容性的实践而闻名。他们总是这样做,偶尔会出现一些令人尴尬的设计错误