使用Java API获取AWS S3存储桶大小

3
我在Google上搜索了关于获取S3存储桶元数据的高效方法,比如它的大小和其中文件的数量。我找到了这个链接,讨论了这个问题。但是,它是针对PHP和使用CloudWatch的AWS CLI的。我想知道是否有Java API可以获取S3存储桶元数据?
谢谢。
3个回答

2

您可以在此处找到AWS S3 Java库的详细文档:

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/overview-summary.html

回答您的问题,您可以使用getSize()来获取S3中对象的大小,并且您可以迭代所有文件以获取存储桶的大小。

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/S3ObjectSummary.html#getSize()

S3不支持直接获取磁盘使用情况(即不通过遍历所有项),但您可以使用CloudWatch进行单个请求以获取所需数据。
示例查询:
aws cloudwatch get-metric-statistics --namespace AWS/S3 --start-time 2016-01-01T10:00:00 --end-time 2016-02-12T01:00:00 --period 86400 --statistics Average --region us-east-1 --metric-name BucketSizeBytes --dimensions Name=BucketName,Value=www.streambrightdata.com Name=StorageType,Value=StandardStorage

返回:
{
    "Datapoints": [
        {
            "Timestamp": "2016-02-05T10:00:00Z",
            "Average": 54027423.0,
            "Unit": "Bytes"
        },
        {
            "Timestamp": "2016-02-03T10:00:00Z",
            "Average": 52917504.0,
            "Unit": "Bytes"
        },
        {
            "Timestamp": "2016-02-04T10:00:00Z",
            "Average": 53417421.0,
            "Unit": "Bytes"
        },
        {
            "Timestamp": "2016-02-07T10:00:00Z",
            "Average": 54949563.0,
            "Unit": "Bytes"
        },
        {
            "Timestamp": "2016-02-01T10:00:00Z",
            "Average": 24951965.0,
            "Unit": "Bytes"
        },
        {
            "Timestamp": "2016-02-02T10:00:00Z",
            "Average": 28254636.0,
            "Unit": "Bytes"
        },
        {
            "Timestamp": "2016-02-06T10:00:00Z",
            "Average": 54577328.0,
            "Unit": "Bytes"
        }
    ],
    "Label": "BucketSizeBytes"
}

AWS Java SDK for CloudWatch:

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/cloudwatch/AmazonCloudWatchClient.html


1
我有数百万个存储桶中的文件,迭代它们需要太长时间。我希望有一种更快的方法来完成这个任务,是否有? - user3313379
嗨Istvan!感谢您的回复,但是是否有类似于CloudWatch的Java API呢? - user3313379
请注意周期参数86400。它将响应分割为指定的块。 - Istvan

1

使用 awssdk Java2.x

    Set<String> fileTypes = new HashSet<>();
    ListObjectsResponse listObjResp = amazonS3Client.listObjects(ListObjectsRequest.builder().bucket(bucketName).build());
    int iCount=1;
    //********************************************************************//
    log.info("listObjResp.isTruncated() : "+listObjResp.isTruncated());
    String nextMarker = null;
    do {
        String sKey = null;
        List<S3Object> s3ObjList = listObjResp.contents();
        for (S3Object s3Obj: s3ObjList) {
            sKey = s3Obj.key();
            String[] sKeyValues = sKey.split("\\.");
            if(sKeyValues.length==2) {
                fileTypes.add(sKeyValues[1]);
            }else {
                fileTypes.add(NO_FILE_EXT);
            }
            ++iCount;
        }
        nextMarker = listObjResp.nextMarker();
        log.debug("listObjResp.nextMarker() : "+nextMarker);
        listObjResp = amazonS3Client.listObjects(ListObjectsRequest.builder().bucket(bucketName).marker(nextMarker).build());
    } while (nextMarker !=null);
    
    log.info("iCount of '"+bucketName+"': "+(iCount-1));

0
你可以使用MinioAdminClient及其getDataUsageInfo()方法来获取所需的所有信息。
它可以通过此链接连接,并通过使用构建器传递参数而不是构造函数的方式进行配置,与MinioClient相同。
@Bean
public MinioClient minioClient(
        @Value("${aws.endPoint}") String endPoint,
        @Value("${aws.accessKey}") String accessKey,
        @Value("${aws.secretKey}") String secretKey) throws InvalidPortException, InvalidEndpointException {

    return new MinioClient(endPoint, accessKey, secretKey);
}

@Bean
public MinioAdminClient minioAdminClient(
        @Value("${aws.endPoint}") String endPoint,
        @Value("${aws.accessKey}") String accessKey,
        @Value("${aws.secretKey}") String secretKey){

    return MinioAdminClient
            .builder()
            .endpoint(endPoint)
            .credentials(accessKey, secretKey)
            .build();
}

在GitHub Repo中的文件链接:https://github.com/minio/minio-java/blob/master/adminapi/src/main/java/io/minio/admin/MinioAdminClient.java#L593

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接