回答:
実際のコンテンツは不明なので、S3にはネイティブの「このバケットを検索」はありません。また、S3はキー/値に基づいているため、(SELECT * FROM ... WHERE ...)
(SQLで)モデル)。
実行する必要があるのはListBucket
、バケット内のオブジェクトのリストを取得し、実装するカスタム操作(検索)を実行するすべてのアイテムを反復処理することです。
ここに追加するメモ:3年後のことですが、「S3バケットを検索する方法」と入力すると、この投稿がGoogleでトップになります。
おそらくもっと複雑なものを探しているでしょうが、オブジェクト(ファイル)をタイトルで簡単に見つける方法を理解しようとしてここに上陸した場合、それは驚くほど簡単です。
バケットを開き、右側の[なし]を選択して、ファイル名の入力を開始します。
http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html
AWS CLIを使用してファイル名を検索する短くて醜い方法は次のとおりです。
aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
cut -c 32-
タイムスタンプとファイルサイズの情報を出力から削除するだけです。私のシステムでは32文字を占めています。必要はありませんが、出力を別のコマンドにパイプ処理している場合は、「クリーン」な出力を取得すると便利です。
include/exclude
。したがって、aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
「バケットを検索する」と説明できる(少なくとも)2つの異なる使用例があります。
バケットに保存されているすべてのオブジェクト内で何かを検索します。これは、そのバケット内のすべてのオブジェクト(たとえば、テキストファイル)などに共通の形式を想定しています。このような場合、Cody Caughlanが答えたばかりのことを強制されます。AWS S3ドキュメントには、AWS SDK for Javaでこれを行う方法を示すサンプルコードがあります:AWS SDK for Java を使用してキーをリストする(PHPとC#の例もあります)。
リストアイテムそのバケットに含まれるオブジェクトキーで何かを検索します。S3 は、これを部分的にサポートしています。プレフィックスの完全一致と、区切り文字の後に一致する折りたたみの一致を許可する形式です。これについては、AWS S3開発者ガイドで詳しく説明されています。これにより、たとえば、次のようなオブジェクトキーとして「フォルダ」を実装できます。
folder / subfolder / file.txtこの規則に従うと、ほとんどのS3 GUI(AWSコンソールなど)にバケットのフォルダービューが表示されます。
AWSはSQLでS3バケットをクエリする新しいサービスをリリースしました:Amazon Athena https://aws.amazon.com/athena/
複数のオプションがありますが、どれも単純な「ワンショット」フルテキストソリューションではありません。
キー名パターン検索:いくつかの文字列で始まるキーの検索 -キー名を注意深く設計すると、かなり迅速な解決策が得られる可能性があります。
キーに添付されたメタデータを検索:AWS S3にファイルを送信するときに、コンテンツを処理し、メタ情報を抽出して、このメタ情報をカスタムヘッダーの形式でキーに添付できます。これにより、完全なコンテンツをフェッチする必要なく、キー名とヘッダーをフェッチできます。検索は順次実行する必要があります。これには「SQLのような」検索オプションはありません。大きなファイルを使用すると、ネットワークトラフィックと時間を大幅に節約できます。
SimpleDBにメタデータを保存する:前のポイントと同じですが、SimpleDBにメタデータを保存します。ここには、selectステートメントのようなSQLがあります。大規模なデータセットの場合、SimpleDBの制限に達する可能性がありますが、これは克服できます(複数のSimpleDBドメインにまたがるパーティションメタデータ)。
コンテンツの順次全文検索 -すべてのキーを1つずつ処理します。処理するキーが多すぎる場合は非常に遅くなります。
バージョン化されたバケットを使用すると、ファイルの1440バージョンを1日に1分(1分に1つ)数年間保存できます。これは簡単に可能です。ただし、バージョンごとに順次移行する必要があるため、古いバージョンを入手するには時間がかかります。時には、レコード付きのシンプルなCSVインデックスを使用して、公開時間とバージョンIDを表示します。これがあると、以前のバージョンにすばやくジャンプできます。
ご覧のとおり、AWS S3はフルテキスト検索専用に設計されたものではなく、シンプルなストレージサービスです。
AWSコンソールのバケットビューで直接。
数千または数百万のファイルがある場合、必要なファイルを取得する別の方法は、分散コピーを使用してそれらを別の場所にコピーすることです。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"
}
]
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とは関係ありませんが、ねえ、それは本当に必需品です)。
別のオプションは、Webサーバー上のS3バケットをミラーリングし、ローカルにトラバースすることです。トリックは、ローカルファイルが空で、スケルトンとしてのみ使用されることです。または、ローカルファイルには、通常S3から取得する必要がある有用なメタデータ(ファイルサイズ、mimetype、作成者、タイムスタンプ、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にパイプして、特定のファイルタイプを取得し、それらを使用して何でも実行できます。
--output text
出力がJSONなどではなくプレーンテキストであることを指定し、--query 'Contents[].{Key: Key, Size: Size}'
リストの出力をファイル名とファイルサイズにフィルターするだけです。検索Key: Key
等はしません。
これは少し古いスレッドですが、まだ検索している人を助けるかもしれません-私はその年を検索する人です。
ソリューションは「AWS Athena」かもしれません。このようにデータを検索できます
'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'
現在の価格は1 TBのデータで5ドルです。たとえば、1 TBのファイルを3回クエリした場合のコストは15ドルですが、たとえば、「変換された列形式」に1列しかない場合は、1を支払います。価格の/ 3は、$ 1.67 / TBを意味します。
このドキュメントをご覧ください:http : //docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
Perl互換の正規表現(PCRE)を使用して、名前をフィルタリングできます。
私はバケツのパターンを見つけるために以下のようなことをしました
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によって返されるため、これは時間がかかりすぎます。パフォーマンスを改善する方法を探していますが、これまでのところ、キーに名前を付けてバケットに適切に整理する必要があることがわかりました。
技術的な答えではありませんが、ワイルドカード検索を可能にするアプリケーションを作成しました:https : //bucketsearch.net/
バケットに非同期でインデックスを付け、結果を検索できるようにします。
使用は無料です(寄付ウェア)。
ステータス2018-07:Amazonには、csvおよびjsonファイルの検索のようなネイティブSQLがあります!