如何搜索亚马逊S3存储桶?


Answers:


31

S3没有本机的“搜索此存储区”,因为实际内容是未知的-而且,由于S3是基于键/值的,因此没有一种本机方式可同时访问许多节点以及提供(SELECT * FROM ... WHERE ...)(模型)。

您需要执行的操作是ListBucket获取存储桶中的对象列表,然后遍历执行您实现的自定义操作(即搜索)的每个项目。


42
这已不再是这种情况。参见下面的rhonda答案:stackoverflow.com/a/21836343/1101095
Nate

11
对于以上评论的所有支持者:OP不会指示他们是否要搜索文件名或关键内容(例如文件内容)。因此,@ rhonda的答案可能仍然不够。看来这最终是用户的一项练习,因为您的应用程序用户和普通用户几乎无法使用S3控制台。它基本上仅适用于存储区所有者和/或IAM角色。
科迪·考兰

是否有像lucene.net这样的索引服务来索引这些存储桶文档。
Munavvar '16

我一直回过头来回答这个问题,并建立了一个工具来提供帮助:bucketsearch.net-允许进行通配符搜索等
Jon M

251

只是在此处添加一条注释:现在已经3年了,但是当您键入“如何搜索S3存储桶”时,这篇文章在Google中排名第一。

也许您正在寻找更复杂的东西,但是如果您试图通过标题找到一个简单的对象(文件),那么就很简单了:

打开存储桶,在右侧选择“无”,然后开始输入文件名。

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


43
这正是我想要的。糟糕的用户体验设计具有零视觉提示
Keith Entzeroth 2014年

2
需要在存储桶中选择一个文件,然后开始输入。
cabe56

30
仍然只允许您按项目名称的前缀进行搜索。
丹尼尔·弗利彭斯

21
真是气死我了!人们在谈论右侧的内容或黄色框,但我什么也找不到。消息相同。“搜索桶”如何不是默认设置?它几乎像Atlassian软件一样
难以

40
这个答案仍然是最新的吗?我没有在右侧看到任何“无”,并且答案中的文档链接现在转发到另一个页面。
BiscuitBaker

112

这是使用AWS CLI搜索文件名的一种简短而丑陋的方法:

aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-

1
aws s3 ls s3://您的存储桶-递归| grep your-search对我的搜索已经足够了,谢谢Abe Voelker。
man.2067067

3
所有水桶: aws s3 ls | awk'{print $ 3}'| 边读行; 做回声$ line; aws s3 ls s3:// $ line --recursive | grep您的搜索;完成
Akom,

1
切什么的-c 32-没有这个搜索也可以工作
sunil

1
cut -c 32-只需从输出中截取时间戳记和文件大小信息,在我的系统上就占用了32个字符。您不需要它,但是如果将输出管道输送到另一个命令中,则拥有“干净”输出可能会很方便。
安倍·沃克

CLI支持include/exclude。因此,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Mohnish

25

