Amazon S3 버킷의 크기를 어떻게 얻을 수 있습니까?


289

Amazon S3 버킷의 크기 (바이트 및 항목 수)를 그래프로 표시하고 데이터를 얻는 효율적인 방법을 찾고 있습니다.

s3cmd 도구를 사용하여 전체 파일 크기를 얻을 수있는 방법을 제공 s3cmd du s3://bucket_name하지만, 나는 모든 파일에 대한 데이터를 가져 와서 자신의 합계를 계산 것 같습니다 이후 확장 할 수있는 능력에 대한 걱정. Amazon은 GB- 월 단위로 사용자에게 요금을 청구하므로이 값을 직접 노출하지 않는 것이 이상합니다.

Amazon의 REST API 는 버킷에있는 항목 수를 반환 하지만 s3cmd 는이를 표시하지 않는 것 같습니다. 나는 할 수 s3cmd ls -r s3://bucket_name | wc -l있지만 그것은 해킹처럼 보인다.

Ruby AWS :: S3 라이브러리는 유망 해 보였지만 전체 버킷 크기가 아니라 버킷 항목 수만 제공합니다.

누구나이 데이터를 얻는 방법을 제공하는 다른 명령 줄 도구 또는 라이브러리 (Perl, PHP, Python 또는 Ruby 선호)를 알고 있습니까?


나는 버킷 크기를 분석하기위한 도구를 쓴 : github.com/EverythingMe/ncdu-s3을
omribahumi

19
공간에 대한 아마존의 요금에 놀랐지 만 S3 버킷이 차지하는 총 크기를 단순히 S3 패널을 통해 제공하지는 않습니다.
Luke

나에게 아래의 대부분의 답변은 버킷 크기를 검색하는 데 오랜 시간이 걸렸지만이 Python 스크립트는 대부분의 답변보다 빠릅니다 -slsmk.com/getting-the-size-of-an-s-bucket-using -boto3for-aws
Vaulstein

답변:


168

AWS CLI는 이제 JMESPath 표현식 --query을 취하는 매개 변수를 지원합니다 .

이것은 당신에 의해 주어진 크기 값의 합 수 있다는 것을 의미합니다 list-objects사용 sum(Contents[].Size)과 같은 계산을 length(Contents[]).

이것은 아래와 같이 공식 AWS CLI를 사용하여 실행할 수 있으며 2014 년 2 월 에 도입되었습니다.

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

