Вопрос: Как я могу получить размер ведра Amazon S3?


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

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

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

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

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


236
2017-11-15 00:40


Источник


Я написал инструмент для анализа размера ковша: github.com/EverythingMe/ncdu-s3 - omribahumi
Я удивлен, что Amazon заряжает пространство, но не дает общий размер, занимаемый ведро S3, просто через панель S3. - Luke
Для меня большинство из приведенных ниже ответов заняло довольно много времени, чтобы получить размер ведра, однако этот скрипт python был быстрее, чем большинство ответов - slsmk.com/getting-the-size-of-an-s3-bucket-using-boto3-for-aws - Vaulstein


Ответы:


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

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

Это можно запустить с помощью официального AWS CLI, как показано ниже, и Февраль 2014 г.

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

141
2017-11-16 23:00



Для больших ведер (больших # файлов) это мучительно медленно. Утилита Python s4cmd «du» работает молниеносно: s4cmd du s3://bucket-name - Brent Faust
Это странно. Каков общий профиль вашего ведра (мелкий и толстый / глубокий и тонкий)? Это выглядит как s3cmd должны иметь одинаковые накладные расходы AWS CLI, в код, который он показывает  s3cmd сделать запрос для каждого каталога в ведре. - Christopher Hackett
чтобы получить его в удобном для чтения формате: 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
Теперь, когда AWS Cloudwatch предлагает метку «BucketSizeBytes» для каждого байта, это уже не правильное решение. См. Ответ Тукакукана ниже. - cce
s4cmd du замечательно, спасибо @Brent Faust! небольшая заметка (для тех, кого это касается), которую необходимо добавить -r чтобы получить размеры подкаталогов. - Greg Sadetsky


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

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

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

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

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

237
2017-09-09 14:04



Это лучший и актуальный ответ - Tim
Согласитесь, это лучший ответ. - Luis Artola
Это очень медленно для ведер с большим количеством файлов, поскольку в нем в основном перечислены все объекты в ведре, прежде чем показывать сводку, и в этом он не намного быстрее, чем ответ @Christopher Hackett, за исключением того, что это намного более шумно. - Guss
Запустите экземпляр EC2 с тем же регистром ковша, чтобы улучшить латентность - juanmirocks
Если вас интересует только суммарный размер, это самое быстрое и современное решение, и вы можете просто проложить через хвост, чтобы найти это значение. - Charlie Hileman


s3cmd может сделать это:

s3cmd du s3://bucket-name


101
2017-07-08 13:40



Благодарю. Вот некоторые моменты. На ведро, в котором хранится дедуплицированная файловая система s3ql с примерно миллионом файлов с использованием около 33 ГБ нераскрытых данных и около 93000 s3 объектов, s3cmd du заняло около 4 минут, чтобы вычислить ответ. Мне любопытно узнать, как это сравнивается с другими подходами, такими как php, описанный здесь в другом месте. - nealmcb
Это медленно, потому что Вызов API S3 ListObjects возвращает объекты на страницах 1000 объектов. Поскольку I / O на сегодняшний день является ограничивающим фактором, я думаю, что любое решение будет относительно медленным на 93000 объектов. - David Snabel-Caunt
s4cmd также может сделать то же самое, с дополнительным преимуществом многопоточности запросов к API S3 для более быстрого вычисления результата. Инструмент не обновлялся в последнее время, но интернет-прохожий может показаться ему полезным. - Nick Chammas
s4cmd просто возвращает 0 для меня и возвращает BotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format. для ведер с прописными буквами. - Lakitu


Консоль AWS:

Начиная с 28 июля 2015 года вы можете получить эту информацию через CloudWatch, Если вы хотите использовать графический интерфейс, перейдите к Консоль CloudWatch: (Выберите регион>) Показатели> S3

Команда CLS AWS:

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

 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
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 eu-west-1 --metric-name BucketSizeBytes --dimensions Name=BucketName,Value="$bucket" Name=StorageType,Value=StandardStorage

95
2017-07-31 21:58



Или в консоль CloudWatch: (Выберите регион>) Показатели> S3 - Halil Özgür
Это, безусловно, самое простое и быстрое решение. К сожалению, ответ по-прежнему остается только на четвертом месте. - luk2302
Это работало на моем ковше с 10 миллионами + объектов. Но сценарий bash ничего не возвращал, приходилось идти в GUI). - Petah
Следует также отметить, что вам также придется изменить регион - majikman
может 2018: ошибки сценария с Invalid value ('1525354418') for param timestamp:StartTime of type timestamp - anneb


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

Если вы хотите это число в GiB, просто разделите его на 1024 * 1024 * 1024 * 24 (это GiB-часы для 24-часового цикла). Если вам нужно число в байтах, просто разделите его на 24 и нарисуйте.


22
2017-12-05 17:22





Использование официальных инструментов командной строки AWS s3:

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

14
2018-04-23 11:22



Предоставьте ссылку на то, где Amazon действительно заявляет это, пожалуйста. Я не могу найти его. - lobi
docs.aws.amazon.com/cli/latest/index.html - dyltini
docs.aws.amazon.com/cli/latest/reference/s3/ls.html является лучшей ссылкой - Ian Bamforth
Этот ответ работал лучшим и быстрым для меня. - Miro
лучший и быстрый ответ! - PlagTag


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

pip install s4cmd

Теперь, чтобы вычислить весь размер ковша, используя несколько потоков:

s4cmd du -r s3://bucket-name

9
2018-03-31 22:12



Нет, s4cmd du s3://123123drink не просто вернет размер ковша. Чтобы получить размер ведра, вы добавляете рекурсивный -r, вот так: s4cmd du -r s3: // 123123drink - Shogo Makishima
Да, хорошая точка @BukLau (добавлено -r например, выше, чтобы избежать путаницы, когда люди используют смоделированные папки на S3). - Brent Faust


Я использовал 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
2017-12-12 19:05





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


4
2017-11-15 04:00



Кажется, это лучший вариант. Будет обновлять этот пост в будущем, если он плохо масштабируется, и мне нужно сделать что-то еще. Библиотека, которая в конечном итоге обеспечила легкий доступ к исходным результатам API, была такой PHP: undesigned.org.za/2007/10/22/amazon-s3-php-class - Garret Heaton
Разве это не ограничивается только первыми 1000 предметами? - Charlie Schliesser