Làm cách nào để biết số lượng đối tượng tôi đã lưu trữ trong nhóm S3?


154

Trừ khi tôi thiếu một cái gì đó, có vẻ như không có API nào tôi đã xem sẽ cho bạn biết có bao nhiêu đối tượng trong một thùng S3 / thư mục (tiền tố). Có cách nào để có được một đếm?


Câu hỏi này có thể hữu ích: stackoverflow.com/questions/701545/ từ
Brendan Long

1
Giải pháp hiện tồn tại vào năm 2015: stackoverflow.com/a/32908591/578989
Mayank Jaiswal

Xem câu trả lời của tôi dưới đây: stackoverflow.com/a/39111698/996926
advncd

Câu trả lời:


39

Không có cách nào, trừ khi bạn

  1. liệt kê tất cả chúng theo lô 1000 (có thể chậm và hút băng thông - amazon dường như không bao giờ nén các phản hồi XML), hoặc

  2. đăng nhập vào tài khoản của bạn trên S3 và vào Tài khoản - Cách sử dụng. Có vẻ như phòng thanh toán biết chính xác có bao nhiêu đối tượng bạn đã lưu trữ!

Chỉ cần tải xuống danh sách tất cả các đối tượng của bạn sẽ thực sự mất một thời gian và tốn một số tiền nếu bạn có 50 triệu đối tượng được lưu trữ.

Cũng xem chủ đề này về StorageObjectCount - trong dữ liệu sử dụng.

API S3 để có được ít nhất những điều cơ bản, ngay cả khi nó đã cũ hàng giờ, sẽ rất tuyệt.


Bằng cách đó, liên kết đã chết.
các trường


Nếu bạn lười biếng như tôi, về cơ bản , Newvem sẽ thực hiện việc này thay mặt bạn và tổng hợp / theo dõi kết quả ở cấp độ mỗi nhóm trên tài khoản S3 của bạn.
RCoup

2
Bạn có thể cập nhật phản hồi của mình để bao gồm phản hồi của @ MayankJaiswal không?
Joseph Casey

1
phòng thanh toán biết tất cả! không có gì ngạc nhiên khi họ có sức mạnh hạ gục s3 bờ biển phía đông một cách tình cờ
Ski_squaw

256

Sử dụng AWS CLI

aws s3 ls s3://mybucket/ --recursive | wc -l 

hoặc là

aws cloudwatch get-metric-statistics \
  --namespace AWS/S3 --metric-name NumberOfObjects \
  --dimensions Name=BucketName,Value=BUCKETNAME \
              Name=StorageType,Value=AllStorageTypes \
  --start-time 2016-11-05T00:00 --end-time 2016-11-05T00:10 \
  --period 60 --statistic Average

Lưu ý: Lệnh cloudwatch ở trên dường như hoạt động trong một số thời gian không dành cho những người khác. Thảo luận tại đây: https://forums.aws.amazon.com/thread.jspa?threadID=217050

Sử dụng Bảng điều khiển web AWS

Bạn có thể xem phần số liệu của cloudwatch để có được số lượng đối tượng được lưu trữ. nhập mô tả hình ảnh ở đây

Tôi có khoảng 50 triệu sản phẩm và phải mất hơn một giờ để sử dụng aws s3 ls


18
Điều này nên được gần với đầu.
Joseph Casey

3
@JosephMCasey Tôi đồng ý. Điều này cũng hoạt động để cung cấp số lượng đối tượng trong một thư mục với một nhóm như thế này:aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
timersonerson

1
Đưa ra lỗi này khi tôi chạy lệnh trên trong dấu nhắc cmd - 'wc' không được nhận dạng dưới dạng lệnh bên trong hoặc bên ngoài, chương trình có thể hoạt động hoặc tệp bó. - Tôi khá mới với điều này vì vậy ai đó có thể đưa ra một giải pháp?
Sandun

Một cảnh báo rằng CloudWatch có vẻ không đáng tin cậy lắm. Tôi có một tệp mp4 trong một nhóm mà CloudWatch (số liệu NumberOfObjects) tính là 2.300 đối tượng riêng biệt. Tôi đã nhận được số chính xác với AWS CLI.
AlexK

Tại sao "Trung bình"? Thay vào đó, ai đó sẽ không muốn "Sum"?
ffxsam

150

Có một --summarizecông tắc bao gồm thông tin tóm tắt xô (tức là số lượng đối tượng, tổng kích thước).

Đây là câu trả lời đúng bằng AWS cli:

