Я хотел бы изобразить размер (в байтах и количестве элементов) корзины Amazon S3 и ищу эффективный способ получения данных.
В s3cmd инструменты позволяют получить общий размер файла с помощью s3cmd du s3://bucket_name
, но меня беспокоит его способность масштабироваться, поскольку похоже, что он извлекает данные о каждом файле и вычисляет свою собственную сумму. Поскольку Amazon взимает с пользователей плату в ГБ-месяцах, кажется странным, что они не раскрывают эту стоимость напрямую.
Хотя REST API Amazon возвращает количество элементов в ведре, s3cmd похоже, не разоблачает. я мог бы сделать s3cmd ls -r s3://bucket_name | wc -l
но это похоже на взлом.
Рубин AWS :: S3 библиотека выглядела многообещающе, но предоставляет только количество элементов корзины, а не общий размер корзины.
Кто-нибудь знает о каких-либо других инструментах или библиотеках командной строки (предпочтительно Perl, PHP, Python или Ruby), которые предоставляют способы получения этих данных?
Теперь это можно сделать просто с помощью официального клиента командной строки AWS:
aws s3 ls --summarize --human-readable --recursive s3://bucket-name/
Это также принимает префиксы пути, если вы не хотите подсчитывать всю корзину:
aws s3 ls --summarize --human-readable --recursive s3://bucket-name/directory
Интерфейс командной строки 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[])]"
По состоянию на 28 июля 2015 г. вы можете получить эту информацию через CloudWatch. Если вам нужен графический интерфейс, перейдите в Консоль CloudWatch: (Выберите регион>) Метрики> S3
Это намного быстрее, чем некоторые другие команды, размещенные здесь, поскольку он не запрашивает размер каждого файла отдельно для вычисления суммы.
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
s3cmd может это сделать:
s3cmd du s3://bucket-name
Если вы загрузите отчет об использовании, вы можете построить график ежедневных значений для TimedStorage-ByteHrs
поле.
Если вам нужно это число в ГиБ, просто разделите на 1024 * 1024 * 1024 * 24
(это ГиБ-часы для 24-часового цикла). Если вам нужно число в байтах, просто разделите на 24 и выйдите на график.
С помощью официальных инструментов командной строки 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
s4cmd - самый быстрый способ, который я нашел (утилита командной строки, написанная на Python):
pip install s4cmd
Теперь, чтобы рассчитать полный размер корзины с использованием нескольких потоков:
s4cmd du -r s3://bucket-name
Если вы хотите получить размер из Консоли AWS:
По умолчанию вы должны увидеть Метрика хранилища ведра
Вы можете использовать утилиту s3cmd, например:
s3cmd du -H s3://Mybucket
97G s3://Mybucket/
Я использовал 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';
?>
Таким образом, просматривая API и воспроизводя одни и те же запросы, S3 создаст все содержимое корзины за один запрос, и ему не нужно спускаться в каталоги. Затем результаты просто требуют суммирования различных элементов XML, а не повторных вызовов. У меня нет пробного ведра с тысячами предметов, поэтому я не знаю, насколько хорошо оно будет масштабироваться, но оно кажется достаточно простым.
... Немного поздно, но лучший способ, который я нашел, - это использовать отчеты на портале AWS. Я сделал класс PHP для загрузки и анализа отчетов. С его помощью вы можете получить общее количество объектов для каждой корзины, общий размер в ГБ или байтах-часах и многое другое.
Проверьте это и дайте мне знать, было ли полезно
В документации 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
Я рекомендую использовать S3 Usage Report для большие ведра, видеть мой как о том, как его получить В основном вам нужно загрузить отчет об использовании службы S3 за последний день с помощью Timed Storage - Byte Hrs и проанализировать его, чтобы узнать использование диска.
cat report.csv | awk -F, '{printf "%.2f GB %s %s \n", $7/(1024**3 )/24, $4, $2}' | sort -n
Поскольку ответов так много, я решил, что отвечу на свой вопрос. Я написал свою реализацию на 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]);
}
}
Для действительно низкотехнологичного подхода: используйте клиент S3, который может рассчитать размер за вас. Я использую Panic's Transmit, нажимаю на ведро, делаю «Получить информацию» и нажимаю кнопку «Рассчитать». Я не уверен, насколько он быстр или точен по сравнению с другими методами, но, похоже, он возвращает тот размер, которого я ожидал.
Ты можешь использовать s3cmd
:
s3cmd du s3://Mybucket -H
или
s3cmd du s3://Mybucket --human-readable
Он дает общее количество объектов и размер ведра в очень удобочитаемой форме.
Чтобы проверить размер всех сегментов, попробуйте этот сценарий 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
Я знаю, что это старый вопрос, но вот пример PowerShell:
Get-S3Object -BucketName <buckename> | select key, size | foreach {$A += $_.size}
$A
содержит размер корзины, и есть параметр имени ключа, если вам просто нужен размер конкретной папки в корзине.
CloudWatch теперь имеет панель управления сервисом S3 по умолчанию, на которой он отображается в виде графика под названием «Средний размер сегмента в байтах». думаю эта ссылка будет работать для всех, кто уже вошел в Консоль AWS:
Я написал сценарий 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 возвращает имя каталога и размер всего его содержимого.
Если вы не хотите использовать командную строку в Windows и OSX, есть приложение для удаленного управления файлами общего назначения, которое называется Cyberduck. Войдите в S3 с вашей парой доступа / секретного ключа, щелкните правой кнопкой мыши каталог, щелкните Calculate
.
По Морошка В программе также есть возможность перечислить размер ведра, количество папок и общее количество файлов, нажав кнопку «Свойства» прямо над ведром.
Также Инструменты Hanzo S3 Является ли это. После установки вы можете:
s3ls -s -H bucketname
Но я считаю, что это также суммируется на стороне клиента и не извлекается через API AWS.
Привет, есть инструмент поиска метаданных для AWS S3 по адресу https://s3search.p3-labs.com/Этот инструмент дает статистику об объектах в ведре с поиском по метаданным.
В следующем способе используется 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;
Это работает для меня ..
aws s3 ls s3://bucket/folder/ --recursive | awk '{sz+=$3} END {print sz/1024/1024 "MB"}'