Integrating document DB with java outside VPC

19 views Asked by At

I'm trying to integrate document DB with java spring boot. I have setup SSH tunnel and port forwarding and established connection from command line to AWS Document DB and successfully able to insert data in db. I am trying to accomplish the connection from JAVA Spring boot. I have attached my configuration files below. The issue is when i do a crud API i get this error

org.mongodb.driver.cluster: No server chosen by WritableServerSelector from cluster description ClusterDescription{type=UNKNOWN, connectionMode=SINGLE, serverDescriptions=[ServerDescription{address=DocumentDB-25.ccouih7cdiv2.ap-northeast-1.docdb.amazonaws.com:27017, type=UNKNOWN, state=CONNECTING}]}. Waiting for 30000 ms before timing out Blockquote

Need your help on this. If you have any better working solution i would be happy to try it out if this is a dead end

package com.platform.assetmanagement.utils.config;

import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.connection.SslSettings;
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import javax.swing.plaf.PanelUI;
import java.io.FileInputStream;
import java.security.KeyStore;

@Configuration
public class DocumentDBConfig {

    String template = "mongodb://%s:%s@%s/test?retryWrites=false&directConnection=true&ssl=true&tlsAllowInvalidHostnames=true&readpreference=%s";
    String username = "*****";
    String password = "*****";
    String clusterEndpoint = "DocumentDB-25.ccouih7cdiv2.ap-northeast-1.docdb.amazonaws.com:27017";

    String tunnel = "localhost:27017";
    String readPreference = "secondaryPreferred";
    public final String connectionString = String.format(template, username, password, clusterEndpoint, readPreference);

    String truststore = "truststore.jks";
    String truststorePassword = "changeit";

    @Bean
    public MongoClient mongoClient() {
        try {
            setSslProperties();
            ConnectionString connectionString = new ConnectionString(this.connectionString);

            // Load the keystore
            KeyStore trustStore = KeyStore.getInstance("PKCS12");
            trustStore.load(new FileInputStream("truststore.jks"), "changeit".toCharArray());

            // Initialize trust manager factory
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init(trustStore);

            // Initialize SSL context
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, trustManagerFactory.getTrustManagers(), null);

            // Configure SSL settings

            MongoClientSettings settings = MongoClientSettings.builder()
                    .applyToSslSettings(builder -> {
                        builder.enabled(true);
                        builder.invalidHostNameAllowed(true);
                        builder.context(sslContext);
                    })
                    .applyConnectionString(connectionString)

                    .build();


            return MongoClients.create(settings);
        } catch (Exception e) {
            // Handle exception
            System.out.println(e.getLocalizedMessage());
            return null;
        }
    }


    private void setSslProperties() {
                System.setProperty("javax.net.ssl.trustStore","truststore.jks" );
                System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
            }

}

More info on error

