Como posso saber quantos objetos eu armazenei em um bucket S3?

154

A menos que esteja faltando alguma coisa, parece que nenhuma das APIs que eu analisei informará quantos objetos estão em um bucket / pasta S3 (prefixo). Existe alguma maneira de obter uma contagem?

Campos
fonte
Esta pergunta pode ser útil: stackoverflow.com/questions/701545/…
Brendan Long
1
A solução existe agora em 2015: stackoverflow.com/a/32908591/578989 #
Mayank Jaiswal
Veja minha resposta abaixo: stackoverflow.com/a/39111698/996926
advncd
2017 Resposta: stackoverflow.com/a/42927268/4875295
cameck

Respostas:

39

De jeito nenhum, a menos que você

  1. liste todos eles em lotes de 1.000 (que podem ser lentos e sugam a largura de banda - a Amazon parece nunca compactar as respostas XML) ou

  2. faça login na sua conta no S3 e acesse Conta - Uso. Parece que o departamento de cobrança sabe exatamente quantos objetos você armazenou!

Simplesmente fazer o download da lista de todos os seus objetos levará algum tempo e custará algum dinheiro se você tiver 50 milhões de objetos armazenados.

Consulte também este tópico sobre StorageObjectCount - que está nos dados de uso.

Uma API S3 para obter pelo menos o básico, mesmo que tivesse horas, seria ótima.

Tom Andersen
fonte
Esse link está morto, a propósito.
fields
Se você é preguiçoso como eu, o Newvem basicamente faz isso em seu nome e agrega / controla os resultados em um nível por bloco na sua conta S3.
Rcoup #
2
Você poderia atualizar sua resposta para incluir a resposta de @ MayankJaiswal?
Joseph Casey
1
o departamento de cobrança sabe tudo! Não admira que eles têm o poder de derrubar s3 costa leste por acidente
ski_squaw
256

Usando a AWS CLI

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

ou

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

Nota: O comando cloudwatch acima parece funcionar por alguns enquanto não para outros. Discutido aqui: https://forums.aws.amazon.com/thread.jspa?threadID=217050

Usando o AWS Web Console

Você pode consultar a seção métrica do cloudwatch para obter um número aproximado de objetos armazenados. insira a descrição da imagem aqui

Tenho aproximadamente 50 milhões de produtos e demorou mais de uma hora para contar usando aws s3 ls

Mayank Jaiswal
fonte
18
Isso deve estar mais perto do topo.
Joseph Casey
3
@JosephMCasey Eu concordo. Isso também funciona para dar o número de objetos em um diretório com um balde assim:aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
Tim Peterson
1
Dá esse erro quando executei o acima no prompt do cmd - 'wc' não é reconhecido como um comando interno ou externo, programa operável ou arquivo em lote. - Eu sou muito novo nisso, então alguém pode dar uma solução?
Sandun
Um aviso de que o CloudWatch não parece muito confiável. Eu tenho um arquivo mp4 em um bucket que o CloudWatch (métrica NumberOfObjects) conta como 2.300 objetos separados. Eu obtive o número correto com o AWS CLI.
AlexK
Por que "Média"? Alguém não iria querer "Sum"?
Ffxsam 28/10/19
150

Há uma --summarizeopção que inclui informações de resumo do bucket (ou seja, número de objetos, tamanho total).

Aqui está a resposta correta usando o AWS cli:

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

Total Objects: 194273

Veja a documentação

advncd
fonte
4
Isso é ótimo: Total Objects: 7235 Total Size: 475566411749- tão fácil.
bonh
16
Ainda tem a maior sobrecarga de listar os milhares de objetos, infelizmente (atualmente com mais de 600.000, portanto isso consome muito tempo) #
019 MichaelChirico
quanto custará para executar esta tarefa no bucket com objetos de 5 milhões?
Psicozóico 31/01/19
2
Essa resposta é extremamente ineficiente, potencialmente muito lenta e cara. Ele percorre todo o balde para encontrar a resposta.
tecelão
2
E devo acrescentar, que iterando mais de 1,2 bilhão de objetos armazenados no armazenamento padrão, pode custar cerca de US $ 6000.
C Johnson
66

