【问题标题】:How does AWS implement getbucketlocation?AWS 如何实现 getbucketlocation?
【发布时间】:2019-08-31 21:47:15
【问题描述】:
【问题讨论】:
标签:
amazon-web-services
amazon-s3
【解决方案1】:
us-east-1 中有一个集中式数据库,所有其他区域都有它的副本。这用于GET bucket location API 调用以及列表存储桶。
但这不用于请求路由。
请求路由是一个简单的系统——数据库是 DNS。为每个存储桶自动创建了一条 DNS 记录 - 一个指向存储桶区域中 S3 终端节点的 CNAME。
还有一个指向 us-east-1 的 *.s3.amazonaws.com DNS 通配符...因此,当新存储桶位于 us-east-1 中时,这些主机名会立即起作用。否则,在创建特定存储桶记录(覆盖通配符)之前会有延迟,并且发送到该端点的请求将到达 us-east-1,后者将以 HTTP 重定向响应该存储桶的适当区域端点。
他们可能会停止为新区域执行此操作的原因可能与扩展考虑有关,并且它不再像以前那样有用。当强制签名版本 4 身份验证成为 2014 年及以后推出的区域规则时,${bucket}.s3.amazonaws.com URL 样式在很大程度上变得无关紧要,因为您无法在不知道请求的目标区域的情况下生成有效的 Sig V4 URL。 Signature V2 签名不要求生成签名的代码知道该区域。
S3 在历史上也没有区域端点的一致主机名。例如,在 us-west-2 中,区域端点曾经是 ${bucket}.s3-us-west-2.amazonaws.com,但在 us-east-2 中,区域端点一直是 ${bucket}.s3.us-east-2.amazonaws.com...您发现区别了吗?在s3 之后是- 而不是.,因此构建区域 URL 还需要了解不同区域的随机规则。更随机的是,us-east-1 的特定于区域的端点实际上是 ${bucket}.s3-external-1.amazonaws.com,当然,除非您有理由使用 ${bucket}.s3-external-2.amazonaws.com(这有一个遗留原因——当时这是有道理的,但那是很久以前的事了。)
值得称赞的是,他们修复了这个问题,现在所有区域都支持${bucket}.s3.${region}.amazonaws.com,但(也值得称赞的是)旧的 URL 在旧的区域仍然可以使用,即使现在已经标准化。