Як я можу отримати розмір відра Amazon S3?


289

Я хотів би графікувати розмір відра Amazon S3 (в байтах і # елементів), і я шукаю ефективний спосіб отримати дані.

Інструменти s3cmd надають спосіб отримати загальний розмір файлу за допомогою s3cmd du s3://bucket_name, але я переживаю за його здатність до масштабування, оскільки, схоже, він отримує дані про кожен файл та обчислює власну суму. Оскільки Amazon стягує плату з користувачів у ГБ-місяцях, дивно, що вони не піддають цього значення безпосередньо.

Хоча REST API Amazon повертає кількість елементів у відрі, s3cmd , схоже, не виставляє його. Я міг би зробити, s3cmd ls -r s3://bucket_name | wc -lале це здається рушником.

Бібліотека Ruby AWS :: S3 виглядала багатообіцяючою, але містить лише # елементів відра, а не загальний розмір відра.

Хтось знає про будь-які інші інструменти чи бібліотеки командного рядка (віддайте перевагу Perl, PHP, Python чи Ruby), які надають способи отримання цих даних?


Я написав інструмент для аналізу розміру відра: github.com/EverythingMe/ncdu-s3
— omribahumi

19
Я здивований, що Amazon стягує плату за простір, але не надає загальний розмір, який займає відро S3 просто через панель S3.
— Лука

Для мене більшість відповідей нижче зайняла досить багато часу, щоб отримати розмір відра, однак цей сценарій python виявився набагато швидшим, ніж більшість відповідей - slsmk.com/getting-the-size-of-an-s3-bucket-using -boto3-for-
— aws

Відповіді:


168

Тепер AWS CLI підтримує --queryпараметр, який приймає вирази JMESPath .

Це означає, що ви можете підсумовувати значення розміру, list-objectsвикористовуючи sum(Contents[].Size)та рахуючи подібні length(Contents[]).

Це можна виконати за допомогою офіційного CLI AWS, як показано нижче, і було представлено у лютому 2014 року

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

21
Для великих відрів (великих # файлів) це вибагливо повільно. Утиліта Python s4cmd "du" блискавично:s4cmd du s3://bucket-name
— Brent Faust

Це дивно. Який загальний профіль вашого відра (неглибокий і жирний / глибокий і тонкий)? Схоже, вони s3cmdповинні мати ті ж накладні витрати, що і AWS CLI. У наведеному коді s3cmd зробіть запит для кожного каталогу у відрі.
— Крістофер Хакетт

22
щоб отримати його у читаному для людини форматі: 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
Тепер, коли AWS Cloudwatch пропонує метрику "BucketSizeBytes" на відро, це вже не є правильним рішенням. Дивіться відповідь Тукакукан нижче.
— cce

2
s4cmd duчудово, дякую @Brent Faust! невелика примітка (для тих, кого це стосується), яку потрібно додати, -rщоб отримати також розміри підкаталогів.
— Грег Садецький

330

Тепер це можна зробити тривіально за допомогою лише офіційного клієнта командного рядка AWS:

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

Офіційна документація

Це також приймає префікси шляху, якщо ви не хочете рахувати все відро:

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

23
Це найкраща і найсвіжіша відповідь
— Тім

2
Погодьтеся, це найкраща відповідь.
— Луїс Артола

24
Це дуже повільно для відра з багатьма файлами, оскільки він, в основному, перераховує всі об'єкти у відрі до показу резюме, і тим, що він не є значно швидшим, ніж відповідь @Christopher Hackett - за винятком цього, він набагато більш галасливий.
— Гасс

Запустіть екземпляр EC2 з тим же регіоном відра, щоб покращити затримку
— juanmirocks

1
Це покаже розмір ВСІХ окремих файлів у дереві каталогів. Що робити, якщо я просто хочу загальний розмір каталогу?
— Кріс Ф

130

Консоль AWS:

Станом на 28 липня 2015 року ви можете отримати цю інформацію через CloudWatch . Якщо вам потрібен графічний інтерфейс, перейдіть до консолі CloudWatch : (Виберіть регіон>) Метрики> S3

Команда AWS CLI:

Це набагато швидше, ніж деякі інші команди, розміщені тут, оскільки він не запитує розмір кожного файлу окремо для обчислення суми.

 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

Важливо : у аргументі розмірів потрібно вказати і StorageType, і BucketName, інакше ви не отримаєте результатів. Все , що вам потрібно змінити це --start-date, --end-timeі Value=toukakoukan.com.


Ось сценарій bash, який ви можете використовувати, щоб уникнути необхідності вказувати --start-dateта --end-timeвручну.

#!/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
Або в консолі CloudWatch : (Виберіть регіон>) Метрики> S3
— Halil Özgür

3
Це, безумовно, найпростіше і найшвидше рішення. На жаль, відповідь досі лише на четвертому місці.
— luk2302

Це працювало на моє відро з 10 мільйонами предметів. Але сценарій bash нічого не повернув, довелося перейти в GUI).
— Petah

1
Також слід зазначити, що вам доведеться також змінити регіон
— majikman

травень 2018 року: помилки сценарію зInvalid value ('1525354418') for param timestamp:StartTime of type timestamp
— анеб

106

s3cmd може це зробити:

s3cmd du s3://bucket-name


Дякую. Ось деякі терміни. На відро, у якому розміщена файлична система, дедупльована s3ql, з мільйонам файлів, використовуючи близько 33 ГБ невідповідних даних, і близько 93000 об'єктів s3, для обчислення відповіді s3cmd du пішло близько 4 хвилин. Мені цікаво дізнатися, як це порівнюється з іншими підходами, такими як php, описаним в інших місцях.
— nealmcb

1
Це повільно, оскільки виклик API S3 ListObjects повертає об'єкти на сторінках 1000 об'єктів. Оскільки введення / виведення є на сьогодні обмежуючим фактором, я думаю, що будь-яке рішення буде відносно повільним щодо 93000 об'єктів.
— Девід Снабель-Кант

11
s4cmd також може зробити те ж саме, з додатковою перевагою багатопотокового запиту до API S3 для швидшого обчислення результату. Інструмент останнім часом не оновлювався, однак Інтернет-перехожий може вважати його корисним.
— Нік Чаммас

s4cmd просто повертає 0 для мене, а повертає BotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format.для відра з великими літерами.
— Лакіту

22

Якщо ви завантажуєте звіт про використання , ви можете графікувати добові значення для TimedStorage-ByteHrsполя.

Якщо ви хочете, щоб це число було в GiB, просто діліться на 1024 * 1024 * 1024 * 24(це GiB-години за 24-годинний цикл). Якщо ви хочете число в байтах, просто діліться на 24 та графік.


19

Використання офіційних інструментів командного рядка AWS s3:

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

Це краща команда, просто додайте наступні 3 параметри --summarize --human-readable --recursiveпісля aws s3 ls. --summarizeне потрібно, хоча приємно торкається загального розміру.

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

1
Надайте посилання на те, де Amazon фактично заявляє про це, будь ласка. Я не можу його знайти.
— лобі



4
Ця відповідь спрацювала найкраще і найшвидше для мене.
— Миро

2
найкраща та найшвидша відповідь!
— PlagTag

11

s4cmd - це найшвидший спосіб, який я знайшов (утиліта командного рядка, написана на Python):

pip install s4cmd

Тепер обчислимо весь розмір відра за допомогою декількох ниток:

s4cmd du -r s3://bucket-name

6
Ні, s4cmd du s3://123123drinkне повернеться просто розмір відра. Щоб отримати розмір відра, додайте рекурсивний текст -r, наприклад: s4cmd du -r s3: // 123123drink
— Джордж Chalhoub

1
Так, добре @BukLau (додано -rдо прикладу вище, щоб уникнути плутанини, коли люди використовують імітовані папки на S3).
— Brent Faust

6

Я використав API S3 REST / Curl, перелічений раніше в цій темі, і зробив це:

<?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

Таким чином, обмінюючись API та відтворюючи одні й ті самі запити, S3 виробляє весь вміст відра за один запит, і йому не потрібно спускатися в каталоги. Потім результати просто вимагають підсумовувати різні елементи XML, а не повторювати дзвінки. У мене немає відра для зразків, у якому є тисячі предметів, тому я не знаю, наскільки добре він буде масштабуватися, але це здається досить простим.


Це, здається, є найкращим варіантом. Буде оновлено цю публікацію в майбутньому, якщо вона погано масштабується, і мені потрібно зробити щось інше. Бібліотека, яка надала легкий доступ до вихідних результатів API, була такою PHP: undesigned.org.za/2007/10/22/amazon-s3-php-class
— Garret Heaton

Хіба це не обмежується лише першими 1000 предметами?
— Чарлі Шліссер

4

... Трохи пізно, але найкращий спосіб, який я знайшов, - це за допомогою звітів на порталі AWS. Я зробив клас PHP для завантаження та розбору звітів. З його допомогою ви можете отримати загальну кількість об'єктів для кожного відра, загальний розмір в ГБ або байт-годин і більше.

Перевірте це і дайте мені знати, чи було корисно

AmazonTools


Це цікаве рішення, хоча і трохи хакітське. Стурбований тим, що це порушиться, якщо / коли Amazon змінить свій сайт, але мені, можливо, доведеться спробувати це, як тільки у мене вистачить об’єктів, які в іншому випадку стануть занадто повільними. Ще одна перевага цього підходу полягає в тому, що ви не платите жодні дзвінки API.
— Гаррет Хітон

. . . це припущення, але, якщо Amazon змінить зовнішній вигляд свого сайту, я сумніваюся, що вони сильно змінить задній край, тобто поточні запити GET і POST повинні спрацювати. Я буду підтримувати клас, якщо він все-таки зламається, оскільки я його часто використовую.

3

Я рекомендую використовувати Звіт про використання S3 для великих відра , дивіться мою «Як це зробити» В основному вам потрібно завантажити звіт про використання служб S3 за останній день за допомогою Timed Storage - Byte Hrs та проаналізувати його, щоб отримати диск.

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

3

Документація AWS говорить вам, як це зробити:

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

Це вихід, який ви отримуєте:

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

Для дійсно низькотехнологічного підходу: використовуйте клієнт S3, який може розрахувати розмір для вас. Я використовую передачу Panic's Transmit, натискаю на відро, робимо "Отримати інформацію" та натискаємо кнопку "Обчислити". Я не впевнений, наскільки це швидко чи точно в порівнянні з іншими методами, але, здається, він повертає той розмір, який я очікував.


2

Оскільки є так багато відповідей, я подумав, що зіткнуся зі своїм. Я написав свою реалізацію в C # за допомогою LINQPad. Скопіюйте, вставте та введіть ключ доступу, секретний ключ, кінцеву точку регіону та ім'я відра, яке потрібно запитувати. Крім того, переконайтеся, що ви додали цілий пакет AWSSDK.

Випробовуючи одне з моїх відра, він дав мені рахунок 128075 і розмір 70,6 ГБ. Я знаю, що це на 99,9999%, тому я хороший з результатом.

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

Якщо ви хочете отримати розмір від консолі AWS:

  1. Перейдіть до S3 та натисніть на назву відра
  2. Виберіть вкладку "Управління"

введіть тут опис зображення

  1. Виберіть вкладку " Метрики"

За замовчуванням ви повинні побачити метрику зберігання відра


1

Я знаю, що це старе питання, але ось приклад PowerShell:

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

$A містить розмір відра, і є параметр імені ключа, якщо ви просто хочете розмір певної папки у відрі.


Спочатку запустіть Get-object..line, а потім запустіть $ A (для тих, хто не знайомий з PowerShell)
— Faiz

1

Щоб перевірити всі розміри відра, спробуйте цей скрипт bash

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

Це спрацювало чудово.
— Майк Барлоу - BarDev

Захоплення результату в змінній просто так, що ви можете перевести цикл на неї - це марний антипатерн.
— tripleee

1

Ви можете використовувати s3cmd:

s3cmd du s3://Mybucket -H

або

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

Він дає загальну кількість предметів та розмір відра у дуже читабельній формі.


Чи переглядає duперелік усіх об'єктів чи витягує метадані? Дуже хотілося б версії api версії звітів або того, що відображається на консолі
— aws


0

Також це робить Hanzo S3 Tools . Після встановлення ви можете:

s3ls -s -H bucketname

Але я вважаю, що це також підсумовується на стороні клієнта, а не отримується через API AWS.


0

За програмою Cloudberry можна також перелічити розмір відра, кількість папок та загальну кількість файлів, натиснувши "властивості" праворуч зверху.


0

Якщо ви не хочете використовувати командний рядок, у Windows та OSX є програма віддаленого керування файлами загального призначення під назвою Cyberduck . Увійдіть у S3 за допомогою пари ключів доступу / секретного ключа, клацніть правою кнопкою миші на каталозі та клацніть Calculate.


0

Я написав сценарій Bash, s3-du.sh, який буде перераховувати файли у відрі з s3ls та друкувати кількість файлів та розміри, як

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

Повний сценарій:

#!/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    

Він має розмір підкаталогу, оскільки Amazon повертає ім'я каталогу та розмір усього його вмісту.


0

CloudWatch має типову інформаційну панель служби S3 за замовчуванням, яка перераховує її у графіку під назвою "Середній розмір байтів". Я думаю, що це посилання підійде для всіх, хто вже увійшов до консолі AWS:


-1

Наступним способом використовується AWS PHP SDK, щоб отримати загальний розмір відра.

// 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

Це працює для мене ..

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

3
Чи можете ви додати ще кілька деталей?
— Pierre.Vriens

1
Це по суті те саме рішення, що й інша відповідь, опублікована приблизно роком раніше.
— Луї
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.