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

时间:2011-02-12 16:42:48

标签: amazon-web-services amazon-s3

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

21 个答案:

答案 0 :(得分:232)

这里只需添加一条注释:它现在已经过了3年,但当您输入“如何搜索S3 Bucket”时,此帖子在Google中排名第一。

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

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

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

答案 1 :(得分:73)

这是使用AWS CLI搜索文件名的简短方法:

var app = this;

stanservice.categoryDetail(this.params.get('id'))
   .then((data) => {
      app.category = data.res.rows[0];
      console.log(data.res.rows[0]);
})
.catch((error) => {
   console.log("Error message", error.err);
});

答案 2 :(得分:22)

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

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

  2. 列表项搜索该存储桶中包含的对象中的内容; S3 支持部分支持,其形式是允许前缀完全匹配+在分隔符后折叠匹配。这在AWS S3 Developer Guide更详细地解释。例如,这允许通过使用诸如

    folder/subfolder/file.txt
    之类的对象键来实现“文件夹”。如果遵循此约定,大多数S3 GUI(例如AWS控制台)将显示一个文件夹查看你的水桶。

答案 3 :(得分:22)

S3没有本机“搜索此存储桶”,因为实际内容未知 - 同样,由于S3是基于密钥/值的,因此没有本地方法可以同时访问多个节点ala更传统的数据存储提供{ {1}}(在SQL模型中)。

您需要做的是执行(SELECT * FROM ... WHERE ...)以获取存储桶中的对象列表,然后迭代执行您实施的自定义操作的每个项目 - 这是您的搜索。

答案 4 :(得分:19)

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

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

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

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

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

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

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

答案 5 :(得分:15)

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

答案 6 :(得分:4)

鉴于您在AWS ...我认为您会想要使用他们的CloudSearch工具。将要搜索的数据放入其服务中......将其指向S3键。

http://aws.amazon.com/cloudsearch/

答案 7 :(得分:4)

在S3控制台中按前缀搜索

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

enter image description here

使用s3-dist-cp

复制所需文件

当您拥有数千或数百万个文件时,另一种获取所需文件的方法是使用分布式副本将它们复制到另一个位置。您在Hadoop作业中的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"
    }
]

答案 8 :(得分:2)

如果您使用的是Windows,并且没有时间找到不错的{("A", "B"), ("A", "C"), ("A", "D"), ("B", "E"), ("C", "D")} 替代方案,那么一种快速而肮脏的方法将是:

grep

,然后在myfile.txt中快速搜索

“文件夹”位是可选的。

P.S。如果您未安装AWS CLI,请使用Chocolatey软件包管理器

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

P.P.S。如果您没有Chocolatey包裹管理器,那就赶快行动!您在Windows上的生活将提高10倍。 (我与Chocolatey无关,但是,这确实是必须的)。

答案 9 :(得分:1)

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

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

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

答案 10 :(得分:1)

尝试此命令:

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

然后你可以把它传递给一个grep来获取特定的文件类型,以便用它们做任何你想做的事。

答案 11 :(得分:0)

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

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

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

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

答案 14 :(得分:0)

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

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

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

运行
docker-compose up

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

答案 15 :(得分:0)

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

解决方案可能是“ 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/

当前定价为$5 for 1TB data-因此,如果您对一个1TB文件的查询进行了3倍的查询,则费用为15美元,但是如果只有1列以“转换后的列格式”显示,则您需要支付1/3价格为1.67美元/ TB。

答案 16 :(得分:0)

我以以下方式尝试

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

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

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

答案 17 :(得分:0)

2018-07年状态: 亚马逊确实有本地sql,例如搜索csv和json文件!

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

答案 18 :(得分: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返回的,而不仅仅是与前缀和分隔符匹配的对象摘要,因此会消耗太多时间。我正在寻找提高性能的方法,到目前为止我只发现我应该为键命名并正确地将它们组织在桶中。

答案 19 :(得分:0)

我这样做的方式是: 我在s3中有成千上万的文件。 我在列表中看到了一个文件的属性面板。您可以看到该文件的URI,并将其复制粘贴到浏览器 - 它是一个文本文件,并且呈现得很好。现在我用手头的uuid替换了网址中的uuid,然后在那里展开文件。

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

答案 20 :(得分:0)

请查看此文档:http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list

您可以使用Perl兼容的正则表达式(PCRE)来过滤名称。