Как я могу получить размер корзины 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
philwills
источник
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
dyltini
источник
1
Предоставьте ссылку на то, где amazon фактически заявляет это, пожалуйста. Я не могу найти это.
Лоби
1
docs.aws.amazon.com/cli/latest/reference/s3/ls.html - это лучшая ссылка
Ян Бэмфорт,
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';
?>
Vic
источник
6

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

s3cmd du -H s3://Mybucket
97G      s3://Mybucket/
user319660
источник
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». Я не уверен, насколько он быстр или точен по сравнению с другими методами, но, похоже, он возвращает мне тот размер, который я ожидал.

zmippie
источник
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]);
    }
}
Gup3rSuR4c
источник
2

Если вы хотите получить размер из Консоли AWS:

  1. Перейдите к S3 и нажмите на название корзины
  2. Выберите вкладку «Управление»

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

  1. Выберите вкладку Метрики

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

Хуман Бахрейни
источник
1

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

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

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

DCJeff
источник
Сначала запустите 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

Это дает общее количество объектов и размер корзины в очень удобочитаемой форме.

bpathak
источник
duПеречисляет ли список все объекты или получает метаданные? Хотелось бы получить версию API для отчетов или версию, отображаемую в консоли aws ...
user67327
0

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

pyth
источник
0

Также Hanzo S3 Tools делает это. После установки вы можете сделать:

s3ls -s -H bucketname

Но я считаю, что это также суммируется на стороне клиента и не получается через API AWS.

Виль
источник
0

По программе Cloudberry также можно перечислить размер корзины , количество папок и общее количество файлов, нажав «Свойства» прямо в верхней части корзины.

Кико
источник
0

Если вы не хотите использовать командную строку, в Windows и OSX есть универсальное приложение для удаленного управления файлами, которое называется Cyberduck . Войдите в S3 с вашей парой доступа / секретного ключа, щелкните правой кнопкой мыши каталог, щелкните Calculate.

jpillora
источник
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:

flickerfly
источник
-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"}'
GrantO
источник
3
Можете ли вы добавить еще несколько деталей?
Pierre.Vriens
1
По сути, это то же решение, что и в другом ответе, опубликованном около года назад.
Луи