Подключитесь к Elasticsearch через SSH-туннель

#elasticsearch #amazon-ec2 #ssh #rest #ssh-tunnel

Вопрос:

Я пытаюсь создать сеанс SSH и подключиться к elasticsearch, который находится в экземпляре EC2. Я использую этот код для этого, но он не работает с

 java.util.concurrent.ExecutionException: java.net.ConnectException: Connection refused
ElasticsearchException[]; nested: ExecutionException[java.net.ConnectException: Connection refused]; nested: ConnectException[Connection refused];
    at org.elasticsearch.client.RestHighLevelClient.performClientRequest(RestHighLevelClient.java:2078)
    at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1732)
    at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1717)
    at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1684)
    at org.elasticsearch.client.LicenseClient.getBasicStatus(LicenseClient.java:191)
I am trying to create an SSH tunnel and connect to elasticsearch that is in EC2 instance. I am using this code to do that but it is failing with
java.util.concurrent.ExecutionException: java.net.ConnectException: Connection refused
ElasticsearchException[]; nested: ExecutionException[java.net.ConnectException: Connection refused]; nested: ConnectException[Connection refused];
    at org.elasticsearch.client.RestHighLevelClient.performClientRequest(RestHighLevelClient.java:2078)
    at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1732)
    at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1717)
    at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1684)
    at org.elasticsearch.client.LicenseClient.getBasicStatus(LicenseClient.java:191)
 

Это код, который я использую:

         Session session = null;
        String sshKeyFile = "/path/testSSH.pem";

        try {
            JSch jsc = new JSch();
            jsc.addIdentity(sshKeyFile);
            session = jsc.getSession("user", "ec2-instance", 22);
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();

            int i = session.setPortForwardingL(30000, "localhost", 22, null);

            final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("user_name", "pass"));

            RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200));
            builder.setHttpClientConfigCallback(a -> a.setDefaultCredentialsProvider(credentialsProvider));
            RestHighLevelClient client = new RestHighLevelClient(builder);
            GetBasicStatusResponse response = client.license().getBasicStatus(RequestOptions.DEFAULT);
            response.isEligibleToStartBasic();
            System.out.println(response.toString());

        } catch (JSchException e) {
            e.printStackTrace();
        }
 

Возможно, я что-то упускаю. Любая помощь здесь, пожалуйста.

Ответ №1:

Обычно, когда есть Connection refused исключение, это означает либо:

  • Неверное имя хоста, порт в строке подключения
  • Порт Elasticsearch даже не прослушивается на стороне сервера
  • Какой — то брандмауэр блокирует соединение

Вы говорите, что Elasticsearch установлен внутри экземпляра EC2, но в вашем коде соединение подключается к localhost порту on 9200 . Я предполагаю, что вы запускаете этот фрагмент кода на своей локальной машине и предполагаете подключиться к хосту экземпляра EC2, а не к локальному хосту.

Комментарии:

1. Я открыл сеанс ssh, где на моем экземпляре EC2 и локальном хосте находится хост в экземпляре EC2 для подключения к Elasticsearch. После создания ssh-туннеля, как мы можем вызвать ES api для подключения к ES, работающему в EC2?