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

时间:2017-03-16 18:40:36

标签: rest amazon-web-services amazon-s3

我目前正在编写代码以使用亚马逊的S3 REST API,我注意到不同的行为,其中唯一的区别似乎是我使用的Amazon端点URI,例如https://s3-us-west-2.amazonaws.com vs. /path/subfolder/ /path/subfolder/file1.txt /path/subfolder/file2.txt

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

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

    /path/subfolder/file1.txt
    /path/subfolder/file2.txt
    

    并且,使用另一个端点, 包含"文件夹"在结果中:

    /
  • 使用一个端点,它代表"文件夹"使用如上所示的尾随_$folder$,并使用另一个端点,它使用尾随/path/subfolder_$folder$ /path/subfolder/file1.txt /path/subfolder/file2.txt

    {{1}}

为什么会有差异?无论端点如何,如何以一致的方式返回结果?

请注意,即使我使用亚马逊的自己的命令行AWS S3客户端,我也会得到同样奇怪的结果,所以它我的代码。

3 个答案:

答案 0 :(得分:1)

  

无论如何,桶的内容应无关紧要。

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

  

在Amazon S3中,存储桶和对象是主要资源,其中对象存储在存储桶中。 Amazon S3具有扁平结构,没有您在典型文件系统中看到的层次结构。但是,为了简化组织,Amazon S3控制台支持将文件夹概念作为对对象进行分组的方法。 Amazon S3通过使用对象的密钥名称前缀来实现此目的。

     

http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html

那你为什么看到这个?

要么你一直在使用EMR / Hadoop,要么是其中一些人写了一个糟糕的例子,然后用它来运行......或者做的事情与它应该做的事情有一段时间不同。

  

Amazon EMR是一种Web服务,它使用托管Hadoop框架来处理,分发AWS数据存储(包括Amazon S3)中的数据并与之交互。由于S3使用键值对存储系统,因此Hadoop文件系统通过创建带有<directoryname>_$folder$后缀的空文件来实现S3中的目录支持。

     

https://aws.amazon.com/premiumsupport/knowledge-center/emr-s3-empty-files/

这可能是多年前S3控制台所做的事情,显然(因为你没有报告在控制台中看到它们)它仍然支持在控制台中显示诸如文件夹这样的对象...但是S3控制台没有如果有的话,更长的时间会以这种方式创造它们。

  

我完全镜像了“文件夹”布局

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

  

Amazon S3控制台将具有正斜杠“/”字符的所有对象视为密钥名称中的最后一个(尾随)字符作为文件夹

     

http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html

如果您只是使用API​​创建对象,那么“my / object.txt”在控制台中显示为“my”文件夹中的“object.txt”,即使没有创建“my /”对象...所以如果使用API​​创建对象,则在对象列表中不会看到“文件夹”样式。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

EMR的s3客户端不是apache,所以我无法准确地说出来。

在ASF hadoop发布(和HDP,CDH)

  1. 较旧的s3n:// client使用$folder$作为其文件夹分隔符。
  2. 较新的s3a:// client使用/作为其文件夹标记,但如果存在,则会处理$ folder $。至少它习惯了;我现在无法看到它在代码中的位置。
  3. S3A客户端在列出内容时会删除所有文件夹标记; S3A使用它们来模拟空目录,并在创建子文件/目录条目时删除所有父标记。

    无论您拥有哪些流程,GET都应该忽略条目&#34; /&#34;或者最后的$文件夹。

    至于它们为何不同,本地EMRFS是一个不同的代码路径,使用dynamo来实现一致性。猜测,它不需要模拟空目录,因为DDB表将托管所有目录条目。