reactor.core.Exceptions$ErrorCallbackNotImplemented: 
org.springframework.dao.DataAccessResourceFailureException: Timed out after 30000 ms 
while waiting for a server that matches WritableServerSelector. Client view of cluster 
state is {type=UNKNOWN, servers=[{address=platform-docdb-2024-03-11-10-48- 
25.ccouih7cdiv2.ap-northeast-1.docdb.amazonaws.com:27017, type=UNKNOWN,state=CONNECTING}]
Caused by: org.springframework.dao.DataAccessResourceFailureException: Timed out after 
30000 ms while waiting for a server that matches WritableServerSelector. Client view of 
cluster state is {type=UNKNOWN, servers=[{address=platform-docdb-2024-03-11-10-48- 
25.ccouih7cdiv2.ap-northeast-1.docdb.amazonaws.com:27017, type=UNKNOWN, 
state=CONNECTING}] at
org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:88) ~[spring-data-mongodb-4.2.2.jar:4.2.2]
    at org.springframework.data.mongodb.core.ReactiveMongoTemplate.potentiallyConvertRuntimeException(ReactiveMongoTemplate.java:2762) ~[spring-data-mongodb-4.2.2.jar:4.2.2]
    at org.springframework.data.mongodb.core.ReactiveMongoTemplate.lambda$translateException$98(ReactiveMongoTemplate.java:2745) ~[spring-data-mongodb-4.2.2.jar:4.2.2]
    at reactor.core.publisher.Mono.lambda$onErrorMap$28(Mono.java:3799) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondError(MonoFlatMap.java:241) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.MonoFlatMap$FlatMapInner.onError(MonoFlatMap.java:315) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.FluxMap$MapSubscriber.onError(FluxMap.java:134) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.MonoNext$NextSubscriber.onError(MonoNext.java:93) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.FluxMap$MapSubscriber.onError(FluxMap.java:134) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.Operators.error(Operators.java:198) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.MonoError.subscribe(MonoError.java:53) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.Mono.subscribe(Mono.java:4512) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.MonoNext$NextSubscriber.onError(MonoNext.java:93) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.MonoNext$NextSubscriber.onError(MonoNext.java:93) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondError(MonoFlatMap.java:241) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.MonoFlatMap$FlatMapInner.onError(MonoFlatMap.java:315) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onError(MonoPeekTerminal.java:258) ~[reactor-core-3.6.2.jar:3.6.2]
    at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:205) ~[reactor-core-3.6.2.jar:3.6.2]
    at com.mongodb.reactivestreams.client.internal.MongoOperationPublisher.lambda$sinkToCallback$33(MongoOperationPublisher.java:521) ~[mongodb-driver-reactivestreams-4.11.1.jar:na]
    at com.mongodb.reactivestreams.client.internal.OperationExecutorImpl.lambda$execute$9(OperationExecutorImpl.java:126) ~[mongodb-driver-reactivestreams-4.11.1.jar:na]
    at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:47) ~[mongodb-driver-core-4.11.1.jar:na]
    at com.mongodb.internal.operation.AsyncOperationHelper.lambda$exceptionTransformingCallback$16(AsyncOperationHelper.java:331) ~[mongodb-driver-core-4.11.1.jar:na]
    at com.mongodb.internal.async.function.AsyncCallbackSupplier.lambda$whenComplete$1(AsyncCallbackSupplier.java:97) ~[mongodb-driver-core-4.11.1.jar:na]
    at com.mongodb.internal.async.function.RetryingAsyncCallbackSupplier$RetryingCallback.onResult(RetryingAsyncCallbackSupplier.java:111) ~[mongodb-driver-core-4.11.1.jar:na]
    at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:47) ~[mongodb-driver-core-4.11.1.jar:na]
    at com.mongodb.internal.operation.AsyncOperationHelper.lambda$withAsyncSuppliedResource$3(AsyncOperationHelper.java:130) ~[mongodb-driver-core-4.11.1.jar:na]
    at com.mongodb.reactivestreams.client.internal.ClientSessionBinding$WrappingCallback.onResult(ClientSessionBinding.java:295) ~[mongodb-driver-reactivestreams-4.11.1.jar:na]
    at com.mongodb.reactivestreams.client.internal.ClientSessionBinding$WrappingCallback.onResult(ClientSessionBinding.java:285) ~[mongodb-driver-reactivestreams-4.11.1.jar:na]
    at com.mongodb.internal.binding.AsyncClusterBinding.lambda$getAsyncClusterBindingConnectionSource$1(AsyncClusterBinding.java:153) ~[mongodb-driver-core-4.11.1.jar:na]
    at com.mongodb.internal.connection.BaseCluster$ServerSelectionRequest.onResult(BaseCluster.java:405) ~[mongodb-driver-core-4.11.1.jar:na]
    at com.mongodb.internal.connection.BaseCluster.handleServerSelectionRequest(BaseCluster.java:275) ~[mongodb-driver-core-4.11.1.jar:na]
    at com.mongodb.internal.connection.BaseCluster.access$700(BaseCluster.java:69) ~[mongodb-driver-core-4.11.1.jar:na]
    at com.mongodb.internal.connection.BaseCluster$WaitQueueHandler.run(BaseCluster.java:455) ~[mongodb-driver-core-4.11.1.jar:na]
    at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na]
Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches WritableServerSelector. Client view of cluster state is {type=UNKNOWN, servers=[{address=platform-docdb-2024-03-11-10-48-25.ccouih7cdiv2.ap-northeast-1.docdb.amazonaws.com:27017, type=UNKNOWN, state=CONNECTING}]
    at com.mongodb.internal.connection.BaseCluster.createTimeoutException(BaseCluster.java:380) ~[mongodb-driver-core-4.11.1.jar:na]
    ... 4 common frames omitted

2024-03-13T21:59:52.335+05:30  INFO 163587 --- [onaws.com:27017] org.mongodb.driver.cluster               : Exception in monitor thread while connecting to server platform-docdb-2024-03-11-10-48-25.ccouih7cdiv2.ap-northeast-1.docdb.amazonaws.com:27017

com.mongodb.MongoSocketOpenException: Exception opening socket
    at com.mongodb.connection.TlsChannelStreamFactoryFactory$TlsChannelStream.lambda$openAsync$0(TlsChannelStreamFactoryFactory.java:251) ~[mongodb-driver-core-4.11.1.jar:na]
    at com.mongodb.connection.TlsChannelStreamFactoryFactory$SelectorMonitor.lambda$start$0(TlsChannelStreamFactoryFactory.java:145) ~[mongodb-driver-core-4.11.1.jar:na]
    at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na]
Caused by: java.net.ConnectException: Connection timed out
    at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
    at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[na:na]
    at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:946) ~[na:na]
    at com.mongodb.connection.TlsChannelStreamFactoryFactory$TlsChannelStream.lambda$openAsync$0(TlsChannelStreamFactoryFactory.java:223) ~[mongodb-driver-core-4.11.1.jar:na]
    ... 2 common frames omitted




0

There are 0 answers