Amazon s3バケットをどのように検索しますか?


159

何千ものファイルが入ったバケットがあります。バケットを検索するにはどうすればよいですか?おすすめできるツールはありますか?


私は複数のバケットを持っているので、それらすべてを検索する短いスクリプトを作成しました:github.com/laurenfitch/utilities/blob/master/query_s3.py
Lauren Fitch

回答:


31

実際のコンテンツは不明なので、S3にはネイティブの「このバケットを検索」はありません。また、S3はキー/値に基づいているため、(SELECT * FROM ... WHERE ...)(SQLで)モデル)。

実行する必要があるのはListBucket、バケット内のオブジェクトのリストを取得し、実装するカスタム操作(検索)を実行するすべてのアイテムを反復処理することです。


42
これはもう当てはまりません。以下のrhondaの回答を参照してください:stackoverflow.com/a/21836343/1101095
Nate

11
上記のコメントの賛成者全員に:OPは、ファイル名を検索するのか、主要なコンテンツ(ファイルのコンテンツなど)を検索するのかを示していません。したがって、@ rhondaの答えはまだ十分ではない可能性があります。アプリユーザーと一般ユーザーはS3コンソールを使用することがほとんどできないため、これは最終的には消費者に委ねられた課題のようです。基本的に、バケットの所有者やIAMの役割にのみ関係します。
Cody Caughlan、2015

これらのバケットドキュメントにインデックスを付けるためのlucene.netのようなインデックスサービスはありますか?
Munavvar

私はこの答えに何度も戻ってきて、役立つツールを構築しました:bucketsearch.net-ワイルドカード検索などを可能にします
Jon M

251

ここに追加するメモ:3年後のことですが、「S3バケットを検索する方法」と入力すると、この投稿がGoogleでトップになります。

おそらくもっと複雑なものを探しているでしょうが、オブジェクト(ファイル)をタイトルで簡単に見つける方法を理解しようとしてここに上陸した場合、それは驚くほど簡単です。

バケットを開き、右側の[なし]を選択して、ファイル名の入力を開始します。

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


43
これはまさに私が探していたものです。視覚的な手がかりが
まったく

2
バケット内のファイルを選択してから入力を開始する必要があります。
cabe56 2015

30
それでも、アイテム名のプレフィックスで検索してみましょう。
Daniel Flippance、2016年

21
これは絶対に腹立たしいです!人々は右側か黄色い箱で何かについて話しているが、私は何も見つけられない。ちょうど同じ「プレフィックスを入力...」メッセージ。「検索バケット」がデフォルトではないのはなぜですか?アトラシアンのソフトウェアとほとんど同じように発見できません...
vegather

40
この答えはまだ最新ですか?右側に「なし」が表示されず、回答のドキュメントリンクが別のページに転送されます。
BiscuitBaker 2018

112

AWS CLIを使用してファイル名を検索する短くて醜い方法は次のとおりです。

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

1
aws s3 ls s3:// your-bucket --recursive | grep your-search Abe Voelkerに感謝します。
man.2067067

3
すべてのバケット: aws s3 ls | awk '{print $ 3}' | 行を読みながら; $ lineをエコーし​​ます。aws s3 ls s3:// $ line --recursive | grep your-search; 完了
Akom

1
何がカットされている-c 32-これなしでも検索は機能します
sunil

1
cut -c 32-タイムスタンプとファイルサイズの情報を出力から削除するだけです。私のシステムでは32文字を占めています。必要はありませんが、出力を別のコマンドにパイプ処理している場合は、「クリーン」な出力を取得すると便利です。
Abe Voelker

CLIはをサポートしていますinclude/exclude。したがって、aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
モニッシュ

25

