Как я могу получить размер ведра 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, но это похоже на взлом.

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

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

234 голоса | спросил Garret Heaton 15 72009vEurope/Moscow11bEurope/MoscowSun, 15 Nov 2009 03:40:45 +0300 2009, 03:40:45

25 ответов


139

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

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

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

 aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]"
ответил Christopher Hackett 17 12014vEurope/Moscow11bEurope/MoscowMon, 17 Nov 2014 02:00:30 +0300 2014, 02:00:30
237

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

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

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

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

aws s3 ls --summarize --human-readable --recursive s3://bucket-name/directory
ответил philwills 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2015 17:04:47 +0300 2015, 17:04:47
100

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

s3cmd du s3://bucket-name

ответил Stefan Ticu 8 J000000Friday11 2011, 17:40:56
95

Консоль AWS:

От 28-й от июля 2015 года вы можете получить эту информацию через CloudWatch . Если вы хотите использовать графический интерфейс, перейдите в консоль CloudWatch : (выберите Region>) Метрики> ; 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
ответил Sam Martin 1 AM000000120000004131 2015, 00:58:41
22

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

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

ответил Christopher Schultz 5 WedEurope/Moscow2012-12-05T21:22:45+04:00Europe/Moscow12bEurope/MoscowWed, 05 Dec 2012 21:22:45 +0400 2012, 21:22:45
14

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

aws s3 ls s3://bucket/folder --recursive | awk 'BEGIN {total=0}{total+=$3}END{print total/1024/1024" MB"}'
ответил dyltini 23 PMpThu, 23 Apr 2015 14:22:31 +030022Thursday 2015, 14:22:31
9

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

pip install s4cmd

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

s4cmd du -r s3://bucket-name
ответил Brent Faust 1 AMpWed, 01 Apr 2015 01:12:28 +030012Wednesday 2015, 01:12:28
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 12 SunEurope/Moscow2010-12-12T22:05:34+03:00Europe/Moscow12bEurope/MoscowSun, 12 Dec 2010 22:05:34 +0300 2010, 22:05:34
4

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

ответил Jim Zajkowski 15 72009vEurope/Moscow11bEurope/MoscowSun, 15 Nov 2009 07:00:15 +0300 2009, 07:00:15
4

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

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

AmazonTools

ответил 21 MonEurope/Moscow2009-12-21T01:56:54+03:00Europe/Moscow12bEurope/MoscowMon, 21 Dec 2009 01:56:54 +0300 2009, 01:56:54
4

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

s3cmd du -H s3://Mybucket
97G      s3://Mybucket/
ответил user319660 9 MarpmMon, 09 Mar 2015 18:43:09 +03002015-03-09T18:43:09+03:0006 2015, 18:43:09
2

Я рекомендую использовать отчет использования S3 для больших ведер , см. my How To о том, как его получить В основном вам нужно загрузить отчет об использовании для службы S3 за последний день с помощью Timed Storage - Byte Hrs и проанализировать его для использования диска.

cat report.csv | awk -F, '{printf "%.2f GB %s %s \n", $7/(1024**3 )/24, $4, $2}' | sort -n
ответил Jakub Głazik 29 AMpWed, 29 Apr 2015 01:17:28 +030017Wednesday 2015, 01:17:28
2

Для действительно низкотехнологичного подхода: используйте клиент S3, который может рассчитать размер для вас. Я использую Передачу Паники, нажимаю на ведро, делаю «Получить информацию» и нажимаю кнопку «Рассчитать». Я не уверен, насколько это быстро или точно по отношению к другим методам, но, похоже, возвращает размер, который я ожидал.

ответил zmippie 29 J000000Wednesday15 2015, 14:56:21
2

Документация 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
ответил 奉太郎折木 18 Mayam16 2016, 07:42:53
2

Поскольку есть так много ответов, я подумал, что смогу использовать свое. Я написал свою реализацию на C #, используя LINQPad. Скопируйте, вставьте и введите ключ доступа, секретный ключ, конечную точку региона и имя ведра, которое вы хотите запросить. Кроме того, не забудьте добавить пакет AWSSDK nuget.

Тестирование против одного из моих ковшей, это дало мне счет 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 1 J000000Friday16 2016, 20:36:19
1

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

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

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

ответил DCJeff 23 PMpThu, 23 Apr 2015 14:57:31 +030057Thursday 2015, 14:57:31
0

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

ответил pyth 20 J0000006Europe/Moscow 2013, 22:08:04
0

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

s3ls -s -H bucketname

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

ответил Ville 16 J000000Monday12 2012, 21:50:07
0

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

ответил KiKo 10 TueEurope/Moscow2013-12-10T23:27:48+04:00Europe/Moscow12bEurope/MoscowTue, 10 Dec 2013 23:27:48 +0400 2013, 23:27:48
0

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

ответил jpillora 25 AMpSat, 25 Apr 2015 09:06:18 +030006Saturday 2015, 09:06:18
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 возвращает имя каталога и размер всего содержимого.

ответил Jon Zobrist 19 PMpThu, 19 Apr 2012 20:35:46 +040035Thursday 2012, 20:35:46
0

Чтобы проверить размер всех ведер, попробуйте этот сценарий 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
ответил Giulio Roggero 5 J000000Tuesday16 2016, 22:24:47
0

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

s3cmd du s3://Mybucket -H

или

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

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

ответил bpathak 21 J000000Thursday16 2016, 08:13:44
-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;
ответил Shriganesh Shintre 7 AMpTue, 07 Apr 2015 00:44:26 +030044Tuesday 2015, 00:44:26
-1

Это работает для меня ..

aws s3 ls s3://bucket/folder/ --recursive | awk '{sz+=$3} END {print sz/1024/1024 "MB"}'
ответил GrantO 14 PMpThu, 14 Apr 2016 22:50:03 +030050Thursday 2016, 22:50:03

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132