【问题标题】:How do I include an S3 bucket name and region/endpoint in a single URL?如何在单个 URL 中包含 S3 存储桶名称和区域/端点?
【发布时间】:2016-12-26 07:28:44
【问题描述】:

如果我在region=us-east-1 中有一个名为mybucket 的存储桶,那么我可以使用它访问它

aws s3 ls s3://mybucket --region=us-east-1

但是,这需要传递两条信息:

  1. 网址s3://mybucket
  2. 区域us-east-1(或端点,以任何一个为准)

理想情况下,URL 是一个统一 资源定位器。它具有协议 (s3) 和存储桶名称真是太好了,但是是否有一个 AWS S3 标准的单个 URL 可以同时编码区域和存储桶名称,这样我就可以做到:

aws s3 ls s3://mybucket_url_including_region_or_endpoint

编辑:

为了澄清,我不是在寻找端点列表。我正在寻找 s3 URL 如何真正成为统一资源定位器,方法是在其中封装所有必要信息以获取资源(当然,减去身份验证凭据)。

【问题讨论】:

    标签: amazon-web-services amazon-s3


    【解决方案1】:

    s3:// 方案中没有对区域进行编码的规定。

    还要注意,URL 中的“U”代表 uniform,而不是 universal

    【讨论】:

    • 噢!是的,好点。这样做了 25 年,仍然犯愚蠢的错误。即便如此,URL 的意义在于提供一个单一的 uniform 资源定位器,如果需要该区域而不是提供者,那么它不是。
    • @deitch 我怀疑要记住的一件事是,S3 最初不是区域性的。它在地理上是分布的,但没有区域的概念——无处不在。通过添加区域,他们明智地保留了全局存储桶命名空间,因此它技术上仍然是一个有效的资源定位器,就像全局端点 bucket-name.s3.amazonaws.com 自动 DNS 映射到正确的区域一样对于每个桶。发出请求时需要知道区域(可以说)主要是 Signature Version 4 的日期/区域/服务逻辑的产物。
    【解决方案2】:

    为存储桶包含 S3 区域的正确方法是将其正确包含在 URL 中。

    注意:“s3.amazonaws.com”在引用 us-east-1 以外的区域中的存储桶时经常被误用。它可以并且经常被用来这样做。但是,这样做会使您不太清楚您实际在哪个区域进行操作,这在某些场景中可能会出现问题。

    如果您想在 us-east-2 中专门引用一个名为“mybucket”的存储桶,那么执行此操作的最佳方法是以下之一:

    Host-Style Naming: http://mybucket.s3-us-west-2.amazonaws.com
    Path-Style Naming: http://s3-us-west-2.amazonaws.com/mybucket
    

    在任一示例中,当引用“mybucket”时,您将始终连接到 us-west-2。

    【讨论】:

    • 您的断言是正确的,除了 OP 显然正在寻找一种方法来做到这一点,而不是使用正确的 URL,而是使用接受 s3://${bucket}/${key} pseudo-URL 中的参数的代码格式,就像 aws-cli 所做的那样......(afaik)是不可能的。
    • 我认为(不幸的是)@Michael 是对的;你不能使用s3:// 来做到这一点,因为即使它包含在http 中,它也是它自己的协议。尝试将 http:// URL 提供给任何 AWS 开发工具包或 CLI,它会阻塞它。
    • @JoshuaBriefman 谢谢,但编辑被拒绝了。编辑通常不应涉及如此重大的变化。随意使用此内容发布您自己的答案,编辑此内容或删除它并发布另一个。
    • 另外,不要征求反对意见。 :) 他们很容易得到。 :( 你在这里的答案是 not "an egregiously sloppy, no-effort-expended post, or an answer that is clearly and perhaps dangerously incorrect" 因此 not (恕我直言)值得反对,即使它并不完全(再次,恕我直言)解决手头的问题。因此,我之所以对您的答案发表评论,而不是随便向您的方向投掷 -1。
    • 感谢@Michael-sqlbot,感谢您的建议。我已经删除了我的“评论”,我将发布带有该附加信息的第二个答案。因为看起来这个没有有用的信息。
    【解决方案3】:

    正如@michael-sqlbot 评论的那样,URL 和 URI 不是一回事。

    您引用的 S3 URL 实际上是此处提到的 S3Uri。

    AWS CLI - S3 Documentation

    S3Uri:表示 S3 对象、前缀或存储桶的位置。 这必须以 s3://mybucket/mykey 的形式编写,其中 mybucket 是指定的 S3 存储桶,mykey 是指定的 S3 密钥。

    Uniform Resource Identifier (URI)

    在信息技术中,统一资源标识符 (URI) 是用于标识资源的字符串。这样的识别能够使用特定协议通过网络(通常是万维网)与资源的表示进行交互。 指定具体语法和相关协议的方案定义每个 URI。

    Uniform Resource Locator (URL)

    统一资源定位器 (URL),通常非正式地称为 Web 地址(定义不同的术语)是对 Web 资源的引用,它指定其在计算机网络上的位置以及检索它的机制。 URL 是一种特定类型的统一资源标识符 (URI),尽管许多人可以互换使用这两个术语。

    那么这一切意味着什么? URL!=URI?

    根据URI是什么的定义,它是由为它设计的方案定义的。而且,在这种情况下为其定义的方案不包括对区域的引用。

    所以 URI 的格式是正确的,即使其他人认为它不完整。

    URL 旨在帮助您在某处定位对象,而 URI 旨在引用对象而不一定要找到它。

    【讨论】:

    • 按照同样的逻辑,http://192.168.1.1 不会是一个有效的 URL,因为缺少有关如何从其他网络连接到它的信息。在可以推断区域的任何上下文中,S3 URI 都是完全有效的 URL。
    猜你喜欢
    • 2021-08-02
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2017-01-29
    • 1970-01-01
    • 2014-05-05
    相关资源
    最近更新 更多