S3バケットに保存したオブジェクトの数を確認するにはどうすればよいですか?


154

私が何かを見逃していない限り、私が調べたどのAPIも、S3バケット/フォルダー(プレフィックス)にあるオブジェクトの数を教えてくれないようです。カウントを取得する方法はありますか?


この質問は役に立つかもしれません:stackoverflow.com/questions/701545/...
ブレンダン・ロング

1
ソリューションは現在2015年に存在します:stackoverflow.com/a/32908591/578989
Mayank Jaiswal

以下の私の答えを参照してください:stackoverflow.com/a/39111698/996926
advncd '23

回答:


39

あなたがいない限り、方法はありません

  1. それらをすべて1000のバッチでリストする(これは低速で帯域幅を消費する可能性があります-アマゾンはXML応答を決して圧縮しないようです)、または

  2. S3でアカウントにログインし、[アカウント]-[使用状況]に移動します。請求部門はあなたが保存したオブジェクトの数を正確に知っているようです!

5,000万個のオブジェクトが保存されている場合、すべてのオブジェクトのリストをダウンロードするだけでは実際に時間がかかり、コストがかかります。

使用量データにあるStorageObjectCountに関するこのスレッドも参照してください。

たとえ何時間も経っていたとしても、少なくとも基本を取得するS3 APIは素晴らしいでしょう。


ところで、そのリンクは死んでいます。
フィールド


私のように怠惰な場合、Newvemは基本的にこれをあなたに代わって行い、S3アカウント全体のバケットごとのレベルで結果を集計/追跡します。
rcoup

2
@MayankJaiswalの応答を含めるように応答を更新できますか?
ジョセフケーシー

1
請求部門はすべてを知っています!彼らがs3東海岸を誤って倒す力を持っているのも不思議ではありません
ski_squaw 2017

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? =217050

AWS Webコンソールの使用

cloudwatchのメトリックセクションを見て、保存されているオブジェクトのおおよその数を取得できます。 ここに画像の説明を入力してください

約5000万の製品を使用しており、使用を数えるのに1時間以上かかりました aws s3 ls


18
これは上部に近いはずです。
ジョセフケーシー

3
@JosephMCasey同意する。これはまた、このようなバケツでディレクトリ内のオブジェクトの数を与えるために動作します:aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
ティム・ピーターソン

1
上記をcmdプロンプトで実行すると、このエラーが発生します。「wc」は、内部または外部のコマンド、操作可能なプログラム、またはバッチファイルとして認識されません。-私はこれがかなり新しいので、誰かが解決策を与えることができますか?
Sandun

CloudWatchは信頼性が非常に低いと思われるという警告。CloudWatch(NumberOfObjectsメトリック)が2,300の個別のオブジェクトとしてカウントする1つのバケットにmp4ファイルがあります。AWS CLIで正しい番号を取得しました。
AlexK

なぜ「平均」なのか?誰かが代わりに「Sum」を望まないでしょうか?
ffxsam

150

ある--summarize含むスイッチバケット要約情報 (オブジェクトの数、すなわち、合計サイズ)。

AWS CLIを使用した正しい答えは次のとおりです。

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

Total Objects: 194273

ドキュメントを見る


4
これはすばらしい:Total Objects: 7235 Total Size: 475566411749-とても簡単です。
bonh

16
残念なことに、何千ものオブジェクトをリストするという大きなオーバーヘッドがありますが、残念ながら(現在は600,000プラスなので、これにはかなり時間がかかります)
MichaelChirico

5Mオブジェクトのバケットでこのタスクを実行するのにいくらかかりますか?
精神分裂病

2
この答えは非常に非効率的で、潜在的に非常に遅く、コストがかかります。バケット全体を反復処理して、答えを見つけます。
ウィーバー、

2
さらに付け加えると、標準のストレージに保存されている12億を超えるオブジェクトを反復処理すると、約6000ドルかかる可能性があります。
Cジョンソン

66

これは古い質問であり、フィードバックは2015年に提供されましたが、S3 Webコンソールで「サイズを取得」オプションが有効になっているため、現時点でははるかに簡単です。

