Сервис: Amazon S3; Код состояния: 404; Код ошибки: NoSuchBucket; Проблема с получением файла из IBM Cloud Object Storage

#java #cloud #ibm-cloud #cloud-object-storage

#java #облако #ibm-cloud #облако-объект-хранилище

Вопрос:

Я пытаюсь получить файл из корзины в IBM cloud object storage. Для этого сначала я пытаюсь прочитать все доступные файлы в корзине.

 private static List<String> listBuckets(AmazonS3 cosClient) {
    final List<Bucket> bucketList = cosClient.listBuckets();
    List<String> bucketNames = new ArrayList<String>();
    for (final Bucket bucket : bucketList) {
        bucketNames.add(bucket.getName());
    }
    return bucketNames;
}

public InputStream getCOSFile(AmazonS3 cosClient, String bucketName, String objectName){
    List<String> bucketNames = listBuckets(cosClient);
    if (bucketNames.contains(bucketName)){
        LOGGER.info(bucketName " exists");
        getBucketContentsV2(cosClient, bucketName, 2);
       }
  

Здесь я получаю сообщение bucketName существует из блока if. Кроме того, корзина существует в моей облачной учетной записи. Но getBucketContentsV2 выдает мне следующее сообщение об ошибке: «Указанное ведро не существует. (Сервис: Amazon S3; Код состояния: 404; Код ошибки: NoSuchBucket; Идентификатор запроса: xxxxx)

Вот метод getBucketContentsV2, почти точно такой же, как в руководствах IBM cloud doc.

 public static void getBucketContentsV2(AmazonS3 cosClient, String bucketName, int maxKeys) {
    System.out.printf("Retrieving bucket contents (V2) from: %sn", bucketName);

    boolean moreResults = true;
    String nextToken = "";

    while (moreResults) {
        ListObjectsV2Request request = new ListObjectsV2Request()
                .withBucketName(bucketName)
                .withMaxKeys(maxKeys)
                .withContinuationToken(nextToken);

        ListObjectsV2Result result = cosClient.listObjectsV2(request);
        for(S3ObjectSummary objectSummary : result.getObjectSummaries()) {
            System.out.printf("Item: %s (%s bytes)n", objectSummary.getKey(), objectSummary.getSize());
        }

        if (result.isTruncated()) {
            nextToken = result.getNextContinuationToken();
            System.out.println("...More results in next batch!n");
        }
        else {
            nextToken = "";
            moreResults = false;
        }
    }
    System.out.println("...No more results!");
}
  

Я также попытался получить все файлы в корзине с кодом V1 в документах и получить ту же ошибку NoSuchBucket.

Вот реализация этого метода:

 public static void listBuckets(AmazonS3 cosClient, String bucketName) {
    System.out.printf("Retrieving bucket contents from: %sn", bucketName);
    ObjectListing objectListing = cosClient.listObjects(new ListObjectsRequest().withBucketName(bucketName));
    for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
        System.out.printf("Item: %s (%s bytes)n", objectSummary.getKey(), objectSummary.getSize());
    }
    System.out.println();
}
  

Ответ №1:

Итак, я попробовал этот код, чтобы воспроизвести ошибку. Я смог перечислить объекты в корзине. Моим первым гостем будет ошибка конфигурации.

 String bucketName = "<BUCKET_NAME>";  // eg my-unique-bucket-name
String newBucketName = "<NEW_BUCKET_NAME>"; // eg my-other-unique-bucket-name
String apiKey = "<API_KEY>"; // eg "W00YiRnLW4k3fTjMB-oiB-2ySfTrFBIQQWanc--P3byk"
String serviceInstanceId = "<SERVICE_INSTANCE_ID"; // eg "crn:v1:bluemix:public:cloud-object-storage:global:a/3bf0d9003abfb5d29761c3e97696b71c:d6f04d83-6c4f-4a62-a165-696756d63903::"
String endpointUrl = "https://s3.us-south.cloud-object-storage.appdomain.cloud"; // this could be any service endpoint
  

Вероятно endpointUrl , он неправильно настроен. Когда вы получите конечную точку, выполните следующие действия:

  1. Выберите меню конечных точек слева
  2. Выберите свой параметр отказоустойчивости. Мой был региональным
  3. Выберите свой регион
  4. Скопируйте общедоступную конечную точку.

У меня было так: s3.eu-de.cloud-object-storage.appdomain.cloud