Como posso obter o tamanho de um bucket do Amazon S3?

255

Gostaria de representar graficamente o tamanho (em bytes e # de itens) de um bucket do Amazon S3 e estou procurando uma maneira eficiente de obter os dados.

As ferramentas s3cmd fornecem uma maneira de obter o tamanho total do arquivo usando s3cmd du s3://bucket_name , mas estou preocupado com sua capacidade de dimensionar já que parece que busca dados sobre cada arquivo e calcula sua própria soma. Como a Amazon cobra usuários em GB-Meses, parece estranho que eles não exponham esse valor diretamente.

Embora a API REST da Amazon retorne o número de itens em um intervalo, s3cmd não parece expor isso. Eu poderia fazer s3cmd ls -r s3://bucket_name | wc -l mas isso parece um hack.

A biblioteca AWS :: S3 do Ruby parecia promissora, mas fornece apenas o número de itens do intervalo, não o tamanho total do intervalo.

Alguém tem conhecimento de outras ferramentas ou bibliotecas de linha de comando (como Perl, PHP, Python ou Ruby) que fornecem maneiras de obter esses dados?

    
por Garret Heaton 15.11.2009 / 01:40

25 respostas

150

O AWS CLI agora suporta o parâmetro --query , que usa expressões JMespath .

Isso significa que você pode somar os valores de tamanho fornecidos por list-objects usando sum(Contents[].Size) e contar como length(Contents[]) .

Isso pode ser executado usando o AWS CLI oficial conforme descrito abaixo e foi introduzido em fevereiro de 2014

 aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]"
    
por 17.11.2014 / 00:00
259

Isso agora pode ser feito trivialmente apenas com o cliente oficial da linha de comando da AWS:

aws s3 ls --summarize --human-readable --recursive s3://bucket-name/

Documentação oficial

Isso também aceita prefixos de caminho se você não quiser contar o intervalo inteiro:

aws s3 ls --summarize --human-readable --recursive s3://bucket-name/directory
    
por 09.09.2015 / 16:04
106

Console da AWS:

A partir de 28 de julho de 2015 você pode obter essas informações via CloudWatch . Se você quiser uma GUI, acesse o console do CloudWatch : (Escolha a Região >) Métricas > S3

Comando da AWS CLI:

Isso é muito mais rápido do que alguns dos outros comandos postados aqui, já que ele não consulta o tamanho de cada arquivo individualmente para calcular a soma.

 aws cloudwatch get-metric-statistics --namespace AWS/S3 --start-time 2015-07-15T10:00:00 --end-time 2015-07-31T01:00:00 --period 86400 --statistics Average --region eu-west-1 --metric-name BucketSizeBytes --dimensions Name=BucketName,Value=toukakoukan.com Name=StorageType,Value=StandardStorage

Importante : você deve especificar StorageType e BucketName no argumento de dimensões, caso contrário, você não obterá resultados. Tudo o que você precisa alterar é o --start-date , --end-time e Value=toukakoukan.com .

Aqui está um script bash que você pode usar para evitar ter que especificar --start-date e --end-time manualmente.

#!/bin/bash
bucket=$1
region=$2
now=$(date +%s)
aws cloudwatch get-metric-statistics --namespace AWS/S3 --start-time "$(echo "$now - 86400" | bc)" --end-time "$now" --period 86400 --statistics Average --region $region --metric-name BucketSizeBytes --dimensions Name=BucketName,Value="$bucket" Name=StorageType,Value=StandardStorage
    
por 31.07.2015 / 23:58
103

s3cmd pode fazer isso:

s3cmd du s3://bucket-name

    
por 08.07.2011 / 15:40
22

Se você fizer o download de um relatório de uso , você pode representar graficamente os valores diários para o campo TimedStorage-ByteHrs .

Se você quiser esse número em GiB, basta dividir por 1024 * 1024 * 1024 * 24 (isso é GiB-horas para um ciclo de 24 horas). Se você quiser o número em bytes, basta dividir por 24 e gráfico de distância.

    
por 05.12.2012 / 18:22
18

Usando as ferramentas oficiais de linha de comando do AWS s3:

aws s3 ls s3://bucket/folder --recursive | awk 'BEGIN {total=0}{total+=$3}END{print total/1024/1024" MB"}'
    
por 23.04.2015 / 13:22
10

s4cmd é o caminho mais rápido que encontrei (um utilitário de linha de comando escrito em Python):

pip install s4cmd

Agora, calcule o tamanho total do depósito usando vários tópicos:

s4cmd du -r s3://bucket-name
    
por 01.04.2015 / 00:12
6

Eu usei a S3 REST / Curl API listado anteriormente neste tópico e fez isso:

