数千のファイルが入ったバケットがあります。バケットを検索するにはどうすればよいですか?推奨できるツールはありますか?
S3にはネイティブの「このバケットを検索」がありません。実際のコンテンツが不明であるためです-また、S3はキー/値ベースであるため、(SELECT * FROM ... WHERE ...)
SQLモデル)。
必要なのは、ListBucket
を実行してバケット内のオブジェクトのリストを取得し、実装するカスタム操作を実行するすべてのアイテムを反復処理することです(これが検索です)。
ここに追加するだけで、3年後になりますが、「S3バケットを検索する方法」と入力すると、この投稿がGoogleのトップになります。
もっと複雑なものを探しているのかもしれませんが、タイトルからオブジェクト(ファイル)を簡単に見つける方法を見つけようとしてここに着いた場合、それは非常に単純です:
バケットを開き、右側で「なし」を選択し、ファイル名の入力を開始します。
http://docs.aws.Amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html
AWS CLI を使用してファイル名を検索する短いshortい方法を次に示します。
aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
「少なくともバケットを検索する」と説明できる2つの異なるユースケースがあります。
バケットに保存されているすべてのオブジェクトinsideを検索します。これは、そのバケット内のすべてのオブジェクト(テキストファイルなど)に共通の形式を想定しています。このような場合、Cody Caughlanがちょうど答えたとおりにする必要があります。 AWS S3ドキュメントには、AWS SDK for Javaでこれを行う方法を示すサンプルコードがあります。 AWS SDK for Javaを使用したキーのリスト (PHPおよびC#例)。
リストアイテムそのバケットに含まれるオブジェクトkeysで何かを検索します。 S3doesは、これをpartialサポートします。プレフィックス完全一致+区切り文字の後の一致を許可する形式です。これについては AWS S3開発者ガイド で詳しく説明されています。これにより、たとえば、オブジェクトキーとして次のようなものを使用して「フォルダ」を実装できます。
folder/subfolder/file.txtこの規則に従うと、ほとんどのS3 GUI(AWSコンソールなど)にバケットのフォルダービューが表示されます。
複数のオプションがありますが、単純な「ワンショット」フルテキストソリューションではありません。
キー名パターン検索:いくつかの文字列で始まるキーの検索-キー名を慎重に設計すると、かなり迅速な解決策が得られます。
キーに添付されたメタデータを検索:ファイルをAWS S3に投稿するとき、コンテンツを処理し、メタ情報を抽出し、このメタ情報をカスタムヘッダーの形式でキーに添付できます。これにより、完全なコンテンツを取得する必要なく、キー名とヘッダーを取得できます。検索はシーケンシャルに実行する必要がありますが、これには「sql like」検索オプションはありません。大きなファイルを使用すると、ネットワークトラフィックと時間を大幅に節約できます。
SimpleDBにメタデータを保存:前のポイントと同じですが、SimpleDBにメタデータを保存します。ここには、SQLのようなselectステートメントがあります。大きなデータセットの場合、SimpleDBの制限に達する可能性がありますが、これは克服できます(複数のSimpleDBドメインにまたがるパーティションメタデータ)。
コンテンツの連続全文検索-すべてのキーを1つずつ処理します。処理するキーが多すぎる場合、非常に遅くなります。
バージョン管理されたバケットを使用して、数年間、1日1440個のファイルを1分間(1分間に1つ)保管しています。これは簡単に可能です。ただし、バージョンごとに順番に移動する必要があるため、古いバージョンを取得するには時間がかかります。いつか、レコード付きのシンプルなCSVインデックスを使用して、公開時間とバージョンIDを表示し、これがあれば、古いバージョンにすばやくジャンプできました。
おわかりのように、AWS S3は全文検索用に設計された独自のものではなく、シンプルなストレージサービスです。
AWSは、SQLでS3バケットをクエリする新しいサービスをリリースしました:Amazon Athena https://aws.Amazon.com/athena/
aWSコンソールバケットビューで直接。
数千または数百万のファイルがある場合、必要なファイルを取得する別の方法は、distributed copyを使用して別の場所にコピーすることです。これを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にいることを考えると...彼らのCloudSearchツールを使いたいと思うでしょう。検索したいデータをサービスに入れて... S3キーを指すようにします。
Windowsを使用していて、Nice grep
の代替手段を見つける時間がない場合、迅速で汚れた方法は次のようになります。
aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt
次に、myfile.txtでクイック検索を実行します
「フォルダ」ビットはオプションです。
追伸AWS CLIをインストールしていない場合-Chocolateyパッケージマネージャーを使用した1つのライナー
choco install awscli
P.P.S. Chocolateyパッケージマネージャーがない場合は入手してください! Windowsでの生活が10倍良くなります。 (私はChocolateyとは何の関係もありませんが、本当に必要なものです、本当に)。
別のオプションは、Webサーバー上のS3バケットをミラーリングし、ローカルにトラバースすることです。秘Theは、ローカルファイルが空であり、スケルトンとしてのみ使用されることです。または、ローカルファイルには、通常S3から取得する必要のある有用なメタデータ(ファイルサイズ、MIMEタイプ、作成者、タイムスタンプ、UUIDなど)を保持できます。ファイルをダウンロードするURLを提供する場合、ローカルで検索し、S3アドレスへのリンクを提供します。
ローカルファイルトラバースは簡単であり、S3管理のこのアプローチは言語に依存しません。また、ローカルファイルトラバースは、ファイルのデータベースの維持とクエリを回避したり、バケットのコンテンツを認証および取得するための一連のリモートAPI呼び出しの遅延を回避したりします。
FTPまたはHTTPを介してサーバーにファイルを直接アップロードし、任意のサイズのファイルのディレクトリを再帰するだけで、ピーク時以外に新しいファイルと更新されたファイルのバッチをAmazonに転送できるようにすることができます。 Amazonへのファイル転送が完了したら、Webサーバーファイルを同じ名前の空のファイルに置き換えます。ローカルファイルにファイルサイズがある場合、バッチ転送を待機しているため、直接ファイルを提供します。
このコマンドを試してください:
aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'
次に、これをgrepにパイプして、特定のファイルタイプを取得し、必要な処理を実行できます。
私はバケツのパターンを見つけるために以下のようなことをしました
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によって返されるため、これは時間がかかりすぎます。私はパフォーマンスを改善する方法を探していますが、これまでのところ、キーに名前を付けて適切にバケットに整理する必要があることがわかりました。
このドキュメントをご覧ください: http://docs.aws.Amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
Perl互換正規表現(PCRE)を使用して、名前をフィルタリングできます。
私は次の方法で試しました
aws s3 ls s3://Bucket1/folder1/2019/ --recursive |grep filename.csv
これは、ファイルが存在する実際のパスを出力します
2019-04-05 01:18:35 111111 folder1/2019/03/20/filename.csv
ステータス2018-07:Amazonには、csvおよびjsonファイルの検索のようなネイティブSQLがあります!
私がやった方法は次のとおりです。s3には数千のファイルがあります。リスト内の1つのファイルのプロパティパネルを見ました。あなたはそのファイルのURIを見ることができ、それをブラウザにコピーしました-それはテキストファイルであり、うまくレンダリングされました。ここで、URLのuuidを手元にあるuuidに置き換えて、ファイルがそこにあります。
AWSでファイルを検索するためのより良い方法があればいいのですが、これはうまくいきました。
これは少し古いスレッドです-しかし、おそらくまだ検索する人を助ける-私はその年を検索する人です。
解決策は「 AWS Athena 」で、このようなデータを検索できます
'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'
現在の価格は 1TBデータに対して5ドル -したがって、1TBファイルを3回検索する場合、コストは15ドルですが、「変換された列形式」の列が1列しかない場合は、支払います価格の1/3は1.67ドル/ TBです。