Как найти размер каждого ведра S3 с помощью boto3 - PullRequest
0 голосов
/ 14 мая 2019

Я хочу рассчитать размер каждого сегмента s3 и получить результат, подобный этому

Bucket_name total size
('bucket_A ', 0)
('Bucket_B', 51090)

Это то, что я пытаюсь сделать до сих пор:

import boto3 
total_size = 0 
s3=boto3.resource('s3') 
for mybucket in s3.buckets.all(): 
  mybucket_size=sum([object.size for object in boto3.resource('s3').Bucket(mybucket.name).objects.all()]) 
print (mybucket.name, mybucket_size)

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Amazon CloudWatch автоматически собирает показатели в Amazon S3, включая BucketSizeBytes:

Количество данных в байтах, хранящихся в корзине в классе хранения STANDARD, хранилище INTELLIGENT_TIERINGкласс, Стандарт - класс хранения с нечастым доступом (STANDARD_IA), OneZone - класс с нечастым доступом (ONEZONE_IA), класс хранения с избыточным резервированием (RRS) или класс хранения Glacier (GLACIER).Это значение рассчитывается путем суммирования размера всех объектов в корзине (как текущих, так и непереходных объектов), включая размер всех частей для всех незавершенных многоэлементных загрузок в корзину.

См .: Мониторинг показателей с помощью Amazon CloudWatch - Amazon Simple Storage Service

0 голосов
/ 14 мая 2019

Просто переберите все объекты и посчитайте размер

sum([object.size for object in boto3.resource('s3').Bucket('mybucket').objects.all()])

EDIT:

Если вы хотите, чтобы это было быстрее, вам придется использовать другой подход, описанный выше метод делает HTTP-запрос для каждого объекта в вашей корзине, поэтому, очевидно, он масштабируется линейно с количеством файлов в корзине. К сожалению, это нельзя ускорить.

Однако вы можете использовать сторонние скрипты, такие как s4cmd, что быстрее по сравнению с первым подходом.

s4cmd du s3://bucket-name

Или используйте -r, если вы хотите включить размер подкаталогов

s4cmd du -r s3://bucket-name
...