Как я могу узнать, сколько объектов я сохранил в корзине S3?


155

Если я что-то не упустил, похоже, что ни один из API, на которые я смотрел, не скажет вам, сколько объектов находится в корзине / папке S3 (префикс). Есть ли способ получить счет?


Этот вопрос может быть полезен: stackoverflow.com/questions/701545/…
— Брендан Лонг

1
Решение существует в 2015 году: stackoverflow.com/a/32908591/578989
— Mayank Jaiswal

Смотрите мой ответ ниже: stackoverflow.com/a/39111698/996926
— advncd

Ответы:


40

Нет пути, если только ты

  1. перечислите их все партиями по 1000 (что может быть медленным и отнять пропускную способность - похоже, amazon никогда не сжимает ответы XML), или

  2. войдите в свою учетную запись на S3 и перейдите в раздел Учетная запись - Использование. Кажется, отдел биллинга точно знает, сколько объектов вы сохранили!

Простая загрузка списка всех ваших объектов на самом деле займет некоторое время и будет стоить денег, если у вас будет храниться 50 миллионов объектов.

Также посмотрите эту ветку о StorageObjectCount, который находится в данных об использовании.

S3 API, чтобы получить хотя бы основы, даже если бы это было часами, было бы здорово.


Кстати, эта ссылка мертва.
— поля


Если вы ленивы, как я, Newvem в основном делает это от вашего имени и агрегирует / отслеживает результаты на уровне сегментов в вашей учетной записи S3.
— rcoup 10.10.12

2
Не могли бы вы обновить свой ответ, чтобы включить ответ @ MayankJaiswal?
— Джозеф Кейси

1
Отдел биллинга знает все! неудивительно, что они могут случайно
— разбить

256

Использование AWS CLI

aws s3 ls s3://mybucket/ --recursive | wc -l 

или

aws cloudwatch get-metric-statistics \
  --namespace AWS/S3 --metric-name NumberOfObjects \
  --dimensions Name=BucketName,Value=BUCKETNAME \
              Name=StorageType,Value=AllStorageTypes \
  --start-time 2016-11-05T00:00 --end-time 2016-11-05T00:10 \
  --period 60 --statistic Average

Примечание: приведенная выше команда cloudwatch, похоже, работает для некоторых, но не для других. Обсуждено здесь: https://forums.aws.amazon.com/thread.jspa?threadID=217050

Использование AWS Web Console

Вы можете посмотреть метрический раздел cloudwatch, чтобы получить приблизительное количество сохраненных объектов. введите описание изображения здесь

У меня есть около 50 миллионов продуктов, и для их использования потребовалось более часа. aws s3 ls


18
Это должно быть ближе к вершине.
— Джозеф Кейси

3
@JosephMCasey Я согласен. Это также работает для определения количества объектов в каталоге с таким сегментом:aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
— Тим Петерсон

1
Выдает эту ошибку, когда я запускаю вышеупомянутое в приглашении cmd - 'wc' не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл - Я новичок в этом, так что может кто-нибудь дать решение?
— Сандун

Предупреждение о том, что CloudWatch не выглядит очень надежным. У меня есть файл mp4 в одном ведре, который CloudWatch (метрика NumberOfObjects) считает как 2300 отдельных объектов. Я получил правильный номер с AWS CLI.
— AlexK

Почему «Средний»? Кто-то не хотел бы вместо этого "Сумма"?
— ffxsam

150

Существует --summarizeпереключатель, который включает в себя сводную информацию (например, количество объектов, общий размер).

Вот правильный ответ, используя AWS cli:

aws s3 ls s3://bucketName/path/ --recursive --summarize | grep "Total Objects:"

Total Objects: 194273

Смотри документацию


4
Это здорово: Total Objects: 7235 Total Size: 475566411749так легко.
— Бон

16
К сожалению, все еще есть основные накладные расходы по перечислению тысяч объектов (в настоящее время их более 600 000, так что это довольно много времени)
— MichaelChirico

сколько будет стоить выполнение этой задачи на корзине с 5М объектами?
— Психозой

2
Этот ответ крайне неэффективен, потенциально очень медленный и дорогостоящий. Он перебирает все ведро, чтобы найти ответ.
— ткач

3
И могу добавить, что итерация более 1,2 миллиарда объектов, хранящихся в стандартном хранилище, может стоить около 6000 долларов.
— C Джонсон

66

