Как я могу получить размер корзины Amazon S3?


290

Я хотел бы изобразить размер (в байтах и ​​# элементов) корзины Amazon S3 и ищу эффективный способ получения данных.

Инструменты s3cmd предоставляют способ получения общего размера файла с использованием s3cmd du s3://bucket_name, но я беспокоюсь о его способности масштабировать, поскольку похоже, что он выбирает данные о каждом файле и вычисляет свою собственную сумму. Поскольку Amazon взимает плату с пользователей в месяцах GB, кажется странным, что они не выставляют это значение напрямую.

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

Библиотека Ruby AWS :: S3 выглядела многообещающе, но предоставляет только количество элементов корзины, а не общий размер корзины.

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


Я написал инструмент для анализа размера
— корзины

20
Я удивлен тем, что Amazon взимает плату за место, но не предоставляю общий размер, занимаемый S3, просто через панель S3.
— Люк

Для меня большинство ответов ниже заняло довольно много времени, чтобы получить размер корзины
— Vaulstein

Ответы:


169

Теперь CLI AWS поддерживает --queryпараметр, который принимает выражения JMESPath .

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

Это можно запустить с помощью официального интерфейса командной строки 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
— Брент Фауст

Это странно. Каков общий профиль вашего ведра (мелкий и толстый / глубокий и тонкий)? Похоже, 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 для каждого сегмента, это уже не правильное решение. Смотрите ответ Тукакукана ниже.
— 2012 г.,

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

331

Теперь это можно сделать тривиально, просто с помощью официального клиента командной строки AWS:

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

Официальная документация

Это также принимает префиксы пути, если вы не хотите считать весь сегмент:

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

23
Это самый лучший и актуальный ответ
— Тим

2
Согласитесь, это лучший ответ.
— Луис Артола

25
Это очень медленно для сегментов с большим количеством файлов, поскольку в основном перечисляет все объекты в блоке перед отображением сводки, и в этом он не намного быстрее, чем ответ @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
— Халил Озгюр

3
Это, безусловно, самое простое и быстрое решение. К сожалению, ответ пока только на четвертом месте.
— luk2302

Это сработало для моего ведра с 10 миллионами + объектов. Но bash-скрипт ничего не возвращал, пришлось переходить в GUI).
— Петах

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

май 2018: скрипт ошибки сInvalid value ('1525354418') for param timestamp:StartTime of type timestamp
— anneb

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.для сегментов с заглавными буквами.
— Lakitu

22

Если вы загрузите отчет об использовании , вы можете отобразить дневные значения для TimedStorage-ByteHrsполя.

Если вы хотите получить это число в ГиБ, просто разделите на 1024 * 1024 * 1024 * 24(это ГиБ-часы для 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
— Джордж Чалхуб,

1
Да, хорошая мысль @BukLau (добавлено -rв пример выше, чтобы избежать путаницы, когда люди используют смоделированные папки на S3).
— Брент Фауст

6

Я использовал S3 REST / Curl API, указанный ранее в этой теме, и сделал это:

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

6

Вы можете использовать утилиту s3cmd, например:

s3cmd du -H s3://Mybucket
97G      s3://Mybucket/

5

Таким образом, просматривая API и воспроизводя несколько одинаковых запросов, S3 будет производить все содержимое сегмента за один запрос, и ему не нужно спускаться в каталоги. Результаты затем просто требуют суммирования по различным элементам XML, а не повторных вызовов. У меня нет образца ведра с тысячами предметов, поэтому я не знаю, насколько хорошо он будет масштабироваться, но он кажется достаточно простым.


Это кажется лучшим вариантом. Обновлю этот пост в будущем, если он плохо масштабируется и мне нужно будет заняться чем-то другим. Библиотека, которая в итоге обеспечила легкий доступ к необработанным API-результатам, была этой PHP: undesigned.org.za/2007/10/22/amazon-s3-php-class
— Гаррет Хитон

Разве это не ограничивается только первыми 1000 предметами?
— Чарли Шлиссер

4

... Немного поздно, но лучший способ, который я нашел, - это использовать отчеты на портале AWS. Я сделал PHP-класс для загрузки и анализа отчетов. С его помощью вы можете получить общее количество объектов для каждого сегмента, общий размер в ГБ или в байтах и ​​многое другое.

Проверьте это и дайте мне знать, если это было полезно

AmazonTools


Это интересное решение, хотя и немного хакерское. Беспокоюсь, что он сломается, если / когда Amazon изменит свой сайт, но мне, возможно, придется попробовать это, как только у меня будет достаточно объектов, которые в противном случае станут слишком медленными. Еще одним преимуществом этого подхода является то, что вы не платите за любые вызовы API.
— Гаррет Хитон

, , , Это предположение, но если Amazon действительно изменит внешний вид своего сайта, я сомневаюсь, что они сильно изменят внутренний интерфейс, то есть текущие запросы GET и POST должны работать. Я буду поддерживать класс в случае, если он все равно сломается, поскольку я часто его использую.

3

Я рекомендую использовать S3 Usage Report для больших сегментов , см. Мои инструкции о том, как его получить. По сути, вам необходимо загрузить Usage Report for S3 service за последний день с помощью 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, который может рассчитать размер для вас. Я использую Transmit от Panic, нажимаю на корзину, делаю «Get Info» и нажимаю кнопку «Calculate». Я не уверен, насколько он быстр или точен по сравнению с другими методами, но, похоже, он возвращает мне тот размер, который я ожидал.


2

Поскольку ответов так много, я решила, что сама добавлю свои. Я написал свою реализацию на C #, используя LINQPad. Скопируйте, вставьте и введите ключ доступа, секретный ключ, конечную точку региона и имя сегмента, который вы хотите запросить. Также обязательно добавьте пакет nuget 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. Выберите вкладку Метрики

По умолчанию вы должны увидеть хранения Metric ведра


1

Я знаю, что это старый вопрос, но вот пример PowerShell:

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

$A содержит размер сегмента и параметр keyname, если вы просто хотите указать размер определенной папки в блоке.


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

1

Чтобы проверить размер всех блоков, попробуйте этот скрипт

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 ...
— user67327

0

Привет, есть инструмент поиска метаданных для AWS S3 по адресу https://s3search.p3-labs.com/. Этот инструмент выдает статистику об объектах в корзине с поиском по метаданным.


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.