21
큰 버킷 (큰 # 파일)의 경우 속도가 매우 느립니다. 파이썬 유틸리티 s4cmd "du"는 매우 빠릅니다.s4cmd du s3://bucket-name
Brent Faust

이상하다. 버킷의 전체 프로필은 무엇입니까 (얕고 뚱뚱한 / 깊고 얇음)? 것 같습니다 s3cmd과 같은 오버 헤드가 있어야합니다 AWS CLI. 에서 코드가 표시 s3cmd 양동이에 각 디렉토리에 대한 요청을합니다.
Christopher Hackett

22
사람이 읽을 수있는 형식으로 가져 오려면 : aws s3api --profile PROFILE_NAME list-objects --bucket BUCKET_NAME --output json --query "[sum(Contents[].Size), length(Contents[])]" | awk 'NR!=2 {print $0;next} NR==2 {print $0/1024/1024/1024" GB"}'
Sandeep

21
이제 AWS Cloudwatch는 버킷 당 "BucketSizeBytes"지표를 제공하므로 더 이상 올바른 솔루션이 아닙니다. 아래의 Toukakoukan의 답변을 참조하십시오.
cce

2
s4cmd du@Brent Faust에게 감사합니다! -r하위 디렉토리의 크기를 얻으려면 추가 해야하는 작은 메모 (관심있는 사람들 을 위해).
Greg Sadetsky 2016 년

330

이제 공식 AWS 명령 행 클라이언트만으로 간단하게 수행 할 수 있습니다.

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

공식 문서

전체 버킷을 계산하지 않으려는 경우 경로 접두사도 허용합니다.

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

23
이것은 최고의 최신 답변입니다
Tim

2
이것이 가장 좋은 대답입니다.
Luis Artola

24
기본적으로 요약을 표시하기 전에 버킷의 모든 객체를 나열하기 때문에 파일이 많은 버킷의 경우 속도가 매우 느리고 @Christopher Hackett의 답변보다 크게 빠르지 않습니다.이 파일은 훨씬 시끄 럽습니다.
Guss

동일한 버킷 영역이있는 EC2 인스턴스에서 실행하여 지연 시간을 개선하십시오.
juanmirocks

1
디렉토리 트리에있는 모든 개별 파일의 크기가 표시됩니다. 디렉토리의 전체 크기를 원하는 경우 어떻게합니까?
Chris F

130

AWS 콘솔 :

현재 년 7 월 2015 년 28 일 이 정보를 얻을 수 있습니다 CloudWatch를 통해를 . GUI를 원하는 경우 CloudWatch 콘솔 로 이동 하십시오 ((지역 선택>) 지표> S3).

AWS CLI 명령 :

합계를 계산하기 위해 각 파일의 크기를 개별적으로 쿼리하지 않기 때문에 여기에 게시 된 다른 명령보다 훨씬 빠릅니다.

 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

중요 : dimension 인수에 StorageType과 BucketName을 모두 지정해야합니다. 그렇지 않으면 결과가 표시되지 않습니다. 변경 할 필요가있다 --start-date, --end-time하고 Value=toukakoukan.com.


여기에 사용자가 지정하는 것을 방지하기 위해 사용할 수있는 bash는 스크립트의 --start-date--end-time수동은.

#!/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

25
또는 CloudWatch 콘솔에서 : (지역 선택>) 지표> S3
Halil Özgür

3
이것은 지금까지 가장 쉽고 빠른 솔루션입니다. 불행히도 답은 여전히 ​​4 위입니다.
luk2302

이것은 10million + 객체가있는 버킷에서 작동했습니다. 그러나 bash 스크립트는 아무것도 반환하지 않았으며 GUI로 이동해야했습니다).
Petah


Invalid value ('1525354418') for param timestamp:StartTime of type timestamp
Anneb

106

s3cmd 는 다음을 수행 할 수 있습니다.

s3cmd du s3://bucket-name


감사. 몇 가지 타이밍이 있습니다. 약 33GB의 미개척 데이터를 사용하여 약 백만 개의 파일과 약 93000 개의 s3 객체를 사용하는 s3ql 중복 제거 파일 시스템을 보유하는 버킷에서 s3cmd du가 응답을 계산하는 데 약 4 분이 걸렸습니다. 나는 그것이 다른 곳에서 설명한 PHP와 같은 다른 접근법과 어떻게 비교되는지 알고 싶습니다.
nealmcb

1
S3 ListObjects API 호출 이 1000 개의 개체 페이지에서 개체를 반환 하기 때문에 속도가 느립니다 . I / O가 제한 요인이므로 모든 솔루션이 93000 개체보다 상대적으로 느리다고 생각합니다.
David Snabel-Caunt

11
s4cmd 는 S3의 API에 멀티 스레딩 요청을 추가하여 결과를 더 빠르게 계산할 수 있다는 이점과 함께 동일한 작업을 수행 할 수 있습니다. 이 도구는 최근에 업데이트되지 않았지만 인터넷 통행인이 유용 할 수 있습니다.
Nick Chammas

s4cmd는 나를 위해 0을 반환 BotoClientError: Bucket names cannot contain upper-case characters when using either the sub-domain or virtual hosting calling format.하고 대문자가있는 버킷을 반환 합니다.
Lakitu

22

사용 보고서 를 다운로드 하면 TimedStorage-ByteHrs필드 의 일일 값을 그래프로 표시 할 수 있습니다 .

GiB에서 해당 숫자를 원하면 1024 * 1024 * 1024 * 24(24 시간주기의 GiB 시간)으로 나눕니다 . 바이트 단위의 숫자를 원하면 24로 나누고 그래프를 그리십시오.


19

공식 AWS s3 명령 줄 도구 사용 :

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

이것은 더 나은 명령 입니다. --summarize --human-readable --recursive뒤에 다음 3 개의 매개 변수를 추가하십시오 aws s3 ls. --summarize필요하지는 않지만 전체 크기를 멋지게 터치합니다.

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

