【问题标题】:How do you search an amazon s3 bucket?你如何搜索亚马逊 s3 存储桶?
【发布时间】:2011-06-26 03:20:20
【问题描述】:

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

【问题讨论】:

标签: amazon-web-services amazon-s3


【解决方案1】:

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

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

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

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

【讨论】:

  • 这正是我想要的。糟糕的用户体验设计,视觉提示为零
  • 还是只让你按项目名称的前缀搜索。
  • 这绝对是真气!人们在谈论右边的东西或黄色框,但我找不到任何东西。只是相同的“输入前缀...”消息。 “搜索桶”怎么不是默认的?它几乎和 Atlassian 软件一样难以被发现……
  • 这个答案仍然是最新的吗?我在右侧看不到任何“无”,并且答案中的文档链接现在转发到不同的页面。
  • 显然,这个答案被认为是正确答案的人们投票赞成。它不是。这对于包含数千或数十万个文件的存储桶是不可能的。
【解决方案2】:

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

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

【讨论】:

  • aws s3 ls s3://your-bucket --recursive | grep your-search 对我的搜索来说已经足够好了,感谢 Abe Voelker。
  • 所有存储桶: aws s3 ls | awk '{打印 $3}' |而读线;回声 $line ; aws s3 ls s3://$line --recursive | grep 你的搜索;完成
  • what is cut -c 32- without this also search is working
  • cut -c 32- 只是从输出中删除时间戳和文件大小信息,在我的系统上占用 32 个字符。您不需要它,但如果您将输出传送到另一个命令中,那么“干净”的输出可能会很方便。
  • @Mohnish 哪个版本?我的版本 (aws-cli/1.15.63) 没有这些选项。
【解决方案3】:

S3 没有原生的“搜索此存储桶”,因为实际内容是未知的 - 此外,由于 S3 是基于键/值的,因此没有原生方式一次访问多个节点,而更传统的数据存储提供了 @ 987654323@(在 SQL 模型中)。

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

【讨论】:

  • 现在已经不是这样了。请参阅下面 rhonda 的回答:stackoverflow.com/a/21836343/1101095
  • 致上述评论的所有支持者:OP 没有表明他们是要搜索文件名还是关键内容(例如文件内容)。所以@rhonda 的回答可能还不够。看来这最终是留给消费者的练习,因为您的应用程序用户和一般用户几乎无法使用 S3 控制台。它基本上只与存储桶所有者和/或 IAM 角色有关。
  • 有没有像lucene.net这样的索引服务来索引这些bucket文档。
  • 我不断返回这个答案并构建了一个工具来提供帮助:bucketsearch.net - 允许通配符搜索等
【解决方案4】:

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

【讨论】:

  • 啊……我明白了……“Athena 在美国西部(加利福尼亚北部)不可用。请选择其他区域。”
  • 考虑到我只想要 grep,所有这些 SQL 查询都是开销
  • @Clintm - 更改为 us-east-1(弗吉尼亚北部)
【解决方案5】:

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

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

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

    这样的对象键来实现“文件夹”
    folder/subfolder/file.txt
    如果您遵循此约定,大多数 S3 GUI(例如 AWS 控制台)将向您显示存储桶的文件夹视图。

【讨论】:

  • ruby中使用前缀的文档
【解决方案6】:

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

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

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

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

  4. 连续全文搜索 - 一个一个地处理所有的键。非常慢,如果您要处理的键太多。

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

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