ここに画像の説明を入力してください

これは以下を提供します:

ここに画像の説明を入力してください


1
はい、新しいAWSコンソールでは目が痛いですが、ボタンをクリックするだけでオブジェクトの数と合計サイズを計算できます。
アニ

11
これはフォルダレベルでのみ機能するようです。「サイズの取得」はバケットレベルでは使用できません
G-。

1
@ G-。バケットのすべてのフォルダを選択するとどうなりますか?
gvasquez

4
@ G-。ただし、[すべて選択]ボックスでは、ページに表示されているフォルダとオブジェクトのみが選択され、バケットのすべてのフォルダ/オブジェクトは選択されません。
gparis

2
@gparis良い点。注目に値する。ありがとう。そのため、コンソールでは、単一のページに表示できるファイルまたはフォルダーよりも多くのファイルまたはフォルダーがある場合、オプションがないようです
G-。

50

s3cmdコマンドラインツールを使用すると、特定のバケットの再帰的なリストを取得して、テキストファイルに出力できます。

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

次に、Linuxでは、ファイルに対してwc -lを実行して、行をカウントできます(オブジェクトごとに1行)。

wc -l listing.txt

-rコマンドでは用で--recursive、それは同様にサブ・フォルダのために働く必要がありますので、。
Deepak Joy

これについての3つの注記。a。)aws s3 lsより高速なので、s3cmdではなくを使用する必要があります。b。)大きなバケットの場合、長時間かかることがあります。1milファイルの場合、約5分かかりました。c。)クラウドウォッチの使用については、以下の私の回答を参照してください。
mastaBlasta 2016

46

現在、S3 APIを使用した簡単なソリューションがあります(AWS CLIで利用可能):

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']、received: "null" フォルダが空であるか、存在しない場合に0を出力する方法はありますか?
user3591836 2015年

1
私が手Illegal token value '(Contents[])]' だけ使用した場合、(AWS-CLIのバージョン1.2.9を)--bucket my-bucketしてA client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist使用した場合--bucket s3://my-bucket。(間違いなく存在し、1000以上のファイルがあります。)
Darren Cook

@DarrenCookはバケット名からs3://を削除します。クライアントはプロトコルをサポートしていないようです。
スリランジャンマンジュナート2016

これは、wc -lの例よりもはるかに高速です。私のバケットでは、およそ1秒あたり3〜4kオブジェクトをカウントします。つまり、100万オブジェクトあたり最大5分です。S3 Web GUIの「Get Size」は、ほぼ同じ時間がかかるため、内部では類似したものを使用する可能性があります。
notpeter 2017年

以下のために非常に大きなバケツ、これは(20分未満)から、合理的な期間内に私のために働いた唯一のソリューションでした
ニックSarafa

40

s3のAWSクラウドウォッチメトリックスを使用して、各バケットの正確な数を確認できます。 バケットを選択したときのcloudwatchメトリック


これが最良の答えだと思います
Oktav

1m以上のキーをリストするようなばかげたことをしないで、唯一の本当の答え。そこにあったのを忘れた。
Andrew Backer

これにはもっと賛成票が必要です。他のすべてのソリューションは、コストと時間の点で不十分なスケーリングです。
アーロンR.

5

AWS Billing、レポート、AWS Usageレポートの順に進みます。Amazon Simple Storage Serviceを選択してから、Operation StandardStorageを選択します。次に、各バケットのアイテム数をリストするStorageObjectCountのUsageTypeを含むCSVファイルをダウンロードできます。


4

s3コンソールの[管理]タブに移動して[メトリック]をクリックすると、合計数と履歴を簡単に取得できます... タブのスクリーンショット


NumberOfObjects (count/day)グラフを表示するように画像を更新できますか?それは質問に直接関連しているので、それはより良いでしょう。スクリーンショットではBucketSizeBytes (bytes/day)、役立つものの、問題に直接関連しないものを示しています。
guzmonne

1
2019年の時点で、これが受け入れられた答えになるはずです。残りのすべては時代遅れか遅いです。
Cジョンソン

