Câu trả lời:
S3 không có "tìm kiếm nhóm" riêng này vì nội dung thực tế không xác định - ngoài ra, vì S3 là khóa / giá trị nên không có cách riêng để truy cập nhiều nút cùng một lúc các kho dữ liệu truyền thống cung cấp một (SELECT * FROM ... WHERE ...)
(trong SQL mô hình).
Những gì bạn sẽ cần làm là thực hiện ListBucket
để có được một danh sách các đối tượng trong nhóm và sau đó lặp đi lặp lại trên mỗi mục thực hiện một thao tác tùy chỉnh mà bạn thực hiện - đó là tìm kiếm của bạn.
Chỉ cần một lưu ý để thêm vào đây: bây giờ là 3 năm sau, nhưng bài đăng này đứng đầu Google khi bạn nhập "Cách tìm kiếm Nhóm S3."
Có lẽ bạn đang tìm kiếm một cái gì đó phức tạp hơn, nhưng nếu bạn hạ cánh ở đây cố gắng tìm ra cách đơn giản để tìm một đối tượng (tệp) theo tiêu đề của nó, thì thật đơn giản:
mở thùng, chọn "không" ở phía bên tay phải và bắt đầu nhập tên tệp.
http://docs.aws.amazon.com/AmazonS3/latest/UG/ListingObjectsinaBucket.html
Đây là một cách ngắn và xấu để thực hiện tên tệp tìm kiếm bằng AWS CLI :
aws s3 ls s3://your-bucket --recursive | grep your-search | cut -c 32-
cut -c 32-
chỉ cần cắt bỏ dấu thời gian và thông tin kích thước tệp từ đầu ra, mà trên hệ thống của tôi có tới 32 ký tự. Bạn không cần nó nhưng nếu bạn chuyển đầu ra sang một lệnh khác thì có thể có đầu ra "sạch".
include/exclude
. Vì vậy,aws s3 ls s3://bucket --recursive --exclude '*' --include 'myfile*'
Có (ít nhất) hai trường hợp sử dụng khác nhau có thể được mô tả là "tìm kiếm thùng":
Tìm kiếm thứ gì đó bên trong mọi vật thể được lưu trữ trong thùng; cái này giả định một định dạng chung cho tất cả các đối tượng trong nhóm đó (giả sử, tệp văn bản), v.v. Đối với một cái gì đó như thế này, bạn buộc phải làm những gì Cody Caughlan vừa trả lời. Các tài liệu AWS S3 có mã ví dụ cho biết cách thực hiện điều này với AWS SDK cho Java: Các khóa liệt kê sử dụng SDK AWS cho Java (ở đó bạn cũng sẽ tìm thấy các ví dụ về PHP và C #).
Mục danh sách Tìm kiếm thứ gì đó trong các khóa đối tượng có trong thùng đó; S3 không có một phần hỗ trợ cho điều này, theo hình thức cho phép tiền tố kết hợp chính xác + sụp đổ trận đấu sau một dấu phân cách. Điều này được giải thích chi tiết hơn tại Hướng dẫn dành cho nhà phát triển AWS S3 . Điều này cho phép, ví dụ, để thực hiện "thư mục" thông qua việc sử dụng như các khóa đối tượng giống như
thư mục / thư mục con / file.txtNếu bạn tuân theo quy ước này, hầu hết các GUI S3 (như Bảng điều khiển AWS) sẽ hiển thị cho bạn chế độ xem thư mục của nhóm của bạn.
AWS đã phát hành Dịch vụ mới để truy vấn các thùng S3 bằng SQL: Amazon Athena https://aws.amazon.com/athena/
Có nhiều tùy chọn, không có giải pháp toàn văn "một shot" đơn giản nào:
Tìm kiếm mẫu tên khóa : Tìm kiếm các khóa bắt đầu bằng một số chuỗi - nếu bạn thiết kế tên khóa cẩn thận, thì bạn có thể có giải pháp khá nhanh.
Tìm kiếm siêu dữ liệu được đính kèm theo khóa : khi đăng tệp lên AWS S3, bạn có thể xử lý nội dung, trích xuất một số thông tin meta và đính kèm thông tin meta này dưới dạng tiêu đề tùy chỉnh vào khóa. Điều này cho phép bạn tìm nạp tên chính và tiêu đề mà không cần tìm nạp nội dung đầy đủ. Việc tìm kiếm phải được thực hiện tuần tự, không có tùy chọn tìm kiếm "sql like" cho việc này. Với các tệp lớn, điều này có thể tiết kiệm rất nhiều lưu lượng mạng và thời gian.
Lưu trữ siêu dữ liệu trên SimpleDB : như điểm trước, nhưng với việc lưu trữ siêu dữ liệu trên SimpleDB. Ở đây bạn có sql như chọn câu lệnh. Trong trường hợp tập dữ liệu lớn, bạn có thể đạt các giới hạn SimpleDB, có thể khắc phục (siêu dữ liệu phân vùng trên nhiều miền SimpleDB), nhưng nếu bạn thực sự đi xa, bạn có thể cần phải sử dụng một loại cơ sở dữ liệu metedata khác.
Tìm kiếm toàn văn tuần tự của nội dung - xử lý tất cả các khóa từng cái một. Rất chậm, nếu bạn có quá nhiều chìa khóa để xử lý.
Chúng tôi đang lưu trữ 1440 phiên bản của một tệp (một lần mỗi phút) trong vài năm, bằng cách sử dụng xô phiên bản, có thể dễ dàng thực hiện được. Nhưng để có được một số phiên bản cũ hơn cần có thời gian, vì người ta phải tuần tự đi từng phiên bản. Thỉnh thoảng tôi sử dụng chỉ mục CSV đơn giản với các bản ghi, hiển thị thời gian xuất bản cộng với id phiên bản, có điều này, tôi có thể chuyển sang phiên bản cũ hơn khá nhanh.
Như bạn thấy, AWS S3 không được thiết kế riêng cho tìm kiếm toàn văn bản, đây là dịch vụ lưu trữ đơn giản.
trực tiếp trong chế độ xem Bảng điều khiển AWS.
Khi bạn có hàng ngàn hoặc hàng triệu tệp một cách khác để có được các tệp mong muốn là sao chép chúng sang một vị trí khác bằng cách sử dụng bản sao phân tán . Bạn chạy cái này trên EMR trong Công việc Hadoop. Điều thú vị về AWS là họ cung cấp phiên bản S3 tùy chỉnh s3-dist-cp . Nó cho phép bạn nhóm các tệp mong muốn bằng cách sử dụng biểu thức chính quy trong trường groupBy. Bạn có thể sử dụng ví dụ này trong một bước tùy chỉnh trên 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"
}
]
Nếu bạn đang ở trên Windows và không có thời gian để tìm một giải grep
pháp thay thế hay, một cách nhanh chóng và bẩn thỉu sẽ là:
aws s3 ls s3://your-bucket/folder/ --recursive > myfile.txt
và sau đó thực hiện tìm kiếm nhanh trong myfile.txt
Bit "thư mục" là tùy chọn.
PS nếu bạn chưa cài đặt AWS CLI - đây là một lớp lót sử dụng trình quản lý gói Chocolatey
choco install awscli
PPS Nếu bạn không có trình quản lý gói Chocolatey - hãy lấy nó! Cuộc sống của bạn trên Windows sẽ tốt hơn gấp 10 lần. (Tôi không liên kết với Chocolatey theo bất kỳ cách nào, nhưng này, đó thực sự là một thứ bắt buộc phải có).
Cho rằng bạn đang ở AWS ... Tôi nghĩ bạn sẽ muốn sử dụng các công cụ CloudSearch của họ. Đặt dữ liệu bạn muốn tìm kiếm vào dịch vụ của họ ... để nó trỏ đến các phím S3.
Một tùy chọn khác là phản chiếu nhóm S3 trên máy chủ web của bạn và duyệt qua cục bộ. Thủ thuật là các tệp cục bộ trống và chỉ được sử dụng như một bộ xương. Ngoài ra, các tệp cục bộ có thể chứa dữ liệu meta hữu ích mà bạn thường cần lấy từ S3 (ví dụ: kích thước tệp, mimetype, tác giả, dấu thời gian, uuid). Khi bạn cung cấp URL để tải xuống tệp, hãy tìm kiếm cục bộ và cung cấp liên kết đến địa chỉ S3.
Truy cập tệp cục bộ rất dễ dàng và cách tiếp cận này đối với quản lý S3 là bất khả tri về ngôn ngữ. Truyền qua tệp cục bộ cũng tránh việc duy trì và truy vấn cơ sở dữ liệu của các tệp hoặc trì hoãn thực hiện một loạt các lệnh gọi API từ xa để xác thực và nhận nội dung nhóm.
Bạn có thể cho phép người dùng tải tệp trực tiếp lên máy chủ của mình qua FTP hoặc HTTP và sau đó chuyển một loạt tệp mới và cập nhật sang Amazon vào thời gian cao điểm bằng cách chỉ cần đệ quy qua các thư mục cho các tệp có kích thước bất kỳ. Khi hoàn tất chuyển tệp sang Amazon, hãy thay thế tệp máy chủ web bằng một tệp trống cùng tên. Nếu một tệp cục bộ có bất kỳ kích thước tệp nào thì hãy phân phát trực tiếp vì nó đang chờ chuyển hàng loạt.
Cách tôi đã làm là: Tôi có hàng ngàn tệp trong s3. Tôi thấy bảng thuộc tính của một tập tin trong danh sách. Bạn có thể thấy URI của tệp đó và tôi sao chép nó vào trình duyệt - đó là một tệp văn bản và nó được hiển thị độc đáo. Bây giờ tôi đã thay thế uuid trong url bằng uuid mà tôi có trong tay và bùng nổ ở đó.
Tôi ước AWS có cách tốt hơn để tìm kiếm tệp, nhưng điều này hiệu quả với tôi.
Hãy thử lệnh này:
aws s3api list-objects --bucket your-bucket --prefix sub-dir-path --output text --query 'Contents[].{Key: Key}'
Sau đó, bạn có thể chuyển cái này thành một grep để có được các loại tệp cụ thể để làm bất cứ điều gì bạn muốn với chúng.
--output text
chỉ định rằng đầu ra sẽ là văn bản thuần túy, không phải JSON, v.v. và --query 'Contents[].{Key: Key, Size: Size}'
chỉ lọc đầu ra của danh sách thành tên tệp và kích thước tệp. Nó không tìm kiếm Key: Key
hoặc tương tự.
Đây là một chủ đề hơi cũ - nhưng có thể giúp một người vẫn đang tìm kiếm - Tôi là người tìm kiếm trong một năm.
Giải pháp có thể là " AWS Athena " nơi bạn có thể tìm kiếm dữ liệu như thế này
'SELECT user_name FROM S3Object WHERE cast(age as int) > 20'
Giá hiện tại là 5 đô la cho dữ liệu 1TB - ví dụ: nếu truy vấn của bạn tìm kiếm trên một tệp 1TB 3 lần thì chi phí của bạn là 15 đô la - nhưng ví dụ: nếu chỉ có 1 màu ở "định dạng cột được chuyển đổi" những gì bạn muốn đọc, bạn sẽ trả 1 / 3 giá có nghĩa là $ 1,67 / TB.
Hãy xem tài liệu này: http://docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=amazons3/get_object_list
Bạn có thể sử dụng Biểu thức chính quy tương thích Perl (PCRE) để lọc tên.
Tôi đã làm một cái gì đó như dưới đây để tìm các mẫu trong xô của tôi
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
}
Đối với các thùng lớn hơn, việc này tiêu tốn quá nhiều thời gian vì tất cả các tóm tắt đối tượng được trả về bởi Aws và không chỉ các nhóm khớp với tiền tố và dấu phân cách. Tôi đang tìm cách để cải thiện hiệu suất và cho đến nay tôi chỉ thấy rằng tôi nên đặt tên cho các phím và sắp xếp chúng theo đúng cách.
Tôi phải đối mặt với cùng một vấn đề. Tìm kiếm trong S3 sẽ dễ dàng hơn nhiều so với tình hình hiện tại. Đó là lý do tại sao, tôi đã triển khai công cụ nguồn mở này để tìm kiếm trong S3.
NGÀY NĂM là công cụ tìm kiếm S3 mã nguồn mở đầy đủ. Nó đã được thực hiện luôn luôn lưu ý rằng hiệu suất là yếu tố quan trọng và theo điểm chuẩn, nó tìm kiếm nhóm chứa ~ 1000 tệp trong vài giây.
Cài đặt đơn giản. Bạn chỉ tải xuống tệp soạn thảo docker và chạy nó với
docker-compose up
SSEARCH sẽ được bắt đầu và bạn có thể tìm kiếm mọi thứ trong bất kỳ thùng nào bạn có.
Chuyển nhanh đến năm 2020 và sử dụng aws-okta làm lệnh 2fa của chúng tôi, lệnh sau, trong khi chậm như địa ngục để lặp qua tất cả các đối tượng và thư mục trong nhóm cụ thể này (+270.000) hoạt động tốt.
aws-okta exec dev -- aws s3 ls my-cool-bucket --recursive | grep needle-in-haystax.txt
Không phải là một câu trả lời kỹ thuật, nhưng tôi đã xây dựng một ứng dụng cho phép tìm kiếm ký tự đại diện: https://bucketsearch.net/
Nó sẽ lập chỉ mục không đồng bộ xô của bạn và sau đó cho phép bạn tìm kiếm kết quả.
Nó miễn phí để sử dụng (phần mềm đóng góp).
Trạng thái 2018-07: Amazon không có sql gốc như tìm kiếm các tệp csv và json!