#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?