답변:
S3는 네이티브가 실제 내용부터 "이 버킷 검색"이없는 것은 알 수 - 또한, S3가 제공 ALA보다 전통적인 데이터 스토어를 한 번에 액세스 여러 노드에 네이티브 방법이 없다는 기반 키 / 값이므로 (SELECT * FROM ... WHERE ...)
(A SQL에가 모델).
당신이 할 필요가 수행하는 것은 ListBucket
당신의 검색 인 - a를 양동이에 개체의 목록 다음으로 반복은 모든 항목에 걸쳐 당신이 구현하는 사용자 정의 작업을 수행을 얻을 수 있습니다.
여기에 추가하기위한 참고 사항 : 이제 3 년이 지난 지금 "S3 버킷을 검색하는 방법"을 입력하면이 게시물이 Google에서 1 위를 차지합니다.
아마도 당신은 좀 더 복잡한 것을 찾고있을 것입니다. 그러나 제목으로 객체 (파일)를 찾는 방법을 알아 내려고 여기에 착륙했다면 미친 듯이 간단합니다.
버킷을 열고 오른쪽에서 "없음"을 선택한 다음 파일 이름을 입력하십시오.
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*'
"버킷 검색"으로 설명 할 수있는 두 가지 다른 사용 사례가 있습니다.
버킷에 저장된 모든 객체 내부 에서 무언가를 검색합니다 . 이것은 해당 버킷의 모든 객체 (예 : 텍스트 파일 등)에 대한 공통 형식을 가정합니다. 이와 같은 경우 Cody Caughlan이 방금 응답 한 것을 수행해야합니다. AWS S3 문서에는 AWS SDK for Java로이 작업을 수행하는 방법을 보여주는 예제 코드 가 있습니다. Java 용 AWS SDK를 사용하여 키 나열 (PHP 및 C # 예제도 있습니다).
목록 항목 해당 버킷에 포함 된 객체 키 에서 무언가를 검색합니다 . S3는 않습니다 이 부분 구분 한 후 일치를 무너 접두사 정확히 일치 +를 허용하는 형태로,이에 대한 지원을. 이에 대한 자세한 내용은 AWS S3 개발자 안내서를 참조하십시오 . 이를 통해 예를 들어 다음과 같은 객체 키로 사용하여 "폴더"를 구현할 수 있습니다.
폴더 / 하위 폴더 /file.txt이 규칙을 준수하면 대부분의 S3 GUI (예 : AWS 콘솔)에 버킷의 폴더보기가 표시됩니다.
AWS는 SQL을 사용하여 S3 버킷을 쿼리하는 새로운 서비스를 출시했습니다. Amazon Athena https://aws.amazon.com/athena/
여러 가지 옵션이 있지만 간단한 "원샷"전체 텍스트 솔루션은 없습니다.
키 이름 패턴 검색 : 문자열로 시작하는 키 검색-키 이름을 신중하게 디자인하면 빠른 해결 방법이있을 수 있습니다.
키에 첨부 된 메타 데이터 검색 : 파일을 AWS S3에 게시 할 때 콘텐츠를 처리하고 일부 메타 정보를 추출한 후이 메타 정보를 사용자 지정 헤더 형태로 키에 첨부 할 수 있습니다. 이를 통해 완전한 컨텐츠를 가져올 필요없이 키 이름과 헤더를 가져올 수 있습니다. 검색은 순차적으로 수행되어야하며 이에 대한 "sql like"검색 옵션이 없습니다. 파일이 크면 많은 네트워크 트래픽과 시간을 절약 할 수 있습니다.
SimpleDB에 메타 데이터를 저장하십시오. 이전 포인트로 메타 데이터를 SimpleDB 에 저장합니다. 여기에는 SQL과 같은 select 문이 있습니다. 큰 데이터 세트의 경우 극복 할 수있는 SimpleDB 제한에 도달 할 수 있지만 (여러 SimpleDB 도메인의 파티션 메타 데이터) 실제로 멀어지면 다른 메타 데이터 유형의 데이터베이스를 사용해야합니다.
내용의 순차적 전체 텍스트 검색 -모든 키를 하나씩 처리합니다. 처리 할 키가 너무 많으면 매우 느립니다.
버전이 지정된 버킷을 사용하여 2 년 동안 하루에 1440 버전의 파일을 분당 1 개씩 저장하면 쉽게 가능합니다. 그러나 순차적으로 버전을 이동해야하므로 이전 버전을 얻는 데 시간이 걸립니다. 때로는 레코드와 함께 간단한 CSV 인덱스를 사용하여 게시 시간과 버전 ID를 표시하여 이전 버전으로 빠르게 이동할 수 있습니다.
보시다시피, AWS S3는 자체 텍스트 검색 용으로 설계된 것이 아니라 단순한 스토리지 서비스입니다.
AWS 콘솔 버킷보기에서 직접
수천 또는 수백만 개의 파일이있는 경우 원하는 파일을 얻는 또 다른 방법은 분산 사본을 사용하여 다른 위치로 파일을 복사하는 것 입니다. 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"
}
]
Windows를 사용 중이고 좋은 grep
대안을 찾지 못한 경우 빠르고 더러운 방법은 다음과 같습니다.
aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt
그런 다음 myfile.txt에서 빠른 검색을 수행하십시오.
"폴더"비트는 선택 사항입니다.
AWS CLI를 설치하지 않은 경우 PS-Chocolatey 패키지 관리자를 사용하는 하나의 라이너
choco install awscli
PPS Chocolatey 패키지 관리자가없는 경우 구입하십시오! Windows에서의 삶은 10 배 향상됩니다. (나는 어떤 식 으로든 Chocolatey와 제휴하지는 않지만 실제로 필수 아이템입니다).
다른 옵션은 웹 서버에서 S3 버킷을 미러링하고 로컬로 순회하는 것입니다. 비결은 로컬 파일이 비어 있고 골격으로 만 사용된다는 것입니다. 또는 로컬 파일은 일반적으로 S3에서 가져와야하는 유용한 메타 데이터 (예 : 파일 크기, 유형, 작성자, 타임 스탬프, UUID)를 보유 할 수 있습니다. 파일을 다운로드 할 URL을 제공 할 경우 로컬로 검색하고 S3 주소에 대한 링크를 제공하십시오.
로컬 파일 탐색이 쉽고 S3 관리를위한이 접근 방식은 언어에 구애받지 않습니다. 로컬 파일 탐색은 파일 데이터베이스 유지 관리 및 쿼리를 피하거나 버킷 내용을 인증하고 가져 오기 위해 일련의 원격 API 호출을 지연시킵니다.
사용자는 FTP 또는 HTTP를 통해 서버에 직접 파일을 업로드 한 다음 크기에 관계없이 파일의 디렉토리를 반복하여 피크가 아닌 시간에 새 파일 및 업데이트 된 파일을 Amazon으로 전송할 수 있습니다. Amazon으로 파일 전송이 완료되면 웹 서버 파일을 동일한 이름의 빈 파일로 바꾸십시오. 로컬 파일에 파일 크기가 있으면 배치 전송 대기 중이므로 직접 제공하십시오.
이 명령을 시도하십시오 :
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'
현재 1TB 데이터의 경우 가격은 $ 5입니다. 예를 들어 쿼리에서 1TB 파일 하나를 3 번 검색하는 경우 비용은 15 달러입니다. 그러나 예를 들어 "변환 된 원주 형식"의 열이 1 개만있는 경우 1을 지불합니다. 가격의 3 분의 1은 $ 1.67 / TB를 의미합니다.
이 설명서를 살펴보십시오 : http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
PCRE (Perl-Compatible Regular Expression)를 사용하여 이름을 필터링 할 수 있습니다.
버킷에서 패턴을 찾기 위해 아래와 같은 작업을 수행했습니다.
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에 의해 반환되므로 시간이 너무 많이 소요됩니다. 성능을 향상시킬 수있는 방법을 찾고 있는데 지금까지 키의 이름을 지정하고 버킷에 올바르게 구성해야한다는 것을 알았습니다.
나는 같은 문제에 직면했다. S3에서의 검색은 현재 상황보다 훨씬 쉬워야합니다. 그래서 S3에서 검색하기 위해이 오픈 소스 도구를 구현했습니다.
SSEARCH 는 전체 오픈 소스 S3 검색 도구입니다. 성능이 중요한 요소라는 점을 항상 염두에두고 구현되었으며 벤치 마크에 따르면 수초 내에 ~ 1000 개의 파일이 포함 된 버킷을 검색합니다.
설치가 간단합니다. docker-compose 파일 만 다운로드하여 실행하십시오.
docker-compose up
SSEARCH가 시작되고 모든 버킷에서 무엇이든 검색 할 수 있습니다.
기술 답변은 아니지만 와일드 카드 검색을 허용하는 응용 프로그램을 만들었습니다. https://bucketsearch.net/
버킷을 비동기 적으로 인덱싱 한 다음 결과를 검색 할 수 있습니다.
무료로 사용할 수 있습니다 (donationware).
상태 2018-07 : Amazon에는 csv 및 json 파일 검색과 같은 기본 SQL이 있습니다!