S3 バケットのオブジェクト数が S3 コンソールと AWS CLI で合わないのはなぜでしょうか?

バージョニングを有効化している S3 バケットのオブジェクト数を確認する場合、S3 コンソールでは最新でないオブジェクトを含むすべてのオブジェクト数が表示されますが、AWS CLI の ls コマンドは最新バージョンのオブジェクト数のみを返却します。
2021.09.18

困っていた内容

S3 バケットのオブジェクト数を確認したところ、S3 コンソールと AWS CLI で違う値になるのですが、なぜでしょうか?

S3 コンソール

S3 コンソールのメトリクスタブからオブジェクトの合計数を確認すると 7 と表示される。 NumberOfObjects

AWS CLI

lsコマンドでオブジェクトの合計数を確認すると 5 と表示される。

$ aws s3 ls s3://test-20210913-ver --recursive --human-readable --summarize
2021-09-13 10:20:51  131.5 KiB S3①.png
2021-09-13 10:20:52  192.9 KiB S3②.png
2021-09-13 10:17:55  116.5 KiB S3③.png
2021-09-13 10:17:55  136.8 KiB S3④.png
2021-09-13 10:17:56  155.2 KiB S3⑤.png

Total Objects: 5
   Total Size: 732.8 KiB

どうして違う結果になるの?

この S3 バケットでは、バージョニングが有効化されており、最新のオブジェクトが 5 つと最新でないオブジェクトが 2 つ保存されています。

バージョニング有効化

S3 コンソールでは最新でないオブジェクトを含むすべてのオブジェクト数を表示する一方で、 AWS CLI のlsコマンドは最新バージョンのオブジェクト数のみを返却するという仕様のためにそれぞれ異なる結果が表示されます。

※ S3 コンソールで確認できるオブジェクトの合計数は NumberOfObjects メトリクスを反映しています。

NumberOfObjects
すべてのストレージクラスのバケットに保存されたオブジェクトの総数。この値を計算するには、バケット内のすべてのオブジェクト (最新のオブジェクトと最新でないオブジェクトの両方) と、バケットに対するすべての不完全なマルチパートアップロードの合計パート数をカウントします。

sync コマンドの場合はどうなる?

バージョニングを有効化しているバケットのオブジェクトをsyncコマンドを実行して別のバケットにコピーした場合、最新バージョンのオブジェクトのみがコピーされます

$ aws s3 sync s3://test-20210913-ver s3://copy-20210917-test
copy: s3://test-20210913-ver/S3①.png to s3://copy-20210917-test/S3①.png
copy: s3://test-20210913-ver/S3③.png to s3://copy-20210917-test/S3③.png
copy: s3://test-20210913-ver/S3②.png to s3://copy-20210917-test/S3②.png
copy: s3://test-20210913-ver/S3⑤.png to s3://copy-20210917-test/S3⑤.png
copy: s3://test-20210913-ver/S3④.png to s3://copy-20210917-test/S3④.png

$ aws s3 ls s3://copy-20210917-test --recursive --human-readable --summarize
2021-09-17 09:59:48  131.5 KiB S3①.png
2021-09-17 09:59:48  192.9 KiB S3②.png
2021-09-17 09:59:48  116.5 KiB S3③.png
2021-09-17 09:59:48  136.8 KiB S3④.png
2021-09-17 09:59:48  155.2 KiB S3⑤.png

Total Objects: 5
   Total Size: 732.8 KiB

参照