Embora essa seja uma pergunta antiga e o feedback tenha sido fornecido em 2015, no momento é muito mais simples, pois o S3 Web Console ativou a opção "Obter tamanho":

insira a descrição da imagem aqui

Que fornece o seguinte:

insira a descrição da imagem aqui

gvasquez
fonte
1
Sim, o novo Console da AWS, embora ofenda meus olhos, disponibiliza o número calculado de objetos e o tamanho total com o clique de um botão.
Ani
11
Isso parece funcionar apenas no nível da pasta. "Obter tamanho" não está disponível no nível do balde
G-.
1
@ G-. E se você selecionar todas as pastas do balde?
gvasquez
4
@ G-. No entanto, a caixa "selecionar tudo" seleciona apenas as pastas e objetos que são mostrados na página, nem todas as pastas / objetos do balde.
precisa saber é
2
@gparis good point. Vale a pena notar. Obrigado. Portanto, parece que no console não temos uma opção se houver mais arquivos ou pastas do que podem ser exibidos em uma única página
G-.
50

Se você usar a ferramenta de linha de comando s3cmd , poderá obter uma lista recursiva de um determinado balde, enviando-o para um arquivo de texto.

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

Então, no linux, você pode executar um wc -l no arquivo para contar as linhas (1 linha por objeto).

wc -l listing.txt
Jim Murphy
fonte
O -rcomando no é para --recursive, portanto, ele deve funcionar para subpastas também.
Deepak Joy
3 notas sobre isso. a.) você deve usar em aws s3 lsvez do s3cmd porque é mais rápido. b.) Para baldes grandes, pode demorar muito tempo. Demorou cerca de 5 minutos para arquivos de 1mil. c.) Veja minha resposta abaixo sobre o uso do cloudwatch.
mastaBlasta
46

Agora, existe uma solução fácil com a API S3 (disponível no AWS CLI):

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

ou para uma pasta específica:

aws s3api list-objects --bucket BUCKETNAME --prefix "folder/subfolder/" --output json --query "[length(Contents[])]"
Rafael
fonte
1
Raphael, sua consulta de pasta funciona muito bem, exceto quando a pasta está vazia ou não existe, então você obtém: No tamanho da função (), tipo inválido para o valor: Nenhum, esperado um de: ['string', 'array' , 'objeto'], recebido: "nulo" Existe uma maneira de obter a saída 0 apenas se a pasta estiver vazia ou não sair?
user3591836
1
Recebo Illegal token value '(Contents[])]' (versão 1.2.9 do aws-cli), quando apenas usando --bucket my-buckete A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not existao usar --bucket s3://my-bucket. (Ele definitivamente existe, e tem 1000 arquivos.)
Darren Cozinhe
@DarrenCook remove s3: // do nome do bloco. O cliente parece não suportar o protocolo.
Sriranjan Manjunath 30/03
Isso é muito mais rápido que os exemplos wc -l. Com meus baldes, contaria aproximadamente 3-4k objetos / s. Então, ~ 5 minutos por milhão de objetos. "Obter tamanho" na GUI da web do S3 provavelmente usa algo semelhante sob o capô, pois leva aproximadamente o mesmo tempo.
Notpeter 20/05
Por muito grandes baldes, esta foi a única solução que funcionou para mim dentro de um prazo razoável a partir de (menos de 20 minutos)
Nick Sarafa
40

Você pode usar as métricas do AWS cloudwatch para s3 para ver a contagem exata de cada bloco. métrica do cloudwatch quando você seleciona o bucket

