Làm cách nào tôi có thể nhận được kích thước của thùng Amazon S3?


289

Tôi muốn vẽ biểu đồ kích thước (tính bằng byte và # vật phẩm) của nhóm Amazon S3 và đang tìm kiếm một cách hiệu quả để lấy dữ liệu.

Các công cụ s3cmd cung cấp một cách để có được tổng kích thước tệp bằng cách sử dụng s3cmd du s3://bucket_name, nhưng tôi lo lắng về khả năng mở rộng của nó vì có vẻ như nó lấy dữ liệu về mỗi tệp và tính tổng của chính nó. Vì Amazon tính phí người dùng theo GB-Tháng, có vẻ kỳ lạ là họ không tiếp xúc trực tiếp với giá trị này.

Mặc dù API REST của Amazon trả về số lượng vật phẩm trong một thùng, s3cmd dường như không để lộ nó. Tôi có thể làm s3cmd ls -r s3://bucket_name | wc -lnhưng đó có vẻ như là một hack.

Thư viện Ruby AWS :: S3 có vẻ đầy hứa hẹn, nhưng chỉ cung cấp # của các mục trong nhóm chứ không phải tổng kích thước của nhóm.

Có ai biết bất kỳ công cụ hoặc thư viện dòng lệnh nào khác (thích Perl, PHP, Python hoặc Ruby) cung cấp các cách để có được dữ liệu này không?


Tôi đã viết một công cụ để phân tích kích thước thùng: github.com/EverythingMe/ncdu-s3
omribahumi

19
Tôi ngạc nhiên rằng Amazon tính phí cho không gian, nhưng không cung cấp tổng kích thước được lấy bởi một thùng S3 chỉ đơn giản thông qua bảng điều khiển S3.
Lu-ca

Đối với tôi, hầu hết các câu trả lời dưới đây mất khá nhiều thời gian để lấy kích thước thùng, tuy nhiên tập lệnh python này nhanh hơn hầu hết các câu trả lời - slsmk.com/getting-the-size-of-an-s3-bucket-USE -boto3-for-
aws

Câu trả lời:


168

AWS CLI hiện hỗ trợ --querytham số có biểu thức JMESPath .

Điều này có nghĩa là bạn có thể tổng hợp các giá trị kích thước được cung cấp bằng list-objectscách sử dụng sum(Contents[].Size)và đếm như thế nào length(Contents[]).

Điều này có thể được chạy bằng AWS CLI chính thức như dưới đây và được giới thiệu vào tháng 2 năm 2014

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

21
Đối với các thùng lớn (#files lớn), tốc độ này rất chậm. Tiện ích Python s4cmd "du" nhanh như chớp:s4cmd du s3://bucket-name
Brent Faust

Điều đó thật lạ. Hồ sơ tổng thể của xô của bạn (nông và béo / sâu và mỏng) là gì? Có vẻ như s3cmdnên có các chi phí tương tự như AWS CLI. Trong mã nó hiển thị s3cmd thực hiện một yêu cầu cho mỗi thư mục trong một thùng.
Christopher Hackett

22
để có được nó ở định dạng dễ đọc của con người: aws s3api --profile PROFILE_NAME list-objects --bucket BUCKET_NAME --output json --query "[sum(Contents[].Size), length(Contents[])]" | awk 'NR!=2 {print $0;next} NR==2 {print $0/1024/1024/1024" GB"}'
Sandeep

21
Giờ đây, AWS Cloudwatch cung cấp số liệu cho mỗi nhóm "BuckSizeBytes", đây không còn là giải pháp phù hợp. Xem câu trả lời của Toukakoukan dưới đây.
cce

2
s4cmd duthật tuyệt vời, cảm ơn bạn @Brent Faust! lưu ý nhỏ (đối với những người liên quan) mà bạn cần thêm -rđể có được kích thước của các thư mục con là tốt.
Greg Sadetsky

330

Điều này bây giờ có thể được thực hiện một cách tầm thường chỉ với ứng dụng khách dòng lệnh AWS chính thức:

aws s3 ls --summarize --human-readable --recursive s3://bucket-name/

Tài liệu chính thức

Điều này cũng chấp nhận tiền tố đường dẫn nếu bạn không muốn đếm toàn bộ nhóm:

aws s3 ls --summarize --human-readable --recursive s3://bucket-name/directory

23
Đây là câu trả lời hay nhất và cập nhật nhất
Tim

2
Đồng ý, đây là câu trả lời tốt nhất.
Luis Artola

24
Điều này rất chậm đối với các nhóm có nhiều tệp vì về cơ bản nó liệt kê tất cả các đối tượng trong nhóm trước khi hiển thị tóm tắt và trong đó không nhanh hơn đáng kể so với câu trả lời của @Christopher Hackett - ngoại trừ điều này ồn ào hơn nhiều.
Guss

Chạy trên một phiên bản EC2 với cùng một vùng của nhóm để cải thiện độ trễ
juanmirocks

1
Điều này sẽ hiển thị kích thước của TẤT CẢ các tệp riêng lẻ trong cây thư mục. Nếu tôi chỉ muốn tổng kích thước cho thư mục thì sao?
Chris F

130

Bảng điều khiển AWS:

Kể từ ngày 28 tháng 7 năm 2015, bạn có thể nhận thông tin này qua CloudWatch . Nếu bạn muốn có GUI, hãy truy cập bảng điều khiển CloudWatch : (Chọn Vùng>) Số liệu> S3

Lệnh AWS CLI:

Việc này nhanh hơn nhiều so với một số lệnh khác được đăng ở đây, vì nó không truy vấn kích thước của từng tệp riêng lẻ để tính tổng.

 aws cloudwatch get-metric-statistics --namespace AWS/S3 --start-time 2015-07-15T10:00:00 --end-time 2015-07-31T01:00:00 --period 86400 --statistics Average --region eu-west-1 --metric-name BucketSizeBytes --dimensions Name=BucketName,Value=toukakoukan.com Name=StorageType,Value=StandardStorage

Quan trọng : Bạn phải chỉ định cả StorageType và BuckName trong đối số kích thước nếu không bạn sẽ không nhận được kết quả. Tất cả bạn cần thay đổi là --start-date, --end-time, và Value=toukakoukan.com.


Đây là một tập lệnh bash bạn có thể sử dụng để tránh phải chỉ định --start-date--end-timethủ công.

#!/bin/bash
bucket=$1
region=$2
now=$(date +%s)
aws cloudwatch get-metric-statistics --namespace AWS/S3 --start-time "$(echo "$now - 86400" | bc)" --end-time "$now" --period 86400 --statistics Average --region $region --metric-name BucketSizeBytes --dimensions Name=BucketName,Value="$bucket" Name=StorageType,Value=StandardStorage

25
Hoặc trong bảng điều khiển CloudWatch : (Chọn Vùng>) Số liệu> S3
Halil Özgür

3
Đây là giải pháp dễ nhất và nhanh nhất. Thật không may, câu trả lời vẫn chỉ ở vị trí thứ tư.
luk2302

Điều này làm việc cho xô của tôi với 10 triệu + đối tượng. Nhưng tập lệnh bash không trả về bất cứ thứ gì, phải vào GUI).
Petah

1
Cũng cần lưu ý rằng bạn cũng sẽ phải thay đổi khu vực
Majikman

tháng năm 2018: lỗi tập lệnh vớiInvalid value ('1525354418') for param timestamp:StartTime of type timestamp
anneb

106

s3cmd có thể làm điều này:

s3cmd du s3://bucket-name


Cảm ơn. Đây là một số thời gian. Trên một thùng chứa hệ thống tệp bị trùng lặp s3ql với khoảng một triệu tệp sử dụng khoảng 33 GB dữ liệu không được cung cấp và khoảng 93000 đối tượng s3, s3cmd du mất khoảng 4 phút để tính toán câu trả lời. Tôi tò mò muốn biết làm thế nào so sánh với các cách tiếp cận khác như php được mô tả ở nơi khác ở đây.
nealmcb

1
Nó chậm vì lệnh gọi API ListObjects S3 trả về các đối tượng trong các trang của 1000 đối tượng. Vì I / O là yếu tố giới hạn, tôi nghĩ rằng bất kỳ giải pháp nào cũng sẽ tương đối chậm trên 93000 đối tượng.
David Snabel-Caunt

11
s4cmd cũng có thể làm điều tương tự, với lợi ích bổ sung của đa luồng các yêu cầu tới API của S3 để tính kết quả nhanh hơn. Công cụ này chưa được cập nhật gần đây, nhưng người qua Internet có thể thấy nó hữu ích.
Nick Chammas

s4cmd chỉ trả về 0 cho tôi và trả về BotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format.các thùng có ký tự in hoa.
Lakitu

22

Nếu bạn tải xuống một báo cáo sử dụng , bạn có thể vẽ biểu đồ các giá trị hàng ngày cho TimedStorage-ByteHrstrường.

Nếu bạn muốn số đó trong GiB, chỉ cần chia cho 1024 * 1024 * 1024 * 24(đó là GiB-giờ cho chu kỳ 24 giờ). Nếu bạn muốn số theo byte, chỉ cần chia cho 24 và biểu đồ đi.


19

Sử dụng các công cụ dòng lệnh AWS s3 chính thức:

aws s3 ls s3://bucket/folder --recursive | awk 'BEGIN {total=0}{total+=$3}END{print total/1024/1024" MB"}'

Đây là một lệnh tốt hơn, chỉ cần thêm 3 tham số --summarize --human-readable --recursivesau aws s3 ls. --summarizelà không bắt buộc mặc dù cung cấp một liên lạc tốt đẹp trên tổng kích thước.

aws s3 ls s3://bucket/folder --summarize --human-readable --recursive

1
Cung cấp liên kết đến nơi amazon thực sự nêu rõ điều này. Tôi không thể tìm thấy nó.
lobi



4
Câu trả lời này đã làm việc tốt nhất và nhanh nhất cho tôi.
Miro

2
câu trả lời tốt nhất và nhanh nhất!
PlagTag

11

s4cmd là cách nhanh nhất tôi tìm thấy (một tiện ích dòng lệnh được viết bằng Python):

pip install s4cmd

Bây giờ để tính toán toàn bộ kích thước xô bằng nhiều luồng:

s4cmd du -r s3://bucket-name

6
Không, s4cmd du s3://123123drinksẽ không chỉ đơn giản là trả lại kích thước của xô. Để có được kích thước của thùng, bạn hãy thêm đệ quy -r, như sau: s4cmd du -r s3: // 123123drink
George Chalhoub

1
Có, điểm tốt @BukLau (được thêm -rvào ví dụ ở trên để tránh nhầm lẫn khi mọi người đang sử dụng các thư mục mô phỏng trên S3).
Brent Faust

6

Tôi đã sử dụng API S3 REST / Curl được liệt kê trước đó trong chuỗi này và đã làm điều này:

<?php
if (!class_exists('S3')) require_once 'S3.php';

// Instantiate the class
$s3 = new S3('accessKeyId', 'secretAccessKey');
S3::$useSSL = false;

// List your buckets:
echo "S3::listBuckets(): ";
echo '<pre>' . print_r($s3->listBuckets(), 1). '</pre>';

$totalSize = 0;
$objects = $s3->getBucket('name-of-your-bucket');
foreach ($objects as $name => $val) {
    // If you want to get the size of a particular directory, you can do
    // only that.
    // if (strpos($name, 'directory/sub-directory') !== false)
    $totalSize += $val['size'];
}

echo ($totalSize / 1024 / 1024 / 1024) . ' GB';
?>


5

Vì vậy, tìm kiếm thông qua API và chơi một số truy vấn tương tự, S3 sẽ tạo ra toàn bộ nội dung của một nhóm trong một yêu cầu và không cần phải truy cập vào các thư mục. Các kết quả sau đó chỉ yêu cầu tổng hợp thông qua các phần tử XML khác nhau và không lặp lại các cuộc gọi. Tôi không có một thùng mẫu có hàng ngàn mặt hàng vì vậy tôi không biết nó sẽ có quy mô như thế nào, nhưng nó có vẻ đơn giản.


Điều này dường như là lựa chọn tốt nhất. Sẽ cập nhật bài đăng này trong tương lai nếu nó có quy mô kém và tôi cần phải làm một cái gì đó khác. Thư viện cuối cùng cung cấp quyền truy cập dễ dàng vào các kết quả API thô là PHP này: undesign.org.za/2007/10/22/amazon-s3-php- class
Garret Heaton

Không phải chỉ giới hạn trong 1000 mặt hàng đầu tiên sao?
Charlie Schliesser

4

... Hơi muộn một chút nhưng, cách tốt nhất tôi tìm thấy là sử dụng các báo cáo trong cổng thông tin AWS. Tôi đã tạo một lớp PHP để tải xuống và phân tích các báo cáo. Với nó, bạn có thể nhận được tổng số đối tượng cho mỗi nhóm, tổng kích thước tính bằng GB hoặc giờ byte và hơn thế nữa.

Kiểm tra nó và cho tôi biết nếu hữu ích

AmazonTools


Đây là một giải pháp thú vị, mặc dù có một chút hackish. Lo lắng về việc nó bị hỏng nếu / khi Amazon thay đổi trang web của họ, nhưng tôi có thể phải thử điều này một khi tôi có đủ các đối tượng mà cách khác trở nên quá chậm. Một lợi ích khác của phương pháp này là bạn không bị tính phí cho bất kỳ lệnh gọi API nào.
Garret Heaton

. . . đó là một giả định nhưng, nếu Amazon thay đổi giao diện trang web của họ, tôi nghi ngờ họ sẽ thay đổi phần cuối nhiều, có nghĩa là các truy vấn GET và POST hiện tại sẽ hoạt động. Tôi sẽ duy trì lớp trong trường hợp nó không bị hỏng vì tôi thường sử dụng nó.

3

Tôi khuyên bạn nên sử dụng Báo cáo sử dụng S3 cho các nhóm lớn , xem phần Cách thực hiện để lấy nó Về cơ bản, bạn cần tải xuống Báo cáo sử dụng cho dịch vụ S3 cho ngày cuối cùng với Bộ nhớ thời gian - Byte Hrs và phân tích cú pháp để sử dụng đĩa.

cat report.csv | awk -F, '{printf "%.2f GB %s %s \n", $7/(1024**3 )/24, $4, $2}' | sort -n

3

Tài liệu AWS cho bạn biết cách thực hiện:

aws s3 ls s3://bucketnanme --recursive --human-readable --summarize

Đây là đầu ra bạn nhận được:

2016-05-17 00:28:14    0 Bytes folder/
2016-05-17 00:30:57    4.7 KiB folder/file.jpg
2016-05-17 00:31:00  108.9 KiB folder/file.png
2016-05-17 00:31:03   43.2 KiB folder/file.jpg
2016-05-17 00:31:08  158.6 KiB folder/file.jpg
2016-05-17 00:31:12   70.6 KiB folder/file.png
2016-05-17 00:43:50   64.1 KiB folder/folder/folder/folder/file.jpg

Total Objects: 7

   Total Size: 450.1 KiB

2

Đối với cách tiếp cận công nghệ thấp thực sự: sử dụng máy khách S3 có thể tính toán kích thước cho bạn. Tôi đang sử dụng Panic's Transmit, nhấp vào nhóm, thực hiện "Nhận thông tin" và nhấp vào nút "Tính toán". Tôi không chắc nó nhanh hay chính xác như thế nào so với các phương pháp khác, nhưng dường như nó trả lại kích thước mà tôi mong đợi.


2

Vì có rất nhiều câu trả lời, tôi nghĩ rằng tôi sẽ tự mình tham gia. Tôi đã viết triển khai của mình trong C # bằng LINQPad. Sao chép, dán và nhập vào khóa truy cập, khóa bí mật, điểm cuối khu vực và tên nhóm bạn muốn truy vấn. Ngoài ra, hãy đảm bảo thêm gói nuget AWSSDK.

Thử nghiệm với một trong các thùng của tôi, nó cho tôi số lượng 128075 và kích thước 70,6GB. Tôi biết rằng chính xác 99,9999%, vì vậy tôi rất tốt với kết quả này.

void Main() {
    var s3Client = new AmazonS3Client("accessKey", "secretKey", RegionEndpoint.???);
    var stop = false;
    var objectsCount = 0;
    var objectsSize = 0L;
    var nextMarker = string.Empty;

    while (!stop) {
        var response = s3Client.ListObjects(new ListObjectsRequest {
            BucketName = "",
            Marker = nextMarker
        });

        objectsCount += response.S3Objects.Count;
        objectsSize += response.S3Objects.Sum(
            o =>
                o.Size);
        nextMarker = response.NextMarker;
        stop = response.S3Objects.Count < 1000;
    }

    new {
        Count = objectsCount,
        Size = objectsSize.BytesToString()
    }.Dump();
}

static class Int64Extensions {
    public static string BytesToString(
        this long byteCount) {
        if (byteCount == 0) {
            return "0B";
        }

        var suffix = new string[] { "B", "KB", "MB", "GB", "TB", "PB", "EB" };
        var longBytes = Math.Abs(byteCount);
        var place = Convert.ToInt32(Math.Floor(Math.Log(longBytes, 1024)));
        var number = Math.Round(longBytes / Math.Pow(1024, place), 1);

        return string.Format("{0}{1}", Math.Sign(byteCount) * number, suffix[place]);
    }
}

2

Nếu bạn muốn lấy kích thước từ Bảng điều khiển AWS:

  1. Chuyển đến S3 và nhấp vào tên nhóm
  2. Chọn tab "Quản lý"

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

  1. Chọn tab Số liệu

Theo mặc định, bạn sẽ thấy Số liệu lưu trữ của nhóm


1

Tôi biết đây là một câu hỏi cũ hơn nhưng đây là một ví dụ về PowerShell:

Get-S3Object -BucketName <buckename> | select key, size | foreach {$A += $_.size}

$A chứa kích thước của nhóm và có một tham số tên khóa nếu bạn chỉ muốn kích thước của một thư mục cụ thể trong nhóm.


Đầu tiên hãy chạy Get-object..line và sau đó chạy $ A (đối với những người không quen thuộc với PowerShell)
Faiz

1

Để kiểm tra tất cả kích thước xô, hãy thử tập lệnh bash này

s3list=`aws s3 ls | awk  '{print $3}'`
for s3dir in $s3list
do
    echo $s3dir
    aws s3 ls "s3://$s3dir"  --recursive --human-readable --summarize | grep "Total Size"
done

Điều này đã làm việc tuyệt vời.
Mike Barlow - BarDev

Nắm bắt đầu ra trong một biến chỉ để bạn có thể lặp qua nó là một antipotype lãng phí.
tripleee

1

Bạn có thể sử dụng s3cmd:

s3cmd du s3://Mybucket -H

hoặc là

s3cmd du s3://Mybucket --human-readable

Nó đưa ra tổng số đối tượng và kích thước của thùng ở dạng rất dễ đọc.


Liệu dutraverse tất cả các đối tượng hoặc lấy siêu dữ liệu? Thực sự muốn có một phiên bản api của phiên bản báo cáo hoặc những gì được hiển thị trong bảng điều khiển
aws

0

Xin chào, có một công cụ tìm kiếm metdata cho AWS S3 tại https://s3search.p3-labs.com/ . Công cụ này cung cấp các thống kê về các đối tượng trong một nhóm với tìm kiếm trên siêu dữ liệu.


0

Cũng Hanzo S3 Công cụ thực hiện điều này. Sau khi cài đặt, bạn có thể làm:

s3ls -s -H bucketname

Nhưng tôi tin rằng điều này cũng được tóm tắt ở phía máy khách và không được truy xuất thông qua API AWS.


0

Theo chương trình Cloudberry cũng có thể liệt kê kích thước của nhóm, số lượng thư mục và tổng số tệp, nhấp vào "thuộc tính" ngay trên đầu của nhóm.


0

Nếu bạn không muốn sử dụng dòng lệnh, trên Windows và OSX, có một ứng dụng quản lý tệp từ xa có mục đích chung gọi là Cyberduck . Đăng nhập vào S3 bằng cặp khóa truy cập / bí mật của bạn, nhấp chuột phải vào thư mục, nhấp Calculate.


0

Tôi đã viết một tập lệnh Bash, s3-du.sh sẽ liệt kê các tệp trong nhóm có s3ls và in số lượng tệp và kích cỡ như

s3-du.sh testbucket.jonzobrist.com
149 files in bucket testbucket.jonzobrist.com
11760850920 B
11485205 KB
11216 MB
10 GB

Kịch bản đầy đủ:

#!/bin/bash

if [ “${1}” ]
then
NUM=0
COUNT=0
for N in `s3ls ${1} | awk ‘{print $11}’ | grep [0-9]`
do
NUM=`expr $NUM + $N`
((COUNT++))
done
KB=`expr ${NUM} / 1024`
MB=`expr ${NUM} / 1048576`
GB=`expr ${NUM} / 1073741824`
echo “${COUNT} files in bucket ${1}”
echo “${NUM} B”
echo “${KB} KB”
echo “${MB} MB”
echo “${GB} GB”
else
echo “Usage : ${0} s3-bucket”
exit 1
fi    

Nó thực hiện kích thước thư mục con, vì Amazon trả về tên thư mục và kích thước của tất cả nội dung của nó.


0

CloudWatch hiện có bảng điều khiển dịch vụ S3 mặc định liệt kê nó trong biểu đồ có tên "Trung bình kích thước nhóm trung bình". Tôi nghĩ rằng liên kết này sẽ hoạt động cho bất kỳ ai đã đăng nhập vào AWS Console:


-1

Cách sau sử dụng SDK AWS PHP để lấy tổng kích thước của nhóm.

// make sure that you are using correct region (where the bucket is) to get new Amazon S3 client
$client = \Aws\S3\S3Client::factory(array('region' => $region));

// check if bucket exists
if (!$client->doesBucketExist($bucket, $accept403 = true)) {
    return false;
}
// get bucket objects
$objects = $client->getBucket(array('Bucket' => $bucket));

$total_size_bytes = 0;
$contents = $objects['Contents'];

// iterate through all contents to get total size
foreach ($contents as $key => $value) {
   $total_bytes += $value['Size'];
}
$total_size_gb = $total_size_bytes / 1024 / 1024 / 1024;

-1

Điều này làm việc cho tôi ..

aws s3 ls s3://bucket/folder/ --recursive | awk '{sz+=$3} END {print sz/1024/1024 "MB"}'

3
Bạn có thể thêm một vài chi tiết?
Pierre.Vriens

1
Đây thực chất là giải pháp tương tự như một câu trả lời khác được đăng khoảng một năm trước.
Louis
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.