aws s3 ls s3://bucketName/path/ --recursive --summarize | grep "Total Objects:"

Total Objects: 194273

Xem tài liệu


4
Điều này thật tuyệt: Total Objects: 7235 Total Size: 475566411749- thật dễ dàng.
bonh

16
Vẫn còn chi phí lớn cho việc liệt kê hàng ngàn đối tượng, thật không may (hiện ở mức 600.000 cộng, vì vậy việc này khá tốn thời gian)
MichaelChirico

Mất bao nhiêu để chạy tác vụ này trên xô với các đối tượng 5M?
Tâm thần

2
Câu trả lời này cực kỳ không hiệu quả, có khả năng rất chậm và tốn kém. Nó lặp đi lặp lại trên toàn bộ xô để tìm câu trả lời.
thợ dệt

2
Và tôi có thể thêm, rằng lặp đi lặp lại hơn 1,2 tỷ đối tượng được lưu trữ trong bộ lưu trữ tiêu chuẩn, nó có thể có giá khoảng 6000 đô la.
C Johnson

66

Mặc dù đây là một câu hỏi cũ và phản hồi đã được cung cấp vào năm 2015, nhưng bây giờ nó đơn giản hơn nhiều, vì Bảng điều khiển Web S3 đã kích hoạt tùy chọn "Lấy kích thước":

nhập mô tả hình ảnh ở đây

Cung cấp như sau:

nhập mô tả hình ảnh ở đây


1
Có, Bảng điều khiển AWS mới, mặc dù nó làm tổn thương mắt tôi, nhưng làm cho việc tính toán số lượng Đối tượng và tổng kích thước có sẵn khi nhấp vào nút.
Ani

11
Điều này dường như chỉ hoạt động ở cấp độ thư mục. "Nhận kích thước" không khả dụng ở cấp độ nhóm
G-.

1
@ G-. Điều gì nếu bạn chọn tất cả các thư mục của xô?
gvasquez

4
@ G-. Tuy nhiên, hộp "chọn tất cả" chỉ chọn các thư mục và đối tượng được hiển thị trong trang, không phải tất cả các thư mục / đối tượng của nhóm.
gparis

2
@gparis điểm tốt. Cũng đáng chú ý. Cảm ơn. Vì vậy, có vẻ như trong bảng điều khiển, chúng tôi không có tùy chọn nếu có nhiều tệp hoặc thư mục hơn có thể được hiển thị trên một trang
G-.

50

Nếu bạn sử dụng công cụ dòng lệnh s3cmd , bạn có thể nhận được một danh sách đệ quy của một nhóm cụ thể, xuất nó thành một tệp văn bản.

s3cmd ls -r s3://logs.mybucket/subfolder/ > listing.txt

Sau đó, trong linux bạn có thể chạy wc -l trên tệp để đếm các dòng (1 dòng trên mỗi đối tượng).

wc -l listing.txt

Lệnh -rtrong là dành cho --recursive, vì vậy nó cũng hoạt động cho các thư mục con.
Deepak Joy

3 lưu ý về điều này. a.) bạn nên sử dụng aws s3 lsthay vì s3cmd vì nó nhanh hơn. b.) Đối với các thùng lớn có thể mất nhiều thời gian. Mất khoảng 5 phút cho các tập tin 1mil. c.) Xem câu trả lời của tôi dưới đây về việc sử dụng cloudwatch.
mastaBlasta

46

Hiện tại có một giải pháp dễ dàng với API S3 (có sẵn trong AWS cli):

aws s3api list-objects --bucket BUCKETNAME --output json --query "[length(Contents[])]"

hoặc cho một thư mục cụ thể:

aws s3api list-objects --bucket BUCKETNAME --prefix "folder/subfolder/" --output json --query "[length(Contents[])]"

1
Raphael, truy vấn thư mục của bạn hoạt động rất tốt, ngoại trừ khi thư mục trống hoặc không tồn tại, thì bạn nhận được: Trong chiều dài hàm (), loại không hợp lệ cho giá trị: Không có, một trong những: ['chuỗi', 'mảng' , 'object'], đã nhận: "null" Có cách nào để làm cho nó xuất 0 nếu thư mục trống hoặc không thoát?
dùng3591836

1
Tôi nhận được Illegal token value '(Contents[])]' (phiên bản 1.2.9 của aws-cli), khi chỉ sử dụng --bucket my-bucketA client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not existkhi sử dụng --bucket s3://my-bucket. (Nó chắc chắn tồn tại và có hơn 1000 tệp.)
Darren Cook