mastaBlasta
fonte
Eu acho que essa é a melhor resposta
Oktav
A única resposta real, sem fazer algo ridículo como listar 1m + teclas. Eu esqueci que estava lá.
Andrew Backer
Isso precisa de mais votos. Todas as outras soluções têm uma escala ruim em termos de custo e tempo.
Aaron R.
5

Acesse Faturamento da AWS, relatórios e depois Relatórios de uso da AWS. Selecione Amazon Simple Storage Service e, em seguida, Operação StandardStorage. Em seguida, você pode baixar um arquivo CSV que inclui um UsageType of StorageObjectCount que lista a contagem de itens para cada bloco.

Kenan
fonte
4

Você pode obter facilmente a contagem total e o histórico se for para a guia "Gerenciamento" do console s3 e clicar em "Métricas" ... Captura de tela da guia

Tilan Ukwatta
fonte
você pode atualizar a imagem para mostrar o NumberOfObjects (count/day)gráfico? Seria melhor, pois está diretamente relacionado à questão. Na sua captura de tela, você está mostrando o BucketSizeBytes (bytes/day)que, embora útil, não está diretamente relacionado ao problema.
Guzmonne
1
A partir de 2019, agora essa deve ser a resposta aceita. Todo o resto está desatualizado ou lento.
C Johnson
2

A API retornará a lista em incrementos de 1000. Verifique a propriedade IsTruncated para ver se ainda há mais. Se houver, é necessário fazer outra chamada e passar a última chave que você obteve como propriedade Marcador na próxima chamada. Você continuaria a fazer um loop assim até IsTruncated ser falso.

Consulte este documento da Amazon para obter mais informações: Iterando através de resultados de várias páginas

BigJoe714
fonte
2

Segmento antigo, mas ainda relevante, pois eu estava procurando a resposta até descobrir isso. Eu queria uma contagem de arquivos usando uma ferramenta baseada em GUI (ou seja, sem código). Eu já uso uma ferramenta chamada 3Hub para arrastar e soltar transferências de e para o S3. Eu queria saber quantos arquivos eu tinha em um determinado balde (não acho que o faturamento divida em baldes).

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  

Eu tinha 20521 arquivos no balde e fiz a contagem em menos de um minuto.

Darby
fonte
2

Eu usei o script python do scalablelogic.com (adicionando o log de contagem). Trabalhou muito bem.

#!/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
fonte
Só para você saber, isso não funciona com o boto3. Contribuí com uma sugestão abaixo como resposta diferente.
Fuzzygroup 24/10/19
2

No s3cmd, basta executar o seguinte comando (em um sistema Ubuntu):

s3cmd ls -r s3://mybucket | wc -l
mjsa
fonte
13
Por que você ressuscitou uma pergunta de 5 anos para postar uma cópia mal formatada de uma resposta existente ?
Alquimista de dois bits
A resposta anterior canalizou a saída em um arquivo txt desnecessariamente.
Mjsa
10
IMO este deve ser um comentário sobre essa resposta, então. Essa é uma diferença realmente trivial.
Alquimista de dois bits
2
Parece uma resposta digna, especialmente porque a resposta selecionada para esta pergunta começa com 'Não há como ...' e @mjsa forneceu uma resposta em uma linha.
Nan
Essa não é uma boa resposta, pois não leva em consideração os objetos com versão.
3h4x 17/04/19
2

Se você estiver usando a AWS CLI no Windows, poderá usar o Measure-ObjectPowerShell para obter a contagem total de arquivos, assim como wc -lno * nix.

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

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

Espero que ajude.

pdm
fonte
2

Uma das maneiras mais simples de contar o número de objetos no s3 é:

Etapa 1: Selecione a pasta raiz Etapa 2: Clique em Ações -> Excluir (Obviamente, tenha cuidado para não excluí-la) Etapa 3: Aguarde alguns minutos, o aws mostrará o número de objetos e seu tamanho total.

