Rest 使用不同端点的不同S3行为?

Rest 使用不同端点的不同S3行为?,rest,amazon-web-services,amazon-s3,Rest,Amazon Web Services,Amazon S3,我目前正在编写使用Amazon的S3RESTAPI的代码,我注意到不同的行为,其中唯一的区别似乎是我使用的Amazon端点URI,例如,https://s3.amazonaws.comvs.https://s3-us-west-2.amazonaws.com GET Bucket(列出对象)调用的不同行为示例: 使用一个端点,结果中包含“文件夹”,例如: /path/subfolder/ /path/subfolder/file1.txt /path/subfolder/file2.txt

我目前正在编写使用Amazon的S3RESTAPI的代码,我注意到不同的行为,其中唯一的区别似乎是我使用的Amazon端点URI,例如,
https://s3.amazonaws.com
vs.
https://s3-us-west-2.amazonaws.com

GET Bucket(列出对象)调用的不同行为示例:

  • 使用一个端点,结果中包含“文件夹”,例如:

    /path/subfolder/
    /path/subfolder/file1.txt
    /path/subfolder/file2.txt
    
    并且,使用另一个端点,它不会在结果中包含“文件夹”:

    /path/subfolder/file1.txt
    /path/subfolder/file2.txt
    
  • 使用一个端点,它使用一个尾随的
    /
    表示“文件夹”,如上所示,使用另一个端点,它使用一个尾随的
    \$folder$

    /path/subfolder_$folder$
    /path/subfolder/file1.txt
    /path/subfolder/file2.txt
    
为什么会有差异?如何使其以一致的方式返回结果,而不考虑端点


请注意,即使我使用Amazon自己的命令行AWS S3客户端,我也会得到这些奇怪的结果,因此这不是我的代码。

这可能是API端点中的一个错误,其中包括“文件夹”-S3内部实际上没有文件夹结构,而是与文件关联的一组键,其中的键(为了方便)可以包含斜杠分隔的路径,然后在web界面中显示为“文件夹”。API中有指定前缀的选项,我相信前缀可以是密钥的任何部分,包括文件名的一部分

无论如何,桶里的东西应该是无关的

尽管有您的断言,但您的问题完全是关于bucket的内容,而不是S3正在做的事情——S3API没有文件夹的概念。没有一个S3控制台可以显示文件夹,但这是为了方便起见——文件夹实际上并不存在——或者如果存在类似文件夹的实体,它们是不相关的,也不需要

在AmazonS3中,bucket和对象是主要资源,对象存储在bucket中。AmazonS3有一个扁平的结构,没有像典型文件系统中那样的层次结构。然而,为了组织的简单性,AmazonS3控制台支持文件夹概念作为对象分组的一种方式。AmazonS3通过使用对象的键名前缀来实现这一点

那你为什么要看到这个呢?

要么你一直在使用EMR/Hadoop,要么是某个人编写的其他代码,他拿了一个不好的例子并用它运行。。。或者是做了一些与一段时间以来应该做的不同的事情

AmazonEMR是一个web服务,它使用托管Hadoop框架处理、分发AWS数据存储(包括AmazonS3)中的数据并与之交互。因为S3使用一个键值对存储系统,Hadoop文件系统通过创建带有
\$folder$
后缀的空文件来实现S3中的目录支持

这可能是S3控制台多年前所做的事情,显然(因为您没有报告在控制台中看到它们),它仍然支持在控制台中以文件夹的形式显示这些对象。。。但是S3控制台不再以这种方式创建它们,如果它曾经这样做过的话

我已经完全镜像了bucket“文件夹”的布局

如果在控制台中创建文件夹,将创建一个键为“foldername/”的空对象。这反过来用于显示可导航到的文件夹,并上载以该文件夹名称开头的关键字作为前缀的对象

AmazonS3控制台将所有具有正斜杠“/”字符的对象作为键名中的最后一个(尾随)字符作为文件夹处理


如果您只是使用API创建对象,那么即使没有创建“my/”对象,控制台中的“my/object.txt”也会在文件夹“my”中显示为“object.txt”。。。因此,如果对象是用API创建的,那么在对象列表中您将看不到任何一种“文件夹”样式。

EMR的s3客户端不是apache客户端,因此我无法准确地谈论它

在ASF hadoop版本中(和HDP、CDH)

  • 旧版本使用
    $folder$
    作为其文件夹分隔符
  • 较新版本使用/作为其文件夹标记,但如果存在,则将处理$folder$。至少过去是这样;我看不出它现在在代码中的位置
  • S3A客户端在您列出内容时会去掉所有文件夹标记;S3A使用它们来模拟空目录,并在创建子文件/dir条目时删除所有父标记

    无论进程得到什么,都应该忽略末尾带有“/”或$folder的条目


    至于为什么它们不同,本地EMRFS是一个不同的代码路径,使用dynamo实现一致性。猜测一下,它不需要模拟空目录,因为DDB表将承载所有目录项。

    听起来像是AWS支持的一个案例。如果bucket中的文件是公共可用的,您能在问题中添加bucket名称吗?@l0b0 bucket不是公共可用的。这很奇怪,但我怀疑有一个合理的、与遗留相关的解释。。。但是,让我们稍微关注一下,因为您还没有明确说明桶位于哪个区域,以及哪些确切的端点提供了哪种类型的结果。您不需要告诉我们您的bucket名称,但是涉及到多少bucket,以及哪些bucket(bucket A、B、C等)提供了我们需要的端点行为信息。我也有理由相信,或者我正在阅读您不打算阅读的问题。。。或者你已经失去了对你的观察结果的跟踪,事实上,你在谈论不同的桶行为,但是端点是不同的,因为你在看不同的桶。。。由不同的应用程序创建。。。对于给定的bucket,行为在端点之间不会改变;但是,我不相信您在同一个bucket的多个端点上看到它,这就是您的问题所暗示的。你在用两个桶工作,