Как я могу получить размер корзины 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.