Хотя это старый вопрос, и обратная связь была получена в 2015 году, сейчас все гораздо проще, поскольку в веб-консоли S3 включена опция «Получить размер»:

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

Который обеспечивает следующее:

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


1
Да, новая Консоль AWS, хотя и ранит мои глаза, делает подсчет количества объектов и общего размера доступным при нажатии кнопки.
— Ани

11
Похоже, это работает только на уровне папок. «Получить размер» недоступно на уровне сегмента
— G-.

1
@ГРАММ-. Что делать, если вы выбираете все папки ведра?
— Gvasquez

4
@ГРАММ-. Однако в поле «Выбрать все» выбираются только папки и объекты, отображаемые на странице, а не все папки / объекты корзины.
— gparis

2
@gparis хорошая мысль. Стоит отметить. Спасибо. Таким образом, похоже, что в консоли у нас нет опции, если есть больше файлов или папок, чем может быть отображено на одной странице
— G-.

50

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

s3cmd ls -r s3://logs.mybucket/subfolder/ > listing.txt

Затем в Linux вы можете запустить wc -l для файла, чтобы подсчитать количество строк (1 строка на объект).

wc -l listing.txt

Команда -rin предназначена для --recursive, поэтому она должна работать и для подпапок.
— Дипак Джой

3 заметки по этому вопросу. а.) вы должны использовать aws s3 lsвместо s3cmd, потому что это быстрее. б.) Для больших ведер это может занять много времени. Потребовалось около 5 минут для 1 млн файлов. c.) Смотрите мой ответ ниже об использовании cloudwatch.
— mastaBlasta

46

Теперь есть простое решение с S3 API (доступно в разделе AWS):

aws s3api list-objects --bucket BUCKETNAME --output json --query "[length(Contents[])]"

или для конкретной папки:

aws s3api list-objects --bucket BUCKETNAME --prefix "folder/subfolder/" --output json --query "[length(Contents[])]"

1
Рафаэль, ваш запрос к папке работает отлично, за исключением случаев, когда папка пуста или не существует, тогда вы получите: В функции length () недопустимый тип для значения: нет, ожидается один из: ['string', 'array' , 'object'], полученный: "null" Есть ли способ просто сделать так, чтобы он выводил 0, если папка пуста или не закрывается?
— user3591836

1
Я получаю Illegal token value '(Contents[])]' (версия 1.2.9 из aws-cli), когда просто использую --bucket my-bucketи A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not existкогда использую --bucket s3://my-bucket. (Он определенно существует и имеет более 1000 файлов.)
— Даррен Кук

@DarrenCook удаляет s3: // из имени корзины. Кажется, клиент не поддерживает протокол.
— Шриранджан Манджунатх

Это намного быстрее, чем примеры wc -l. С моими ведрами это будет примерно 3-4 тыс. Объектов в секунду. Так что ~ 5 минут на миллион объектов. «Get Size» в веб-интерфейсе S3, вероятно, использует нечто похожее, поскольку занимает примерно столько же времени.
— notpeter

Для ОЧЕНЬ больших ведер это было единственное решение, которое работало для меня в течение разумного времени (менее 20 минут)
— Ник

40

Вы можете использовать показатели AWS cloudwatch для s3, чтобы увидеть точное количество для каждого сегмента. метрика cloudwatch при выборе корзины


Я думаю, что это лучший ответ
— Октав

Единственный реальный ответ, не делая ничего смешного, как перечисление 1m + ключи. Я забыл, что это было там.
— Эндрю Бакер

Это нужно больше голосов. Любое другое решение плохо масштабируется с точки зрения затрат и времени.
— Аарон Р.

5

Перейдите в раздел AWS Billing, затем отчеты, затем отчеты об использовании AWS. Выберите Amazon Simple Storage Service, затем «Операция StandardStorage». Затем вы можете загрузить CSV-файл, который содержит UsageType для StorageObjectCount, в котором перечисляется количество элементов для каждого сегмента.


4

Вы можете легко получить общее количество и историю, если перейдете на вкладку «Управление» консоли s3, а затем нажмите «Метрики» ... Снимок экрана с вкладкой


Не могли бы вы обновить изображение, чтобы показать NumberOfObjects (count/day)график? Было бы лучше, так как это напрямую связано с вопросом. На скриншоте вы показываете, BucketSizeBytes (bytes/day)что, хотя и полезно, но не имеет прямого отношения к проблеме.
— Гусмонне

1
Начиная с 2019 года, это должен быть принятый ответ. Все остальные устарели или медленные.
— C Джонсон

