【问题标题】:Connect to Elasticsearch through an SSH tunnel通过 SSH 隧道连接到 Elasticsearch
【发布时间】:2021-11-13 04:44:27
【问题描述】:

我正在尝试创建一个 SSH 会话并连接到 EC2 实例中的 elasticsearch。我正在使用此代码来执行此操作,但它失败了

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();
        }

可能我错过了什么。请在这里提供任何帮助。

【问题讨论】:

    标签: elasticsearch amazon-ec2 ssh rest ssh-tunnel


    【解决方案1】:

    通常当出现Connection refused异常时,表示:

    • 连接字符串中的主机名、端口错误
    • 服务器端甚至没有监听 Elasticsearch 端口
    • 某种防火墙阻止了连接

    您是说 Elasticsearch 安装在 EC2 实例中,但在您的代码中,连接连接到端口 9200 上的 localhost。我假设您在本地机器上运行这段代码,并且您假设连接到 EC2 实例的主机,而不是 localhost。

    【讨论】:

    • 我在我的 EC2 实例上打开了一个 ssh 会话,Localhost 是 EC2 实例中连接到 Elasticsearch 的主机。创建 ssh 隧道后,如何调用 ES api 连接到运行在 EC2 中的 ES?
    猜你喜欢
    • 2021-02-15
    • 2018-10-06
    • 2016-02-04
    • 1970-01-01
    • 2014-07-20
    • 2014-03-21
    • 2012-06-19
    相关资源
    最近更新 更多