AWSのSDKを使ってS3からオブジェクトのリストを取得した場合に、「listObjectsV2」を使ってオブジェクトのリストを取得することができるのですが、listObjectsV2を使ってリストを取得したとき、
あれ?全件取得できていない?
と、なったことはないでしょうか。
実はlistObjectsV2で取得すると最大1000件までしか取得できないので、バケットの中に1000件以上のオブジェクトは存在すると、1000件以降は対象外とされてしまうのです。
今回はそんなときにlistObjectsV2で1000件以上でも全件取得する方法を書いてみたいと思います。
まずは普通の取得方法
AmazonS3 s3client = AmazonS3ClientBuilder.standard().withRegion(Regions.AP_NORTHEAST_1).build();
ListObjectsV2Request request = new ListObjectsV2Request().withBucketName("バケット名").withPrefix("リストを取得したいパス").withDelimiter("/");
ListObjectsV2Result result = s3client.listObjectsV2(request);
List<String> objlist = result.getCommonPrefixes();
通常このように書くと最後の「objlist 」には最大1000件までしか入りません。
1000件以上のオブジェクトの取得方法
取得パス上にオブジェクトが1000件以上あり、listObjectsV2で取り切れない場合は、
結果のListObjectsV2Result.isTruncated() でtrueが返ってきます。
そしてその場合はListObjectsV2Result.getNextContinuationToken()で次の開始位置が取れるので、これをリクエストに設定することで続きから取得できるようになります。
先ほどの取得を全件取得できるようにするとこうなります。
AmazonS3 s3client = AmazonS3ClientBuilder.standard().withRegion(Regions.AP_NORTHEAST_1).build();
ListObjectsV2Request request = new ListObjectsV2Request().withBucketName("バケット名").withPrefix("リストを取得したいパス").withDelimiter("/");
// 全件取得できるまで繰り返し取得する
List<String> objectsAll = new ArrayList<String>();
while (true) {
ListObjectsV2Result result = s3client.listObjectsV2(request);
List<String> objlist = result.getCommonPrefixes();
// 全件格納用リスト
objectsAll.addAll(objlist);
// isTruncatedがfalseになったら終わり
if (!result.isTruncated()) {
break;
}
// リクエストに前回の続きをセット
request.setContinuationToken(result.getNextContinuationToken());
}
全件取れるまで繰り返し取得するというやり方です。
やっていることは単純なので、ぜひ活用してみてください。
コメント