(至少)有两种不同的用例,它们可以描述为“搜索存储桶”:

  1. 存储在存储桶中的每个对象中搜索内容;这假定该存储桶中的所有对象(例如文本文件)等都采用通用格式。对于类似的事情,您不得不执行Cody Caughlan刚刚回答的操作。AWS S3文档中有示例代码,展示了如何使用适用于Java的AWS开发工具包执行此操作:使用适用于Java的AWS开发工具包列出密钥(您还将找到PHP和C#示例)。

  2. 列表项在该存储桶中包含的对象中搜索某些内容;S3 确实对此提供了部分支持,其形式为允许前缀精确匹配+在定界符之后折叠匹配。《AWS S3开发人员指南》中对此进行了更详细的说明。例如,这允许通过使用诸如以下的对象键来实现“文件夹”

    文件夹/子文件夹/file.txt
    如果遵循此约定,则大多数S3 GUI(例如AWS控制台)将为您显示存储桶的文件夹视图。




21

有多种选择,没有一个是简单的“一枪”全文解决方案:

  1. 密钥名称模式搜索:搜索以某些字符串开头的密钥-如果您精心设计密钥名称,则可能会有较快速的解决方案。

  2. 搜索附加到密钥的元数据:将文件发布到AWS S3时,您可以处理内容,提取一些元信息,然后以自定义标头的形式将此元信息附加到密钥中。这使您无需获取完整的内容即可获取键名和标题。搜索必须按顺序进行,为此没有“ sql like”搜索选项。对于大文件,这可以节省大量网络流量和时间。

  3. 在SimpleDB的存储元数据:如前一点,但存储在SimpleDB的元数据。在这里,您有sql之类的select语句。对于大型数据集,您可能会达到SimpleDB限制,可以克服该限制(跨多个SimpleDB域的分区元数据),但是如果走得太远,则可能需要使用另一种metedata类型的数据库。

  4. 内容的顺序全文搜索 -逐一处理所有键。如果您要处理的密钥太多,则非常慢。

我们每天使用一天一分钟(每分钟一个)存储1440个文件版本,使用版本化存储桶很容易。但是要获得一些较旧的版本会花费一些时间,因为必须逐个版本地进行升级。有时我使用带有记录的简单CSV索引,显示发布时间和版本ID,有了这个,我可以很快跳到旧版本。

如您所见,AWS S3不是为全文搜索而设计的,它是简单的存储服务。


4

在S3控制台中按前缀搜索

直接在AWS Console存储桶视图中。

在此处输入图片说明

使用s3-dist-cp复制所需文件

当您有成千上万个文件时,获取所需文件的另一种方法是使用分布式副本将它们复制到另一个位置。您可以在Hadoop Job中的EMR上运行它。关于AWS的很棒的事情是,它们提供了自定义的S3版本s3-dist-cp。它允许您使用groupBy字段中的正则表达式对所需文件进行分组。例如,您可以在EMR的自定义步骤中使用它

[
    {
        "ActionOnFailure": "CONTINUE",
        "Args": [
            "s3-dist-cp",
            "--s3Endpoint=s3.amazonaws.com",
            "--src=s3://mybucket/",
            "--dest=s3://mytarget-bucket/",
            "--groupBy=MY_PATTERN",
            "--targetSize=1000"
        ],
        "Jar": "command-runner.jar",
        "Name": "S3DistCp Step Aggregate Results",
        "Type": "CUSTOM_JAR"
    }
]

似乎AWS控制台存储区视图不会逐个文件应用过滤器。只要我要查找的文件的子字符串,它就可以非常快速地返回结果。除了AWS控制台外,是否可以使用其他客户端/工具/ API在同一及时的庄园中获取结果。@ high6。过去,我曾尝试使用boto,但最好的方法似乎是遍历整个存储桶,将搜索条件应用于每个文件名。IE浏览器 非常慢
复制并粘贴

4

如果您使用的是Windows,并且没有时间找到不错的grep选择,那么一种快速而肮脏的方法是:

aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt

然后在myfile.txt中进行快速搜索

“文件夹”位是可选的。

PS(如果未安装AWS CLI)-这是一个使用Chocolatey软件包管理器的衬板

choco install awscli

PPS如果您没有Chocolatey软件包管理器,请安装它!您在Windows上的生活将提高10倍。(我与Chocolatey没有任何关系,但是,这确实是必须的)。


如果用户可以choco安装awscli,那么他们可以安装grep,不是吗?还是使用Windows的本机查找?
Dean Radcliffe


1

另一个选择是将S3存储桶镜像到Web服务器上并在本地遍历。诀窍是本地文件为空,仅用作框架。另外,本地文件可以保存您通常需要从S3获取的有用元数据(例如,文件大小,mimetype,作者,时间戳,uuid)。当您提供URL来下载文件时,请在本地搜索,但是提供指向S3地址的链接。

本地文件遍历很容易,并且这种用于S3管理的方法与语言无关。本地文件遍历还避免了维护和查询文件数据库,也避免了进行一系列远程API调用以验证和获取存储桶内容的延迟。

您可以允许用户通过FTP或HTTP直接将文件上传到您的服务器,然后在非高峰时间通过将任意大小的文件遍历目录将一批新的和更新的文件传输到Amazon。完成向Amazon的文件传输后,将Web服务器文件替换为一个空的同名文件。如果本地文件具有任何文件大小,则因为等待批传输而直接将其提供。


如果您的S3存储桶中有数百万个文件,那么扩展EXTFS2 / 3磁盘上的节点存储空间的好方法...
tpartee

1

我这样做的方法是:在s3中有数千个文件。我在列表中看到了一个文件的属性面板。您可以看到该文件的URI,然后将其复制粘贴到浏览器中-这是一个文本文件,呈现效果很好。现在,我将URL中的UUID替换为我手头的UUID,并在那里存储文件。

我希望AWS有更好的方法来搜索文件,但这对我有用。


1

试试这个命令:

aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'

然后,您可以将其传送到grep中以获取特定的文件类型,以对它们进行任何处理。


1
注意:--output text指定输出将为纯文本,而不是JSON等,--query 'Contents[].{Key: Key, Size: Size}'仅将列表的输出过滤为文件名和文件大小。它不搜索Key: Key或类似内容。
马特

1

我尝试了以下方式

aws s3 ls s3://Bucket1/folder1/2019/ --recursive |grep filename.csv

这将输出文件所在的实际路径

2019-04-05 01:18:35     111111 folder1/2019/03/20/filename.csv

1

这是一个有点老的话题-但也许可以帮助仍在搜索的人-我就是那个搜索那一年的人。

解决方案可能是“ AWS Athena ”,您可以在其中搜索像这样的数据

'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'

https://aws.amazon.com/blogs/developer/introducing-support-for-amazon-s3-select-in-the-aws-sdk-for-javascript/

目前1TB数据的价格为5美元 -例如,如果您对一个1TB文件的查询进行了3倍的查询,则费用为15美元-例如,如果只有1列要转换的“转换列格式”,则需要支付1美元价格的/ 3表示$ 1.67 / TB。


对于任何需要密集搜索的应用程序似乎都不可行,因为其成本相当高……
tnkh

@tnkh我同意-我也希望在#s3中有更多选择
BG Bruno


0

我做了如下操作以找到我的存储桶中的模式

def getListOfPrefixesFromS3(dataPath: String, prefix: String, delimiter: String, batchSize: Integer): List[String] = {
    var s3Client = new AmazonS3Client()
    var listObjectsRequest = new ListObjectsRequest().withBucketName(dataPath).withMaxKeys(batchSize).withPrefix(prefix).withDelimiter(delimiter)
    var objectListing: ObjectListing = null
    var res: List[String] = List()

    do {
      objectListing = s3Client.listObjects(listObjectsRequest)
      res = res ++ objectListing.getCommonPrefixes
      listObjectsRequest.setMarker(objectListing.getNextMarker)
    } while (objectListing.isTruncated)
    res
  }

对于较大的存储桶,这会浪费太多时间,因为所有对象摘要都由Aws返回,而不仅仅是与前缀和分隔符匹配的对象。我正在寻找提高性能的方法,到目前为止,我仅发现我应该命名密钥并正确地将其组织在存储桶中。


0

我遇到了同样的问题。在S3中进行搜索应该比当前情况容易得多。因此,我在S3中实现了用于搜索的开源工具。

SSEARCH是完全开源的S3搜索工具。在实施时始终牢记性能是关键因素,并且根据基准,它会在几秒钟内搜索包含约1000个文件的存储桶。

安装很简单。您仅下载docker-compose文件并使用

docker-compose up

SSEARCH将启动,您可以在任何存储桶中搜索任何内容。


0

快进到2020年,并使用aws-okta作为我们的2fa,使用以下命令,而慢下来遍历此特定存储桶(+270,000)中的所有对象和文件夹,效果很好。

aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt

0

使用Amazon Athena查询S3存储桶。另外,将数据加载到Amazon Elastic search。希望这可以帮助。


0

这不是一个技术性的答案,但是我建立了一个允许通配符搜索的应用程序:https : //bucketsearch.net/

它将异步索引您的存储桶,然后允许您搜索结果。

它是免费使用的(捐赠软件)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.