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?
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?
Respostas:
De jeito nenhum, a menos que você
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
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.
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
Você pode consultar a seção métrica do cloudwatch para obter um número aproximado de objetos armazenados.
Tenho aproximadamente 50 milhões de produtos e demorou mais de uma hora para contar usando aws s3 ls
aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
Há uma --summarize
opçã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
Total Objects: 7235
Total Size: 475566411749
- tão fácil.
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":
Que fornece o seguinte:
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
-r
comando no é para --recursive
, portanto, ele deve funcionar para subpastas também.
aws s3 ls
vez 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.
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[])]"
Illegal token value '(Contents[])]'
(versão 1.2.9 do aws-cli), quando apenas usando --bucket my-bucket
e A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist
ao usar --bucket s3://my-bucket
. (Ele definitivamente existe, e tem 1000 arquivos.)
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.
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
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.
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
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.
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
No s3cmd, basta executar o seguinte comando (em um sistema Ubuntu):
s3cmd ls -r s3://mybucket | wc -l
Se você estiver usando a AWS CLI no Windows, poderá usar o Measure-Object
PowerShell para obter a contagem total de arquivos, assim como wc -l
no * nix.
PS C:\> aws s3 ls s3://mybucket/ --recursive | Measure-Object
Count : 25
Average :
Sum :
Maximum :
Minimum :
Property :
Espero que ajude.
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.
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.
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.
Que tal a análise da classe de armazenamento S3 - Você obtém APIs e também no console - https://docs.aws.amazon.com/AmazonS3/latest/dev/analytics-storage-class.html
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
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
...
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
Também pode ser feito com gsutil du
(Sim, uma ferramenta do Google Cloud)
gsutil du s3://mybucket/ | wc -l
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
Se você estiver procurando por arquivos específicos, digamos .jpg
imagens, faça o seguinte:
aws s3 ls s3://your_bucket | grep jpg | wc -l
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;
}
}
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)`
aws s3 ls s3: // nome do bloco / prefixo da pasta, se houver algum --recursive | wc -l