@DarrenCook xóa s3: // khỏi tên nhóm. Máy khách dường như không hỗ trợ giao thức.
Sriranjan Manjunath

Điều này nhanh hơn nhiều so với các ví dụ wc -l. Với xô của tôi, nó sẽ đếm khoảng 3-4k đối tượng / giây. Vì vậy, ~ 5 phút trên một triệu đối tượng. "Nhận kích thước" trong GUI web S3 có thể sử dụng một cái gì đó tương tự dưới mui xe vì nó mất khoảng thời gian tương tự.
báo

Đối với các thùng lớn RẤT , đây là giải pháp duy nhất hiệu quả với tôi trong khoảng thời gian hợp lý từ (dưới 20 phút)
Nick Sarafa

40

Bạn có thể sử dụng số liệu AWS cloudwatch cho s3 để xem số lượng chính xác cho mỗi nhóm. số liệu đám mây khi bạn chọn xô


Tôi nghĩ rằng đây là câu trả lời tốt nhất
Oktav

Câu trả lời thực sự duy nhất, không làm điều gì đó vô lý như liệt kê các phím 1m +. Tôi quên nó ở đó.
Andrew Backer

Điều này cần nhiều upvote. Mọi giải pháp khác đều có quy mô kém về chi phí và thời gian.
Aaron R.

5

Chuyển đến Thanh toán AWS, sau đó báo cáo, sau đó báo cáo Sử dụng AWS. Chọn Dịch vụ lưu trữ đơn giản của Amazon, sau đó chọn StandardStorage. Sau đó, bạn có thể tải xuống tệp CSV bao gồm Loại sử dụng của StorageObjectCount liệt kê số lượng vật phẩm cho mỗi nhóm.


4

Bạn có thể dễ dàng lấy được tổng số và lịch sử nếu bạn đi đến tab "Quản lý" của bảng điều khiển s3 và sau đó nhấp vào "Số liệu" ... Ảnh chụp màn hình của tab


bạn có thể cập nhật hình ảnh để hiển thị NumberOfObjects (count/day)biểu đồ? Nó sẽ tốt hơn vì nó liên quan trực tiếp đến câu hỏi. Trong ảnh chụp màn hình của bạn, bạn đang hiển thị cái BucketSizeBytes (bytes/day)nào, trong khi hữu ích, không liên quan trực tiếp đến vấn đề.
guzmonne

1
Kể từ năm 2019, đây sẽ là câu trả lời được chấp nhận. Tất cả phần còn lại đã lỗi thời hoặc chậm.
C Johnson

2

Api sẽ trả về danh sách theo gia số 1000. Kiểm tra thuộc tính IsTruncated để xem còn còn nữa không. Nếu có, bạn cần thực hiện một cuộc gọi khác và chuyển khóa cuối cùng mà bạn nhận được dưới dạng thuộc tính Marker trong cuộc gọi tiếp theo. Sau đó, bạn sẽ tiếp tục lặp như thế này cho đến khi IsTruncated là sai.

Xem tài liệu Amazon này để biết thêm thông tin: Lặp lại thông qua kết quả nhiều trang


2

Chủ đề cũ, nhưng vẫn có liên quan khi tôi đang tìm kiếm câu trả lời cho đến khi tôi chỉ cần tìm ra điều này. Tôi muốn đếm số tập tin bằng công cụ dựa trên GUI (tức là không có mã). Tôi tình cờ đã sử dụng một công cụ có tên 3Hub để kéo và thả chuyển đến và từ S3. Tôi muốn biết có bao nhiêu tệp tôi có trong một nhóm cụ thể (tôi không nghĩ việc thanh toán phá vỡ nó bằng xô).

So, using 3Hub, 
- list the contents of the bucket (looks basically like a finder or explorer window)
- go to the bottom of the list, click 'show all'
- select all (ctrl+a)
- choose copy URLs from right-click menu
- paste the list into a text file (I use TextWrangler for Mac) 
- look at the line count  

Tôi đã có 20521 tệp trong thùng và đếm số tệp trong chưa đầy một phút.


2

Tôi đã sử dụng tập lệnh python từ scalablelogic.com (thêm vào ghi nhật ký đếm). Làm việc tuyệt vời.

#!/usr/local/bin/python

import sys

from boto.s3.connection import S3Connection

s3bucket = S3Connection().get_bucket(sys.argv[1])
size = 0
totalCount = 0

for key in s3bucket.list():
    totalCount += 1
    size += key.size

print 'total size:'
print "%.3f GB" % (size*1.0/1024/1024/1024)
print 'total count:'
print totalCount