【讨论】:

    【解决方案7】:

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

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

    然后在 myfile.txt 中快速搜索

    “文件夹”位是可选的。

    附:如果您没有安装 AWS CLI - 这是一个使用 Chocolatey 包管理器的单行程序

    choco install awscli

    附言如果你没有 Chocolatey 包管理器 - 得到它!您在 Windows 上的生活将提高 10 倍。 (我与 Chocolatey 没有任何关系,但是,嘿,它是必备品,真的)。

    【讨论】:

    • 如果用户可以 choco install awscli 他们可以安装 grep,不是吗?还是使用 windows 的原生查找?
    【解决方案8】:

    在 S3 控制台中按前缀搜索

    直接在 AWS 控制台存储桶视图中。

    使用 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"
        }
    ]
    

    【讨论】:

    • AWS 控制台存储桶视图似乎不会逐个文件地应用过滤器。提供我正在寻找的文件的子字符串,它能够非常快速地返回结果。除了 AWS 控制台之外,我是否可以使用客户端/工具/API 来及时获得结果。 @high6 。过去我曾尝试使用 boto,但最好的方法似乎是迭代整个存储桶,将您的搜索条件应用于每个文件名。 IE。非常慢
    • 按前缀搜索对我没有帮助。我想找到一个我认为位于存储桶的某些子文件夹中的 SQL 文件。将 *.sql 放在“按前缀搜索”框中不会返回任何结果。虽然里面有很多 SQL 文件……但可能不是我要找的。​​span>
    【解决方案9】:

    试试这个命令:

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

    然后,您可以将其通过管道传输到 grep 中,以获取特定的文件类型以对它们执行任何操作。

    【讨论】:

    • 注意:--output text 指定输出将是纯文本,而不是 JSON 等,--query 'Contents[].{Key: Key, Size: Size}' 仅将列表的输出过滤为文件名和文件大小。它不搜索Key: Key 等。
    【解决方案10】:

    我尝试了以下方式

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

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

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

    【讨论】:

      【解决方案11】:

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

      【讨论】:

        【解决方案12】:

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

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

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

        【讨论】:

        • 如果您的 S3 存储桶中有数百万个文件,则可以很好地扩展 EXTFS2/3 磁盘上的节点存储空间...
        【解决方案13】:

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

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

        【讨论】:

        • 根本不是 OP 想要的东西
        • 对我来说这意味着保存所有数据 - 数据重复
        【解决方案14】:

        我的做法是: 我在 s3 中有数千个文件。 我在列表中看到了一个文件的属性面板。您可以看到该文件的 URI,然后我将其复制并粘贴到浏览器中——它是一个文本文件,并且呈现得很好。现在我用我手头的 uuid 替换了 url 中的 uuid,文件就在那里。

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

        【讨论】:

          【解决方案15】:

          这是一个有点旧的线程 - 但也许可以帮助仍在搜索的人 - 我是一年搜索那个的人。

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

          【讨论】:

          • 对于任何需要密集搜索的应用程序似乎都不可行,因为成本相当高...
          • @tnkh 我同意 - 我也想要#s3 的更多选项
          【解决方案16】:

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

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

          【讨论】:

            【解决方案17】:

            我做了如下的事情来找到我的桶中的模式

            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 返回,而不仅仅是匹配前缀和分隔符的那些。我正在寻找提高性能的方法,到目前为止我只发现我应该命名键并将它们正确地组织在存储桶中。

            【讨论】:

              【解决方案18】:

              状态 2018-07: 亚马逊确实有原生 sql,比如搜索 csv 和 json 文件!

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

              【讨论】:

                【解决方案19】:

                我遇到了同样的问题。在 S3 中搜索应该比目前的情况容易得多。这就是为什么我在 S3 中实现了这个用于搜索的开源工具。

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

                安装很简单。您只需下载 docker-compose 文件并运行它

                docker-compose up
                

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

                【讨论】:

                  【解决方案20】:

                  快进到 2020 年,使用 aws-okta 作为我们的 2fa,以下命令虽然在这个特定存储桶 (+270,000) 中迭代所有对象和文件夹的速度非常慢。

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

                  【讨论】:

                    【解决方案21】:

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

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

                    免费使用(捐赠软件)。

                    【讨论】:

                      猜你喜欢
                      • 2019-08-27
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2017-03-03
                      • 1970-01-01
                      • 2011-03-09
                      • 2019-09-05
                      相关资源
                      最近更新 更多