2

APIは、リストを1000単位で返します。IsTruncatedプロパティをチェックして、まだあるかどうかを確認します。存在する場合は、別の呼び出しを行い、取得した最後のキーを次の呼び出しのMarkerプロパティとして渡す必要があります。その後、IsTruncatedがfalseになるまで、このようにループを続けます。

詳細については、このAmazonドキュメントを参照してください:複数ページの結果の反復


2

古いスレッドですが、私がこれを理解するまで答えを探していたので、まだ関連性があります。GUIベースのツール(つまり、コードなし)を使用してファイル数を求めていました。私はS3との間のドラッグアンドドロップ転送に3Hubと呼ばれるツールをすでに使用しています。持っているファイルの数を知りたい特定のバケット内にあるました(請求によってバケットごとに分割されるとは思わない)。

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個のファイルがあり、ファイルの数を1分未満で計算しました。


2

scalablelogic.comのpythonスクリプトを使用しました(カウントログに追加)。よく働きました。

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

ご存知のとおり、これはboto3では機能しません。以下の提案を別の回答として投稿しました。
fuzzygroup

2

s3cmdで、次のコマンドを実行します(Ubuntuシステム上)。

s3cmd ls -r s3://mybucket | wc -l

13
5年前の質問を復活させて、既存の回答のフォーマットが正しくないコピーを投稿したのはなぜですか?
2ビットの錬金術師

以前の答えは、出力を不必要にtxtファイルにパイプしました。
mjsa 2015

10
IMOこれはその回答に対するコメントになるはずです。これはほんのささいな違いです。
2ビットの錬金術師

2
特にこの質問の選択された回答が「方法はありません...」で始まり、@ mjsaが1行の回答を提供しているため、価値のある回答のようです。
Nan

バージョン管理されたオブジェクトが考慮されていないため、これは良い答えではありません。
3h4x

2

WindowsでAWS CLIを使用しているMeasure-Object場合、wc -l* nixと同様に、PowerShellを使用してファイルの総数を取得できます。

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

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

それが役に立てば幸い。


2

s3のオブジェクト数をカウントする最も簡単な方法の1つは、次のとおりです。

手順1:ルートフォルダーを選択します。手順2:[アクション]-> [削除]をクリックします(明らかに、削除しないように注意してください)。

あなたが解決策を見つけたらUpVote。


1

それを行うためのAmazon固有のAPIは実際にはないので、どのAPIもあなたに数を与えません。list-contentsを実行して、返される結果の数を数える必要があります。


何らかの理由で、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です。


送信すると、残念ながら最大1000アイテムしか表示されません(そのため、アイテム数も1000に制限されます)
Tino

0

s3ブラウザはhttp://s3browser.com/からダウンロードしてインストールできます。中央右隅にあるバケットを選択すると、バケット内のファイル数が表示されます。ただし、表示されるサイズは現在のバージョンでは正しくありません。

ガブ


0

最も簡単な方法は、開発者コンソールを使用することです。たとえば、Chromeを使用している場合は、[開発者ツール]を選択すると、次のように表示され、280-279 + 1 = 2のように、一致を見つけて数えるか、実行できます。

...


バケット内のオブジェクトの総数を把握するために開発者ツールをどのように使用したかについて、もう少し詳しく説明してください。
Jugal Panchal

0

csvファイル内のオブジェクトのリストを提供するAmazon S3インベントリを潜在的に使用できます




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

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

上に埋め込まれたPythonスクリプトのboto3バージョンは次のとおりです。

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)`

0

aws s3 ls s3:// bucket-name / folder-prefix-if-any --recursive | wc -l


それは1000以上で機能し、私にとっては4258を数えました
KingAndrew

行は、ファイルの数に直接対応していません。日付とディレクトリだけの行もあるからです。
CMCDragonkai

このコマンドは、限られた数のファイルに対して機能します。私の場合、ファイル数は100万を超えており、結果が得られることはありません。しかし、これは限られたファイルに適したオプションです。
Jugal Panchal
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.