Để bạn biết, điều này không hoạt động với boto3. Tôi đã đóng góp một đề nghị dưới đây như một câu trả lời khác nhau.
nhóm mờ

2

Trong s3cmd, chỉ cần chạy lệnh sau (trên hệ thống Ubuntu):

s3cmd ls -r s3://mybucket | wc -l

13
Tại sao bạn lại hồi sinh một câu hỏi 5 tuổi để đăng một bản sao có định dạng kém của một câu trả lời hiện có ?
Nhà giả kim hai bit

Câu trả lời trước đã dẫn đầu ra thành một tệp txt không cần thiết.
mjsa

10
IMO đây nên là một nhận xét về câu trả lời đó, sau đó. Đây là một sự khác biệt thực sự tầm thường.
Nhà giả kim hai bit

2
Có vẻ như một câu trả lời xứng đáng - đặc biệt là vì câu trả lời được chọn cho câu hỏi này bắt đầu bằng 'Không có cách nào ...' và @mjsa đã cung cấp câu trả lời một dòng.
Nan

Đây không phải là một câu trả lời hay vì nó không tính đến các đối tượng được phiên bản.
3h4x

2

Nếu bạn đang sử dụng AWS CLI trên Windows, bạn có thể sử dụng Measure-Objecttừ PowerShell để lấy tổng số tệp, giống như wc -ltrên * nix.

PS C:\> aws s3 ls s3://mybucket/ --recursive | Measure-Object

Count    : 25
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

Hy vọng nó giúp.


2

Một trong những cách đơn giản nhất để đếm số lượng đối tượng trong s3 là:

Bước 1: Chọn thư mục gốc Bước 2: Nhấp vào Hành động -> Xóa (Rõ ràng, cẩn thận không xóa nó) Bước 3: Đợi vài phút, aws sẽ hiển thị cho bạn số lượng đối tượng và tổng kích thước của nó.

UpVote nếu bạn tìm thấy giải pháp.


1

Không có API nào mang lại cho bạn số lượng vì thực sự không có API cụ thể nào của Amazon để làm điều đó. Bạn chỉ cần chạy một danh sách - nội dung và đếm số lượng kết quả được trả về.


Vì một số lý do, libs ruby ​​(right_aws / appoxy_aws) sẽ không liệt kê nhiều hơn 1000 đối tượng đầu tiên trong một nhóm. Có những người khác sẽ liệt kê tất cả các đối tượng?
các trường

Khi bạn yêu cầu danh sách, họ cung cấp trường "NextToken", bạn có thể sử dụng để gửi lại yêu cầu bằng mã thông báo và nó sẽ liệt kê thêm.
Mitch Dempsey

1

Từ dòng lệnh trong AWS CLI, sử dụng ls plus --summarize. Nó sẽ cung cấp cho bạn danh sách tất cả các mục của bạn và tổng số tài liệu trong một nhóm cụ thể. Tôi chưa thử điều này với các thùng chứa các thùng phụ:

aws s3 ls "s3://MyBucket" --summarize

Nó mất một chút thời gian (mất khoảng 4 phút để liệt kê các tài liệu 16 + K của tôi), nhưng nó nhanh hơn so với việc đếm 1K mỗi lần.



0

3Hub bị ngưng. Có một giải pháp tốt hơn, bạn có thể sử dụng Transmit (chỉ dành cho máy Mac), sau đó bạn chỉ cần kết nối với nhóm của mình và chọn Show Item Counttừ Viewmenu.


Không may truyền chỉ hiển thị tối đa 1000 mặt hàng (và do đó, Số lượng vật phẩm cũng được tối đa hóa trên 1000)
Tino

0

Bạn có thể tải xuống và cài đặt trình duyệt s3 từ http://s3browser.com/ . Khi bạn chọn một nhóm ở góc bên phải, bạn có thể thấy số lượng tệp trong nhóm. Nhưng, kích thước nó hiển thị không chính xác trong phiên bản hiện tại.

Gub


0

Cách dễ nhất là sử dụng bảng điều khiển dành cho nhà phát triển, ví dụ: nếu bạn đang sử dụng chrome, hãy chọn Công cụ dành cho nhà phát triển và bạn có thể thấy sau đây, bạn có thể tìm và đếm hoặc thực hiện một số kết quả khớp, như 280-279 + 1 = 2

...


Bạn có thể vui lòng thêm một số chi tiết về cách bạn đã sử dụng các công cụ dành cho nhà phát triển để tìm ra tổng số đối tượng trong một nhóm không.
Janch Panchal

