你如何搜索亚马逊s3水桶?

vin*_*boy 143 amazon-s3 amazon-web-services

我有一个包含数千个文件的存储桶.如何搜索存储桶?有推荐的工具吗?

小智 242

只需在此处添加一条注释:现在已经过了3年,但当您输入"如何搜索S3存储桶"时,此帖子在Google中排名第一.

也许你正在寻找一些更复杂的东西,但是如果你在这里试图弄清楚如何通过它的标题找到一个对象(文件),这很简单:

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

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

  • 这正是我所寻找的.糟糕的用户体验设计,零视觉线索 (38认同)
  • 这个答案还是最新的吗?我没有在右侧看到任何"无",答案中的文档链接现在转发到另一页. (33认同)
  • 仍然只允许您按项目名称的前缀进行搜索. (26认同)
  • 这绝对令人气愤!人们正在谈论右手边的东西或黄色的盒子,但我找不到任何东西.只是相同的"输入前缀..."消息."搜索存储桶"如何不是默认值?它几乎和Atlassian软件一样难以发现...... (17认同)
  • 显然,这个答案被人们投票赞成,认为这是正确的答案。它不是。对于包含数千或数十万个文件的存储桶来说,这是不可能的。 (11认同)
  • @JonM 很酷,因为我无法将我的信用插入别人的网站。 (3认同)
  • 需要在存储桶中选择一个文件,然后开始输入. (2认同)

Abe*_*ker 95

以下是使用AWS CLI执行搜索文件名的简短方法:

aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
Run Code Online (Sandbox Code Playgroud)

  • 关于完美运作的东西,没什么难看的 (13认同)
  • `cut -c 32-` 只是从输出中删除时间戳和文件大小信息,在我的系统上它占用 32 个字符。您不需要它,但是如果您将输出通过管道传输到另一个命令中,那么拥有“干净”的输出可能会很方便。 (4认同)
  • **所有桶:**aws s3 ls | awk'{print $ 3}'| 读线; 回声$ line; aws s3 ls s3:// $ line --recursive | grep你的搜索; DONE (3认同)

Cod*_*lan 27

S3没有一个本土"搜索这个桶",因为实际内容是未知的-也是,S3是基于有一次,提供一个更ALA传统的数据存储访问许多节点没有本地方向键/值(SELECT * FROM ... WHERE ...)(在SQL模型).

您需要做的是执行ListBucket以获取存储桶中的对象列表,然后迭代执行您实现的自定义操作的每个项目 - 这是您的搜索.

  • 这已不再是这种情况.请参阅下面的rhonda答案:http://stackoverflow.com/a/21836343/1101095 (38认同)
  • 对于上述评论的所有赞成者:OP没有表明他们是否想要搜索文件名或密钥内容(例如文件内容).所以@rhonda的答案仍然可能还不够.看起来最终这是留给消费者的练习,因为使用S3控制台几乎不能为您的应用用户和普通用户所用.它基本上只对桶所有者和/或IAM角色有所帮助. (7认同)

Edu*_*bes 23

有(至少)两种不同的用例,可以描述为"搜索桶":

  1. 搜索存储在存储桶中的每个对象的内容; 这假定了该桶中所有对象的通用格式(比如文本文件)等等.对于这样的事情,你被迫做了Cody Caughlan刚才回答的事情.AWS S3 docs的示例代码显示了如何使用AWS SDK for Java执行此操作:列出键使用AWS SDK for Java(您还可以找到PHP和C#示例).

  2. 列表项搜索该存储桶中包含的对象键中的内容; S3 确实对此有部分支持,允许前缀完全匹配+在分隔符后折叠匹配.AWS S3开发人员指南中对此进行了更详细的说明.例如,这允许通过使用类似的对象键来实现"文件夹"

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


Jan*_*sky 19

有多种选择,没有一种是简单的"一次性"全文解决方案:

  1. 密钥名称模式搜索:搜索以某些字符串开头的密钥 - 如果您仔细设计密钥名称,那么您可能有相当快速的解决方案.

  2. 搜索附加到密钥的元数据:将文件发布到AWS S3时,您可以处理内容,提取一些元信息,并将此元信息以自定义标头的形式附加到密钥中.这使您可以获取密钥名称和标头,而无需获取完整内容.搜索必须顺序完成,没有"sql like"搜索选项.使用大文件可以节省大量网络流量和时间.

  3. 将数据库存储在SimpleDB上:如前所述,但将元数据存储在SimpleDB上.这里你有像select语句的sql.在大型数据集的情况下,您可能会遇到SimpleDB限制,这可以克服(跨多个SimpleDB域的分区元数据),但如果您走得很远,您可能需要使用另一个metedata类型的数据库.

  4. 内容的连续全文搜索 - 逐个处理所有密钥.非常慢,如果你有太多的钥匙要处理.

我们每天存储1440个文件版本(每分钟一个)几年,使用版本化的存储桶,很容易实现.但是获得一些旧版本需要时间,因为必须按版本顺序进行版本化.有时我使用简单的CSV索引和记录,显示发布时间和版本ID,有了这个,我可以很快地跳转到旧版本.

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


hel*_*bye 19

AWS发布了一个使用SQL查询S3存储桶的新服务:Amazon Athena https://aws.amazon.com/athena/

  • 啊……我明白了……“Athena 在美国西部(加利福尼亚北部)不可用。请选择另一个地区。” (2认同)
  • 考虑到我只想要 grep,这是所有这些 SQL 查询的开销 (2认同)
  • @Clintm-更改为us-east-1(弗吉尼亚北部) (2认同)

Ale*_*lex 6

如果您使用的是 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 没有任何关系,但是嘿,这是必须的,真的)。


Dhe*_*raj 5

我尝试了以下方式

aws s3 ls s3://Bucket1/folder1/2019/ --recursive |grep filename.csv
Run Code Online (Sandbox Code Playgroud)

这输出文件存在的实际路径

2019-04-05 01:18:35     111111 folder1/2019/03/20/filename.csv
Run Code Online (Sandbox Code Playgroud)