<?php
if (!class_exists('S3')) require_once 'S3.php';

// Instantiate the class
$s3 = new S3('accessKeyId', 'secretAccessKey');
S3::$useSSL = false;

// List your buckets:
echo "S3::listBuckets(): ";
echo '<pre>' . print_r($s3->listBuckets(), 1). '</pre>';

$totalSize = 0;
$objects = $s3->getBucket('name-of-your-bucket');
foreach ($objects as $name => $val) {
    // If you want to get the size of a particular directory, you can do
    // only that.
    // if (strpos($name, 'directory/sub-directory') !== false)
    $totalSize += $val['size'];
}

echo ($totalSize / 1024 / 1024 / 1024) . ' GB';
?>
    
por 12.12.2010 / 20:05
4

Então, navegando pela API e executando algumas mesmas consultas, o S3 produzirá todo o conteúdo de um bucket em uma solicitação e não precisará descer em diretórios. Os resultados, então, exigem apenas a soma dos vários elementos XML, e não as chamadas repetidas. Não tenho um intervalo de amostra com milhares de itens, por isso não sei até que ponto ele será dimensionado, mas parece razoavelmente simples.

    
por 15.11.2009 / 05:00
4

... Um pouco atrasado, mas a melhor maneira que encontrei foi usando os relatórios no portal da AWS. Eu fiz uma aula PHP para baixar e analisar os relatórios. Com ele você pode obter o número total de objetos para cada bloco, o tamanho total em GB ou byte e muito mais.

Confira e me informe se foi útil

AmazonTools

    
por 20.12.2009 / 23:56
4

Você pode usar o utilitário s3cmd, por exemplo:

s3cmd du -H s3://Mybucket
97G      s3://Mybucket/
    
por 09.03.2015 / 16:43
3

Eu recomendo usar o Relatório de uso do S3 para grandes blocos , consulte meu Como sobre como obtê-lo Basicamente, você precisa fazer o download do Relatório de Uso para o serviço S3 no último dia com o Armazenamento Temporizado - Byte Hrs e analisá-lo para obter o uso do disco.

cat report.csv | awk -F, '{printf "%.2f GB %s %s \n", $7/(1024**3 )/24, $4, $2}' | sort -n
    
por 29.04.2015 / 00:17
2

Para uma abordagem realmente de baixa tecnologia: use um cliente S3 que possa calcular o tamanho para você. Estou usando o Panic's Transmit, clique em um bucket, faça "Get Info" e clique no botão "Calculate". Eu não tenho certeza de quão rápido ou preciso ele é em relação a outros métodos, mas ele parece devolver o tamanho que eu esperava que fosse.

    
por 29.07.2015 / 13:56
2

A documentação da AWS informa como fazer isso:

aws s3 ls s3://bucketnanme --recursive --human-readable --summarize

Esta é a saída que você recebe:

2016-05-17 00:28:14    0 Bytes folder/
2016-05-17 00:30:57    4.7 KiB folder/file.jpg
2016-05-17 00:31:00  108.9 KiB folder/file.png
2016-05-17 00:31:03   43.2 KiB folder/file.jpg
2016-05-17 00:31:08  158.6 KiB folder/file.jpg
2016-05-17 00:31:12   70.6 KiB folder/file.png
2016-05-17 00:43:50   64.1 KiB folder/folder/folder/folder/file.jpg

Total Objects: 7

   Total Size: 450.1 KiB
    
por 18.05.2016 / 06:42
2

Desde que há tantas respostas, eu imaginei que eu colocaria com o meu próprio. Eu escrevi minha implementação em C # usando o LINQPad. Copie, cole e insira a chave de acesso, a chave secreta, o ponto de extremidade da região e o nome do bloco que você deseja consultar. Além disso, certifique-se de adicionar o pacote nuget AWSSDK.

Teste contra um dos meus buckets, isso me deu uma contagem de 128075 e um tamanho de 70,6 GB. Eu sei que é 99,9999% exato, então eu estou bem com o resultado.

void Main() {
    var s3Client = new AmazonS3Client("accessKey", "secretKey", RegionEndpoint.???);
    var stop = false;
    var objectsCount = 0;
    var objectsSize = 0L;
    var nextMarker = string.Empty;

    while (!stop) {
        var response = s3Client.ListObjects(new ListObjectsRequest {
            BucketName = "",
            Marker = nextMarker
        });

        objectsCount += response.S3Objects.Count;
        objectsSize += response.S3Objects.Sum(
            o =>
                o.Size);
        nextMarker = response.NextMarker;
        stop = response.S3Objects.Count < 1000;
    }

    new {
        Count = objectsCount,
        Size = objectsSize.BytesToString()
    }.Dump();
}