2

API вернет список с шагом 1000. Проверьте свойство IsTruncated, чтобы увидеть, есть ли еще. Если есть, вам нужно сделать еще один вызов и передать последний ключ, который вы получили в качестве свойства Marker при следующем вызове. Затем вы продолжите цикл, пока IsTruncated не станет ложным.

См. Этот документ Amazon для получения дополнительной информации: итерация по многостраничным результатам


2

Старая тема, но все еще актуальна, так как я искал ответ, пока я только не понял это. Я хотел, чтобы количество файлов с помощью инструмента на основе графического интерфейса (т.е. без кода). Я уже использую инструмент под названием 3Hub для перетаскивания в S3. Я хотел знать, сколько файлов у меня было в определенном ведре (я не думаю, что биллинг разбивает его на ведра).

So, using 3Hub, 
- list the contents of the bucket (looks basically like a finder or explorer window)
- go to the bottom of the list, click 'show all'
- select all (ctrl+a)
- choose copy URLs from right-click menu
- paste the list into a text file (I use TextWrangler for Mac) 
- look at the line count  

У меня было 20521 файлов в корзине, и я сделал подсчет файлов менее чем за минуту.


2

Я использовал скрипт на python от scalablelogic.com (добавление в журнал учета). Работал отлично.

#!/usr/local/bin/python

import sys

from boto.s3.connection import S3Connection

s3bucket = S3Connection().get_bucket(sys.argv[1])
size = 0
totalCount = 0

for key in s3bucket.list():
    totalCount += 1
    size += key.size

print 'total size:'
print "%.3f GB" % (size*1.0/1024/1024/1024)
print 'total count:'
print totalCount

Просто чтобы вы знали, это не работает с boto3. Я внес предложение ниже в качестве другого ответа.
— fuzzygroup

2

В s3cmd просто запустите следующую команду (в системе Ubuntu):

s3cmd ls -r s3://mybucket | wc -l

13
Почему вы воскресили 5-летний вопрос, чтобы опубликовать плохо отформатированную копию существующего ответа ?
— Двухразрядный алхимик

Предыдущий ответ без необходимости передавал вывод в текстовый файл.
— mjsa

10
ИМО, тогда это должен быть комментарий к этому ответу. Это действительно тривиальная разница.
— Двухразрядный алхимик

2
Выглядит как достойный ответ, тем более что выбранный ответ на этот вопрос начинается с «Нет пути ...», а @mjsa предоставил однострочный ответ.
— Nan

Это не очень хороший ответ, потому что он не учитывает версионные объекты.
— 3h4x

2

Если вы используете AWS CLI в Windows, вы можете использовать Measure-Objectиз PowerShell для получения общего количества файлов, как wc -lв * nix.

PS C:\> aws s3 ls s3://mybucket/ --recursive | Measure-Object

Count    : 25
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

Надеюсь, поможет.


2

Один из самых простых способов подсчитать количество объектов в s3:

Шаг 1. Выберите корневую папку. Шаг 2. Нажмите «Действия» -> «Удалить» (очевидно, будьте осторожны, не удаляйте ее). Шаг 3. Подождите несколько минут. AWS покажет вам количество объектов и их общий размер.

UpVote, если вы найдете решение.


1

Ни один из API не даст вам счет, потому что на самом деле не существует специального API Amazon для этого. Вы просто должны запустить список содержимого и подсчитать количество результатов, которые возвращаются.


По некоторым причинам, ruby ​​libs (right_aws / appoxy_aws) не будет перечислять больше, чем первые 1000 объектов в корзине. Есть ли другие, которые будут перечислять все объекты?
— поля

Когда вы запрашиваете список, они предоставляют поле «NextToken», которое вы можете использовать для повторной отправки запроса с токеном, и оно будет перечислять больше.
— Митч Демпси

1

Из командной строки в AWS CLI используйте ls plus --summarize. Это даст вам список всех ваших предметов и общее количество документов в конкретном ведре. Я не пробовал это с ведрами, содержащими вложенные ведра:

aws s3 ls "s3://MyBucket" --summarize

Это займет немного времени (заняло перечисление моих 16 + K документов за 4 минуты), но это быстрее, чем подсчет 1K за раз.



0

3Hub прекращен. Есть лучшее решение: вы можете использовать Transmit (только для Mac), а затем просто подключиться к своему ведру и выбрать Show Item Countиз Viewменю.