「バケットを検索する」と説明できる(少なくとも)2つの異なる使用例があります。

  1. バケットに保存されているすべてのオブジェクトで何か検索します。これは、そのバケット内のすべてのオブジェクト(たとえば、テキストファイル)などに共通の形式を想定しています。このような場合、Cody Caughlanが答えたばかりのことを強制されます。AWS S3ドキュメントには、AWS SDK for Javaでこれを行う方法を示すサンプルコードがあります:AWS SDK for Java を使用してキーをリストする(PHPとC#の例もあります)。

  2. リストアイテムそのバケットに含まれるオブジェクトキーで何かを検索します。S3 、これを部分的にサポートます。プレフィックスの完全一致と、区切り文字の後に一致する折りたたみの一致を許可する形式です。これについては、AWS S3開発者ガイドで詳しく説明されています。これにより、たとえば、次のようなオブジェクトキーとして「フォルダ」を実装できます。

    folder / subfolder / file.txt
    この規則に従うと、ほとんどのS3 GUI(AWSコンソールなど)にバケットのフォルダービューが表示されます。



22

AWSはSQLでS3バケットをクエリする新しいサービスをリリースしました:Amazon Athena https://aws.amazon.com/athena/


2
argh…わかりました…「アテナは米国西部(北カリフォルニア)では利用できません。別の地域を選択してください。」
Clintm 2017

2
これは、私がgrepだけを望んでいたことを考えると、このすべてのSQLクエリのオーバーヘッドです
Ali Gajani '11

4
@Clintm-us-east-1(バージニア
北部

21

複数のオプションがありますが、どれも単純な「ワンショット」フルテキストソリューションではありません。

  1. キー名パターン検索:いくつかの文字列で始まるキーの検索 -キー名を注意深く設計すると、かなり迅速な解決策が得られる可能性があります。

  2. キーに添付されたメタデータを検索:AWS S3にファイルを送信するときに、コンテンツを処理し、メタ情報を抽出して、このメタ情報をカスタムヘッダーの形式でキーに添付できます。これにより、完全なコンテンツをフェッチする必要なく、キー名とヘッダーをフェッチできます。検索は順次実行する必要があります。これには「SQLのような」検索オプションはありません。大きなファイルを使用すると、ネットワークトラフィックと時間を大幅に節約できます。

  3. SimpleDBにメタデータを保存する:前のポイントと同じですが、SimpleDBにメタデータを保存します。ここには、selectステートメントのようなSQLがあります。大規模なデータセットの場合、SimpleDBの制限に達する可能性がありますが、これは克服できます(複数のSimpleDBドメインにまたがるパーティションメタデータ)。

  4. コンテンツの順次全文検索 -すべてのキーを1つずつ処理します。処理するキーが多すぎる場合は非常に遅くなります。

バージョン化されたバケットを使用すると、ファイルの1440バージョンを1日に1分(1分に1つ)数年間保存できます。これは簡単に可能です。ただし、バージョンごとに順次移行する必要があるため、古いバージョンを入手するには時間がかかります。時には、レコード付きのシンプルなCSVインデックスを使用して、公開時間とバージョンIDを表示します。これがあると、以前のバージョンにすばやくジャンプできます。

ご覧のとおり、AWS S3はフルテキスト検索専用に設計されたものではなく、シンプルなストレージサービスです。


4

S3コンソールでプレフィックスで検索

AWSコンソールのバケットビューで直接。

ここに画像の説明を入力してください

s3-dist-cpを使用して必要なファイルをコピーする

数千または数百万のファイルがある場合、必要なファイルを取得する別の方法は、分散コピーを使用してそれらを別の場所にコピーすることです。EMRでこれをHadoopジョブで実行します。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でクイック検索を行います

「フォルダ」ビットはオプションです。

AWS CLIがインストールされていない場合のPS-Chocolateyパッケージマネージャーを使用した1つのライナー

choco install awscli

PPS Chocolateyパッケージマネージャーがない場合は、入手してください!Windowsでの生活が10倍向上します。(私はどうしてもChocolateyとは関係ありませんが、ねえ、それは本当に必需品です)。


ユーザーがawscliをchocoインストールできる場合、grepをインストールできますか?または、Windowsのネイティブ検索を使用しますか?
ディーンラドクリフ

2

あなたがAWSにいるとすれば...彼らのCloudSearchツールを使用したいと思うでしょう。検索するデータをサービスに配置します。S3キーをポイントします。

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


7
実際にはOPが求めていたものとはまったく
異なり

私にとっては、すべてのデータをそこに保存することを意味します-データの複製
BG Bruno

1

別のオプションは、Webサーバー上のS3バケットをミラーリングし、ローカルにトラバースすることです。トリックは、ローカルファイルが空で、スケルトンとしてのみ使用されることです。または、ローカルファイルには、通常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等はしません。
Matt

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/

現在の価格は1 TBのデータで5ドルです。たとえば、1 TBのファイルを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年まで早送りし、次のコマンドである2faとしてaws-oktaを使用すると、この特定のバケット(+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/

バケットに非同期でインデックスを付け、結果を検索できるようにします。

使用は無料です(寄付ウェア)。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.