static class Int64Extensions {
    public static string BytesToString(
        this long byteCount) {
        if (byteCount == 0) {
            return "0B";
        }

        var suffix = new string[] { "B", "KB", "MB", "GB", "TB", "PB", "EB" };
        var longBytes = Math.Abs(byteCount);
        var place = Convert.ToInt32(Math.Floor(Math.Log(longBytes, 1024)));
        var number = Math.Round(longBytes / Math.Pow(1024, place), 1);

        return string.Format("{0}{1}", Math.Sign(byteCount) * number, suffix[place]);
    }
}
    
por 01.07.2016 / 19:36
1

Eu sei que esta é uma pergunta mais antiga, mas aqui está um exemplo do PowerShell:

Get-S3Object -BucketName <buckename> | select key, size | foreach {$A += $_.size}

$A contém o tamanho do intervalo e existe um parâmetro keyname se você quiser apenas o tamanho de uma pasta específica em um intervalo.

    
por 23.04.2015 / 13:57
1

Para verificar todos os tamanhos de blocos, tente este script bash

s3list='aws s3 ls | awk  '{print $3}''
for s3dir in $s3list
do
    echo $s3dir
    aws s3 ls "s3://$s3dir"  --recursive --human-readable --summarize | grep "Total Size"
done
    
por 05.07.2016 / 21:24
1

Você pode usar s3cmd :

s3cmd du s3://Mybucket -H

ou

s3cmd du s3://Mybucket --human-readable

Fornece o total de objetos e o tamanho do bucket de uma forma muito legível.

    
por 21.07.2016 / 07:13
0

Olá, existe uma ferramenta de pesquisa de metadados para o AWS S3 no link .Esta ferramenta fornece dados estatísticos sobre objetos em um intervalo com pesquisa nos metadados.

    
por 20.06.2013 / 20:08
0

Além disso, as Ferramentas Hanzo S3 fazem isso. Depois de instalado, você pode fazer:

s3ls -s -H bucketname

Mas acredito que isso também seja somado no lado do cliente e não recuperado por meio da API da AWS.

    
por 16.07.2012 / 19:50
0

Pelo programa Cloudberry também é possível listar o tamanho do repositório, a quantidade de pastas e o total de arquivos, clicando em "propriedades" à direita no topo do balde.

    
por 10.12.2013 / 20:27
0

Se você não quiser usar a linha de comando, no Windows e no OSX, há um aplicativo de gerenciamento de arquivos remoto de uso geral chamado Cyberduck . Entre no S3 com o seu par de chaves de acesso / segredo, clique com o botão direito no diretório, clique em Calculate .

    
por 25.04.2015 / 08:06
0

Eu escrevi um script Bash, s3-du.sh, que lista os arquivos no bucket com s3ls e imprime a contagem de arquivos e tamanhos como

s3-du.sh testbucket.jonzobrist.com
149 files in bucket testbucket.jonzobrist.com
11760850920 B
11485205 KB
11216 MB
10 GB

Script completo:

#!/bin/bash

if [ “${1}” ]
then
NUM=0
COUNT=0
for N in 's3ls ${1} | awk ‘{print $11}’ | grep [0-9]'
do
NUM='expr $NUM + $N'
((COUNT++))
done
KB='expr ${NUM} / 1024'
MB='expr ${NUM} / 1048576'
GB='expr ${NUM} / 1073741824'
echo “${COUNT} files in bucket ${1}”
echo “${NUM} B”
echo “${KB} KB”
echo “${MB} MB”
echo “${GB} GB”
else
echo “Usage : ${0} s3-bucket”
exit 1
fi    

Ele faz o tamanho do subdiretório, já que a Amazon retorna o nome do diretório e o tamanho de todo o seu conteúdo.

    
por 19.04.2012 / 18:35
-1

O caminho a seguir usa o AWS PHP SDK para obter o tamanho total do intervalo.

// make sure that you are using correct region (where the bucket is) to get new Amazon S3 client
$client = \Aws\S3\S3Client::factory(array('region' => $region));

// check if bucket exists
if (!$client->doesBucketExist($bucket, $accept403 = true)) {
    return false;
}
// get bucket objects
$objects = $client->getBucket(array('Bucket' => $bucket));

$total_size_bytes = 0;
$contents = $objects['Contents'];

// iterate through all contents to get total size
foreach ($contents as $key => $value) {
   $total_bytes += $value['Size'];
}
$total_size_gb = $total_size_bytes / 1024 / 1024 / 1024;
    
por 06.04.2015 / 23:44
-1

Isso funciona para mim ..

aws s3 ls s3://bucket/folder/ --recursive | awk '{sz+=$3} END {print sz/1024/1024 "MB"}'
    
por 14.04.2016 / 21:50