UpVote se você encontrar a solução.

rohitcoder
fonte
1

Nenhuma das APIs fornecerá uma contagem, porque realmente não existe uma API específica da Amazon para fazer isso. Você precisa apenas executar um conteúdo da lista e contar o número de resultados retornados.

Mitch Dempsey
fonte
Por alguma razão, as bibliotecas ruby ​​(right_aws / appoxy_aws) não listarão mais que os primeiros 1000 objetos em um bucket. Existem outros que listarão todos os objetos?
fields
Quando você solicita a lista, eles fornecem um campo "NextToken", que você pode usar para enviar a solicitação novamente com o token e listará mais.
Mitch Dempsey
1

Na linha de comando da AWS CLI, use ls plus --summarize . Ele fornecerá a lista de todos os seus itens e o número total de documentos em um determinado balde. Eu não tentei isso com baldes contendo sub-baldes:

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

Demora um pouco (demorou a listar meus documentos 16 + K em cerca de 4 minutos), mas é mais rápido do que contar 1K de cada vez.

Ricardo
fonte
0

3Hub foi descontinuado. Existe uma solução melhor, você pode usar o Transmit (somente Mac), basta conectar-se ao seu balde e escolher Show Item Countno Viewmenu.

arielcr
fonte
Transmit infelizmente só mostra até 1000 itens (ea Contagem de itens, portanto, também está no limite em 1000)
Tino
0

Você pode baixar e instalar o navegador s3 em http://s3browser.com/ . Quando você seleciona um balde no canto central direito, pode ver o número de arquivos no balde. Mas, o tamanho exibido está incorreto na versão atual.

Gubs

gubs
fonte
0

A maneira mais fácil é usar o console do desenvolvedor, por exemplo, se você estiver no chrome, escolha Ferramentas do desenvolvedor e poderá ver a seguir, você pode encontrar e contar ou fazer alguma correspondência, como 280-279 + 1 = 2

...

zeroc00l
fonte
Você poderia adicionar mais detalhes sobre como você usou as ferramentas do desenvolvedor para descobrir o número total de objetos em um bucket.
Jugal Panchal 19/06
0

Você pode potencialmente usar o inventário do Amazon S3 que fornecerá uma lista de objetos em um arquivo csv

Vivek
fonte
0

Achei a ferramenta do navegador S3 muito usuário, ela fornece arquivos e pastas e a contagem total e o tamanho de qualquer pasta recursivamente

Link para download: https://s3browser.com/download.aspx

Vishal Zanzrukia
fonte
0

Também pode ser feito com gsutil du(Sim, uma ferramenta do Google Cloud)

gsutil du s3://mybucket/ | wc -l
Ghilas BELHADJ
fonte
0

Você pode simplesmente executar este comando cli para obter a contagem total de arquivos no bucket ou em uma pasta específica

Digitalizar balde inteiro

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

você pode usar este comando para obter detalhes

aws s3api list-objects-v2 --bucket BUCKET_NAME

Digitalizar uma pasta específica

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
Indunil Asanka
fonte
0

Se você estiver procurando por arquivos específicos, digamos .jpgimagens, faça o seguinte:

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

A seguir, é possível fazer isso usando o cliente 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;
    }
}
Rakesh
fonte
0

Aqui está a versão boto3 do script python incorporado acima.

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
fonte
0

aws s3 ls s3: // nome do bloco / prefixo da pasta, se houver algum --recursive | wc -l

MayurSatpute
fonte
Ele funciona para mais de 1000, contou 4258 para mim
KingAndrew
As linhas não correspondem diretamente ao número de arquivos. Porque eles também têm uma linha inteira apenas para a data e o diretório.
CMCDragonkai
O comando funciona para um número limitado de arquivos. No meu caso, a contagem de arquivos é superior a um milhão e nunca dá resultado. Mas é uma boa opção para arquivos limitados.
Jugal Panchal 19/06