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

155

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

поля
источник
Этот вопрос может быть полезен: stackoverflow.com/questions/701545/…
Брендан Лонг
1
Решение существует в 2015 году: stackoverflow.com/a/32908591/578989
Mayank Jaiswal
Смотрите мой ответ ниже: stackoverflow.com/a/39111698/996926
advncd
Ответ 2017: stackoverflow.com/a/42927268/4875295
Камек

Ответы:

40

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

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

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

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

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

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

Том Андерсен
источник
Кстати, эта ссылка мертва.
поля
Извините: developer.amazonwebservices.com/connect/…
Том Андерсен
Если вы ленивы, как я, 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

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

advncd
источник
4
Это здорово: Total Objects: 7235 Total Size: 475566411749так легко.
Бон
16
К сожалению, все еще есть основные накладные расходы по перечислению тысяч объектов (в настоящее время их более 600 000, так что это довольно много времени)
MichaelChirico
сколько будет стоить выполнение этой задачи на корзине с 5М объектами?
Психозой
2
Этот ответ крайне неэффективен, потенциально очень медленный и дорогостоящий. Он перебирает все ведро, чтобы найти ответ.
ткач
3
И могу добавить, что итерация более 1,2 миллиарда объектов, хранящихся в стандартном хранилище, может стоить около 6000 долларов.
C Джонсон
66

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

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

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

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

gvasquez
источник
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 при выборе корзины

mastaBlasta
источник
Я думаю, что это лучший ответ
Октав
Единственный реальный ответ, не делая ничего смешного, как перечисление 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 для получения дополнительной информации: итерация по многостраничным результатам

BigJoe714
источник
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
Tayler
источник
Просто чтобы вы знали, это не работает с boto3. Я внес предложение ниже в качестве другого ответа.
fuzzygroup
2

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

s3cmd ls -r s3://mybucket | wc -l
MJSA
источник
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, если вы найдете решение.

rohitcoder
источник
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меню.

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

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

Gubs

gubs
источник
0

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

...

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

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

Вивек
источник
0

Я нашел инструмент браузера S3 очень удобным, он предоставляет файлы и папки, а также общее количество и размер для любой папки.

Ссылка для скачивания: https://s3browser.com/download.aspx

Вишал Занзрукия
источник
0

Это также можно сделать с помощью gsutil du(да, инструмент Google Cloud)

gsutil du s3://mybucket/ | wc -l
Гилас БЕЛХАДЖ
источник
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
tsveti_iko
источник
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)`
fuzzygroup
источник
0

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

MayurSatpute
источник
Он работает для более чем 1000, он насчитал 4258 для меня
KingAndrew
Строки не соответствуют количеству файлов. Потому что у них также есть целая строка только для даты и каталога.
CMCDragonkai
Команда работает для ограниченного числа файлов. В моем случае количество файлов превышает миллион, и это никогда не дает никакого результата. Но это хороший вариант для ограниченных файлов.
Джугал Панчал