1
아마존이 실제로 이것을 언급하는 곳의 링크를 제공하십시오. 찾을 수 없습니다.
lobi



4
이 답변은 나에게 가장 빠르고 효과적이었습니다.
Miro

2
가장 빠른 답변!
PlagTag

11

s4cmd는 내가 찾은 가장 빠른 방법입니다 (Python으로 작성된 명령 줄 유틸리티).

pip install s4cmd

이제 여러 스레드를 사용하여 전체 버킷 크기를 계산하려면

s4cmd du -r s3://bucket-name

6
아니요, s4cmd du s3://123123drink단순히 버킷 크기를 반환하지는 않습니다. 버킷의 크기를 얻으려면 다음 -r과 같이 재귀를 추가하십시오 . s4cmd du -r s3 : // 123123drink
George Chalhoub

1
예, 좋은 점 @BukLau ( -r사람들이 S3에서 시뮬레이션 폴더를 사용할 때 혼란을 피하기 위해 위의 예에 추가 ).
브렌트 파우스트

6

이 스레드의 앞부분에 나열된 S3 REST / Curl API를 사용하여 다음을 수행했습니다.

<?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';
?>

6

다음과 같이 s3cmd 유틸리티를 사용할 수 있습니다.

s3cmd du -H s3://Mybucket
97G      s3://Mybucket/

5

따라서 API를 통해 트롤링하고 동일한 쿼리를 재생하면 S3는 하나의 요청으로 버킷의 전체 내용을 생성하므로 디렉토리로 내려갈 필요가 없습니다. 결과는 반복되는 호출이 아닌 다양한 XML 요소를 합산해야합니다. 수천 개의 항목이있는 샘플 버킷이 없으므로 얼마나 잘 확장되는지 알지 못하지만 합리적으로 간단합니다.


이것이 최선의 선택 인 것 같습니다. 이 게시물이 제대로 확장되지 않으면 나중에 다른 게시물을 업데이트해야합니다. 원시 API 결과에 쉽게 액세스 할 수있게 된 라이브러리는 다음과 같습니다. undesigned.org.za/2007/10/22/amazon-s3-php-class
Garret Heaton

처음 1000 개 항목에만 국한되지 않습니까?
Charlie Schliesser

4

... 조금 늦었지만 내가 찾은 가장 좋은 방법은 AWS 포털에서 보고서를 사용하는 것입니다. 보고서를 다운로드하고 파싱하기 위해 PHP 클래스를 만들었습니다. 이를 통해 각 버킷에 대한 총 객체 수, 총 크기 (GB 또는 바이트 시간) 등을 얻을 수 있습니다.

그것을 확인하고 도움이되었는지 알려주십시오

AmazonTools


약간 해킹이지만 흥미로운 솔루션입니다. 아마존이 사이트를 변경하면 깨질 염려가 있지만 다른 방법으로 너무 느려질 정도로 충분한 객체가 있으면 이것을 시도해야 할 수도 있습니다. 이 방법의 또 다른 이점은 API 호출에 대해 요금이 청구되지 않는다는 것입니다.
Garret Heaton

. . . 가정하지만 아마존이 사이트의 모양을 변경하면 백엔드를 많이 변경하지 않을 것이므로 현재 GET 및 POST 쿼리가 작동해야합니다. 어쨌든 자주 사용함에 따라 수업이 중단되는 경우 수업을 유지합니다.

3

큰 버킷에 S3 사용 보고서를 사용하는 것이 좋습니다. 버킷 을 얻는 방법에 대한 방법을 참조하십시오. 기본적으로 Timed Storage-Byte Hrs를 사용하여 마지막 날 S3 서비스에 대한 사용 보고서를 다운로드하여 구문 분석하여 디스크 사용량을 가져와야합니다.

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

3

AWS 설명서는이를 수행하는 방법을 알려줍니다.

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

이것은 당신이 얻는 출력입니다 :

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

2