0

Bạn có khả năng có thể sử dụng khoảng không quảng cáo Amazon S3 sẽ cung cấp cho bạn danh sách các đối tượng trong tệp csv


0

Tôi thấy công cụ trình duyệt S3 rất người dùng, nó cung cấp các tệp và thư mục và tổng số lượng cũng như kích thước cho bất kỳ thư mục nào theo cách đệ quy

Liên kết tải xuống: https://s3browser.com/doad.aspx


0

Cũng có thể được thực hiện với gsutil du(Có, công cụ Google Cloud)

gsutil du s3://mybucket/ | wc -l

0

Bạn chỉ có thể thực hiện lệnh cli này để lấy tổng số tệp trong nhóm hoặc một thư mục cụ thể

Quét toàn bộ xô

aws s3api list-objects-v2 --bucket testbucket | grep "Key" | wc -l
aws s3api list-objects-v2 --bucket BUCKET_NAME | grep "Key" | wc -l

bạn có thể sử dụng lệnh này để biết chi tiết

aws s3api list-objects-v2 --bucket BUCKET_NAME

Quét một thư mục cụ thể

aws s3api list-objects-v2 --bucket testbucket --prefix testfolder --start-after testfolder/ | grep "Key" | wc -l

aws s3api list-objects-v2 --bucket BUCKET_NAME --prefix FOLDER_NAME --start-after FOLDER_NAME/ | grep "Key" | wc -l

0

Nếu bạn đang tìm kiếm các tệp cụ thể, hãy nói .jpghình ảnh, bạn có thể làm như sau:

aws s3 ls s3://your_bucket | grep jpg | wc -l

0

Sau đây là cách bạn có thể làm điều đó bằng cách sử dụng java client.

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.11.519</version>
</dependency>
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ObjectListing;

public class AmazonS3Service {

    private static final String S3_ACCESS_KEY_ID = "ACCESS_KEY";
    private static final String S3_SECRET_KEY = "SECRET_KEY";
    private static final String S3_ENDPOINT = "S3_URL";

    private AmazonS3 amazonS3;

    public AmazonS3Service() {
        ClientConfiguration clientConfiguration = new ClientConfiguration();
        clientConfiguration.setProtocol(Protocol.HTTPS);
        clientConfiguration.setSignerOverride("S3SignerType");
        BasicAWSCredentials credentials = new BasicAWSCredentials(S3_ACCESS_KEY_ID, S3_SECRET_KEY);
        AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);
        AmazonS3ClientBuilder.EndpointConfiguration endpointConfiguration = new AmazonS3ClientBuilder.EndpointConfiguration(S3_ENDPOINT, null);
        amazonS3 = AmazonS3ClientBuilder.standard().withCredentials(credentialsProvider).withClientConfiguration(clientConfiguration)
                .withPathStyleAccessEnabled(true).withEndpointConfiguration(endpointConfiguration).build();
    }

    public int countObjects(String bucketName) {
        int count = 0;
        ObjectListing objectListing = amazonS3.listObjects(bucketName);
        int currentBatchCount = objectListing.getObjectSummaries().size();
        while (currentBatchCount != 0) {
            count += currentBatchCount;
            objectListing = amazonS3.listNextBatchOfObjects(objectListing);
            currentBatchCount = objectListing.getObjectSummaries().size();
        }
        return count;
    }
}

0

Đây là phiên bản boto3 của tập lệnh python được nhúng ở trên.

import sys
import boto3

s3 = boto3.resource('s3')
s3bucket = s3.Bucket(sys.argv[1])
size = 0
totalCount = 0

for key in s3bucket.objects.all():
    totalCount += 1
    size += key.size

print('total size:')
print("%.3f GB" % (size*1.0/1024/1024/1024))
print('total count:')
print(totalCount)`

0

aws s3 ls s3: // xô-name / thư mục-tiền tố-if-any --recursive | wc -l


Nó hoạt động được hơn 1000, nó tính 4258 cho tôi
KingAndrew

Các dòng không tương ứng trực tiếp với số lượng tập tin. Bởi vì họ cũng có toàn bộ một dòng chỉ dành cho ngày và thư mục.
CMCDragonkai

Lệnh này hoạt động với số lượng tệp giới hạn. Trong trường hợp của tôi, số lượng tập tin là hơn một triệu và nó không bao giờ cho kết quả. Nhưng nó là một lựa chọn tốt cho các tập tin hạn chế.
Janch Panchal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.