Клиент IBM Cloud Storage - PullRequest
       16

Клиент IBM Cloud Storage

1 голос
/ 17 октября 2019

Я пытаюсь использовать облачное хранилище IBM для загрузки / выгрузки данных - я использую бесплатный уровень, и у IBM, похоже, есть наилучший доступный вариант. Я создал учетные данные для своего клиента, как вы можете видеть на картинке (файл JSON не показан по понятным причинам):

IBM Cloud Storage

Я также создалкорзина:

enter image description here

И корзина имеет учетные данные службы, связанные с корзиной с доступом на чтение / запись (роль Writer), которую можно увидеть здесь:

enter image description here

Затем я использовал учетные данные (apikey, endpoints и resource_instance_id) из файла JSON для создания клиента:

{
  "apikey": "XXXX",
  "endpoints": "https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints",
  "iam_apikey_description": "Auto-generated for key XXXX",
  "iam_apikey_name": "client-test",
  "iam_role_crn": "crn:v1:bluemix:public:iam::::serviceRole:Manager",
  "iam_serviceid_crn": "XXXX",
  "resource_instance_id": "XXXX::"
}

У IBM есть собственный SDK для Java, поэтому я добавил зависимость maven (ibm-cos-java-sdk версии 2.5.4). Я последовал примеру из их документации и создал отдельный класс IbmCloudClient . Единственное отличие, которое я вижу, заключается в том, что я не выбрал местоположение, так как создал контейнер, который существует только в одном месте. Поэтому я пересылаю null в качестве значения местоположения. Код клиента следующий:

package xyz.blackmonster.cloud;

import com.ibm.cloud.objectstorage.ClientConfiguration;
import com.ibm.cloud.objectstorage.auth.AWSCredentials;
import com.ibm.cloud.objectstorage.auth.AWSStaticCredentialsProvider;
import com.ibm.cloud.objectstorage.client.builder.AwsClientBuilder;
import com.ibm.cloud.objectstorage.oauth.BasicIBMOAuthCredentials;
import com.ibm.cloud.objectstorage.services.s3.AmazonS3;
import com.ibm.cloud.objectstorage.services.s3.AmazonS3ClientBuilder;
import com.ibm.cloud.objectstorage.services.s3.model.ListObjectsRequest;
import com.ibm.cloud.objectstorage.services.s3.model.ObjectListing;
import com.ibm.cloud.objectstorage.services.s3.model.S3ObjectSummary;

import java.util.List;
import java.util.stream.Collectors;

public class IbmCloudClient {

    private AmazonS3 cloudClient;

    public IbmCloudClient(String apiKey, String resourceInstanceID, String endpointUrl) {
        AWSCredentials credentials;
        credentials = new BasicIBMOAuthCredentials(apiKey, resourceInstanceID);
        ClientConfiguration clientConfig = new ClientConfiguration().withRequestTimeout(5000);
        clientConfig.setUseTcpKeepAlive(true);
        cloudClient =
                AmazonS3ClientBuilder
                    .standard()
                    .withCredentials(new AWSStaticCredentialsProvider(credentials))
                    .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpointUrl, null))
                    .withPathStyleAccessEnabled(true)
                    .withClientConfiguration(clientConfig).build();
    }

    public List<String> listObjects() {
        ObjectListing objectListing = cloudClient.listObjects(new ListObjectsRequest().withBucketName("resume-storage"));
        List<String> files = objectListing.getObjectSummaries().stream().map(S3ObjectSummary::getKey).collect(Collectors.toList());

        return files;
    }
}

Основной класс, в котором мы создаем клиент для получения списка элементов корзины:

package xyz.blackmonster.main;

import xyz.blackmonster.cloud.IbmCloudClient;

import java.util.List;
import java.util.stream.Collectors;

public class IbmCloudRunner {

    public static void main(String[] arg) {
        String apiKey = "XXXX";
        String resourceInstanceID = "XXXX";
        String endpointUrl = "https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints";

        IbmCloudClient client = new IbmCloudClient(apiKey, resourceInstanceID, endpointUrl);
        List<String> files = client.listObjects();
        System.out.println(files.stream().collect(Collectors.joining(", ")));
    }
}

При вызове listObjects я получаю следующееошибка:

Exception in thread "main" com.ibm.cloud.objectstorage.services.s3.model.AmazonS3Exception: Not Found (Service: Amazon S3; Status Code: 404; Error Code: 404 Not Found; Request ID: null), S3 Extended Request ID: null
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1712)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1367)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1113)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:770)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:744)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:726)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:686)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:668)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient.execute(AmazonHttpClient.java:532)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient.execute(AmazonHttpClient.java:512)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3921)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3868)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3862)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:779)
    at xyz.blackmonster.cloud.IbmCloudClient.listObjects(IbmCloudClient.java:36)
    at xyz.blackmonster.main.IbmCloudRunner.main(IbmCloudRunner.java:16)

Я также пытался позвонить cloudClient.listBuckets(), где я также получил исключение:

Exception in thread "main" com.ibm.cloud.objectstorage.SdkClientException: Failed to parse XML document with handler class com.ibm.cloud.objectstorage.services.s3.model.transform.XmlResponsesSaxParser$ListAllMyBucketsHandler
    at com.ibm.cloud.objectstorage.services.s3.model.transform.XmlResponsesSaxParser.parseXmlInputStream(XmlResponsesSaxParser.java:156)
    at com.ibm.cloud.objectstorage.services.s3.model.transform.XmlResponsesSaxParser.parseListMyBucketsResponse(XmlResponsesSaxParser.java:348)
    at com.ibm.cloud.objectstorage.services.s3.model.transform.Unmarshallers$ListBucketsUnmarshaller.unmarshall(Unmarshallers.java:38)
    at com.ibm.cloud.objectstorage.services.s3.model.transform.Unmarshallers$ListBucketsUnmarshaller.unmarshall(Unmarshallers.java:34)
    at com.ibm.cloud.objectstorage.services.s3.internal.S3XmlResponseHandler.handle(S3XmlResponseHandler.java:65)
    at com.ibm.cloud.objectstorage.services.s3.internal.S3XmlResponseHandler.handle(S3XmlResponseHandler.java:34)
    at com.ibm.cloud.objectstorage.http.response.AwsResponseHandlerAdapter.handle(AwsResponseHandlerAdapter.java:70)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.handleResponse(AmazonHttpClient.java:1627)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1336)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1113)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:770)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:744)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:726)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:686)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:668)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient.execute(AmazonHttpClient.java:532)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient.execute(AmazonHttpClient.java:512)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3921)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3868)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3862)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.listBuckets(AmazonS3Client.java:881)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.listBuckets(AmazonS3Client.java:887)
    at xyz.blackmonster.cloud.IbmCloudClient.listObjects(IbmCloudClient.java:37)
    at xyz.blackmonster.main.IbmCloudRunner.main(IbmCloudRunner.java:16)
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1472)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:994)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at com.ibm.cloud.objectstorage.services.s3.model.transform.XmlResponsesSaxParser.parseXmlInputStream(XmlResponsesSaxParser.java:142)
    ... 23 more
Disconnected from the target VM, address: '127.0.0.1:53560', transport: 'socket'

Есть идеи, что не так? Это код вызывает проблемы, или я неправильно настроил ведро?

...