기술 수준이 낮은 기술의 경우 : 크기를 계산할 수있는 S3 클라이언트를 사용하십시오. Panic의 전송을 사용하고 있습니다. 버킷을 클릭하고 "정보 입수"를 수행 한 다음 "계산"버튼을 클릭하십시오. 다른 방법과 관련하여 얼마나 빠르거나 정확한지 잘 모르겠지만 예상했던 크기를 돌려주는 것 같습니다.


2

너무 많은 답변이 있기 때문에 나는 내 자신과 의견을 같이하는 것을 알았습니다. LINQPad를 사용하여 C #으로 구현을 작성했습니다. 쿼리하려는 액세스 키, 비밀 키, 리전 엔드 포인트 및 버킷 이름을 복사, 붙여 넣기 및 입력합니다. 또한 AWSSDK 너겟 패키지를 추가하십시오.

내 버킷 중 하나에 대해 테스트 한 결과 128075의 수와 70.6GB의 크기를 제공했습니다. 99.9999 % 정확하다는 것을 알고 결과에 만족합니다.

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]);
    }
}

2

AWS Console에서 크기를 얻으려면 :

  1. S3로 이동하여 버킷 이름을 클릭하십시오.
  2. "관리"탭을 선택하십시오

여기에 이미지 설명을 입력하십시오

  1. 측정 항목 탭 선택

기본적으로 버킷의 스토리지 지표 가 표시되어야합니다


1

나는 이것이 오래된 질문이라는 것을 알고 있지만 PowerShell 예제는 다음과 같습니다.

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

$A 버킷의 크기를 포함하고 버킷의 특정 폴더 크기 만 원하는 경우 키 이름 매개 변수가 있습니다.


먼저 Get-object..line을 실행 한 다음 $ A를 실행합니다 (PowerShell에 익숙하지 않은 사용자의 경우)
Faiz

1

모든 버킷 크기를 확인하려면이 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

이것은 훌륭하게 작동했습니다.
Mike Barlow-BarDev

반복적으로 변수를 출력 할 수 있도록 출력을 캡처하는 것은 낭비적인 반 패턴입니다.
tripleee

1

당신은 사용할 수 있습니다 s3cmd:

s3cmd du s3://Mybucket -H

또는

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

버킷의 전체 객체와 크기를 읽을 수있는 형태로 제공합니다.


합니까 du트래버스 목록에 모든 개체를 또는 메타 데이터를 검색? 보고서 버전의 api 버전 또는
AWS


0

또한 한조 S3 도구는 이 작업을 수행합니다. 설치되면 다음을 수행 할 수 있습니다.

s3ls -s -H bucketname

그러나 이것은 클라이언트 측에서도 요약되며 AWS API를 통해 검색되지 않는다고 생각합니다.


0

에 의해 호로 프로그램은 바로 통의 상단에 "속성"을 클릭 버킷의 크기, 폴더 및 전체 파일의 양을 나열 할 수있다.


0

Windows 및 OSX에서 명령 줄을 사용하지 않으려면 Cyberduck 이라는 범용 원격 파일 관리 앱이 있습니다 . , 액세스 / 비밀 키 쌍 S3에 로그인을 클릭 디렉토리를 마우스 오른쪽 버튼으로 클릭 Calculate.


0

나는 s3ls와 함께 버킷에 파일을 나열하고 파일 수와 크기를 인쇄하는 s3-du.sh Bash 스크립트를 작성했습니다.

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

전체 스크립트 :

#!/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    

Amazon은 디렉토리 이름과 모든 내용의 크기를 반환하므로 하위 디렉토리 크기를 수행합니다.


0

CloudWatch에는 이제 "Bucket Size Bytes Average"라는 그래프에이를 나열하는 기본 S3 서비스 대시 보드가 있습니다. 내 생각 이 링크가 작동 이미 AWS 콘솔에 로그인 한 사람을 위해 :


-1

다음 방법은 AWS PHP SDK를 사용하여 버킷의 전체 크기를 가져옵니다.

// 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;

-1

이것은 나를 위해 작동합니다 ..

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

3
몇 가지 세부 사항을 추가 할 수 있습니까?
Pierre.Vriens

1
이것은 본질적으로 약 1 년 전에 게시 된 다른 답변 과 동일한 솔루션 입니다.
Louis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.