Передача, к сожалению, показывает только до 1000 элементов (и поэтому количество элементов также максимально на 1000)
— Tino

0

Вы можете скачать и установить браузер s3 с http://s3browser.com/ . Когда вы выбираете корзину в центральном правом углу, вы можете увидеть количество файлов в корзине. Но размер, который он показывает, неверен в текущей версии.

Gubs


0

Самый простой способ - использовать консоль разработчика, например, если вы используете Chrome, выберите «Инструменты разработчика», и вы увидите следующее, вы можете либо найти и сосчитать, либо выполнить какое-то совпадение, например 280-279 + 1 = 2

...


Не могли бы вы добавить более подробную информацию о том, как вы использовали инструменты разработчика, чтобы выяснить общее количество объектов в корзине.
— Джугал Панчал

0

Вы можете использовать инвентарь Amazon S3, который предоставит вам список объектов в CSV-файле.




0

Вы можете просто выполнить эту команду cli, чтобы получить общее количество файлов в корзине или определенной папке

Сканирование всего ведра

aws s3api list-objects-v2 --bucket testbucket | grep "Key" | wc -l
aws s3api list-objects-v2 --bucket BUCKET_NAME | grep "Key" | wc -l

Вы можете использовать эту команду, чтобы получить подробную информацию

aws s3api list-objects-v2 --bucket BUCKET_NAME

Сканирование определенной папки

aws s3api list-objects-v2 --bucket testbucket --prefix testfolder --start-after testfolder/ | grep "Key" | wc -l

aws s3api list-objects-v2 --bucket BUCKET_NAME --prefix FOLDER_NAME --start-after FOLDER_NAME/ | grep "Key" | wc -l

0

Если вы ищете конкретные файлы, скажем, .jpgизображения, вы можете сделать следующее:

aws s3 ls s3://your_bucket | grep jpg | wc -l

0

Ниже описано, как вы можете сделать это с помощью Java-клиента.

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.11.519</version>
</dependency>
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ObjectListing;

public class AmazonS3Service {

    private static final String S3_ACCESS_KEY_ID = "ACCESS_KEY";
    private static final String S3_SECRET_KEY = "SECRET_KEY";
    private static final String S3_ENDPOINT = "S3_URL";

    private AmazonS3 amazonS3;

    public AmazonS3Service() {
        ClientConfiguration clientConfiguration = new ClientConfiguration();
        clientConfiguration.setProtocol(Protocol.HTTPS);
        clientConfiguration.setSignerOverride("S3SignerType");
        BasicAWSCredentials credentials = new BasicAWSCredentials(S3_ACCESS_KEY_ID, S3_SECRET_KEY);
        AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);
        AmazonS3ClientBuilder.EndpointConfiguration endpointConfiguration = new AmazonS3ClientBuilder.EndpointConfiguration(S3_ENDPOINT, null);
        amazonS3 = AmazonS3ClientBuilder.standard().withCredentials(credentialsProvider).withClientConfiguration(clientConfiguration)
                .withPathStyleAccessEnabled(true).withEndpointConfiguration(endpointConfiguration).build();
    }

    public int countObjects(String bucketName) {
        int count = 0;
        ObjectListing objectListing = amazonS3.listObjects(bucketName);
        int currentBatchCount = objectListing.getObjectSummaries().size();
        while (currentBatchCount != 0) {
            count += currentBatchCount;
            objectListing = amazonS3.listNextBatchOfObjects(objectListing);
            currentBatchCount = objectListing.getObjectSummaries().size();
        }
        return count;
    }
}

0

Вот версия boto3 скрипта Python, встроенного выше.

import sys
import boto3

s3 = boto3.resource('s3')
s3bucket = s3.Bucket(sys.argv[1])
size = 0
totalCount = 0

for key in s3bucket.objects.all():
    totalCount += 1
    size += key.size

print('total size:')
print("%.3f GB" % (size*1.0/1024/1024/1024))
print('total count:')
print(totalCount)`

0

aws s3 ls s3: // имя-корзины / префикс-папки-если-любой --recursive | туалет


Он работает для более чем 1000, он насчитал 4258 для меня
— KingAndrew

Строки не соответствуют количеству файлов. Потому что у них также есть целая строка только для даты и каталога.
— CMCDragonkai

Команда работает для ограниченного числа файлов. В моем случае количество файлов превышает миллион, и это никогда не дает никакого результата. Но это хороший вариант для ограниченных файлов.
— Джугал Панчал
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.