Как поговорить с сервисом aws elasticsearch с использованием эластичного java-клиента?
Я установил сервер elasticsearch с помощью службы AWLS elasticsearch (не EC2). Это дало мне конечную точку https://xxx-xxxxxxxx.us-west-2.es.amazonaws.com/, и если я нажму на эту конечную точку (обратите внимание, что нет указанного порта), я могу получить ожидаемый
{
status: 200,
name: "Mastermind",
cluster_name: "xxxx",
version: {
number: "1.5.2",
build_hash: "yyyyyy",
build_timestamp: "2015-04-27T09:21:06Z",
build_snapshot: false,
lucene_version: "4.10.4"
},
tagline: "You Know, for Search"
}
Вопрос в том, как получить это через java-клиент elasticsearch без номера порта? Образец кода, который я получаю,
Client client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300));
Если я использую этот код и просто заменю "host1" на свою конечную точку, я получу "NoNodeAvailableException"
пс:
Используемая версия java-клиента - 2.0.0.
Edit
Наконец, я решил пойти с Jest, сторонним клиентом REST. Но то, что Брукс ответил ниже, также очень полезно - AWS действительно использует порт 80 для http и 443 для https. Блокатор для меня был брандмауэром, я думаю.
Edit2
В сервисной документации AWS ES прямо сказано:
Служба поддерживает HTTP на порту 80, но не поддерживает транспорт TCP.
Ответы
Ответ 1
Верьте или нет, AWS не запускает Elasticsearch с использованием 9200 и 9300. Он запускается через обычный старый порт 80.
Итак, чтобы продемонстрировать, попробуйте это...
curl -XPOST "http://xxx-xxxxxxxx.us-west-2.es.amazonaws.com:80/myIndex/myType" -d '["name":"Edmond"}'
или
curl -XPOST "https://xxx-xxxxxxxx.us-west-2.es.amazonaws.com:443/myIndex/myType" -d '["name":"Edmond"}'
Он должен ответить: { "_index": "myIndex", "_ типа": "MyType", "_ идентификатор": "some_id _ #", "_ версия": 1, "создал": истинно}
Зайдите в Кибану, и вы увидите его там.
Итак, тогда в вашем коде это должно быть:
Client client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("xxx-xxxxxxxx.us-west-2.es.amazonaws.com"), 80));
К сожалению, я не знаю, как передавать шифрование через SSL/HTTPS с помощью транспортного клиента. Вы можете использовать обычные REST-вызовы вместо JERSEY.
Наконец, убедитесь, что политика доступа Elasticsearch настроена правильно. Что-то вроде:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": "*",
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:yyyyyyy:domain/myDomain/*"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": "*",
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:yyyyyyyyy:domain/myDomain"
}
]
}
ПРИМЕЧАНИЕ.. Вышеприведенная политика доступа полностью открыта и не рекомендуется ни для чего удаленно близкого к производству. Просто чтобы вы знали....
Ответ 2
Управляемая служба поиска эластичности в AWS до сих пор не предоставляет порт для транспортного протокола.
На этот вопрос был дан ответ,
Клиент эластичного транспорта на AWS Managed ElasticSearch 1
В форуме AWS также обсуждается транспортный протокол. Вот ссылка
Каков порт для транспортного протокола?
Ответ 3
После многократного поиска я нашел пример, который использовал запрос GET, поэтому я внес небольшие изменения в него для разрешения запросов POST, чтобы сложные запросы могли быть отправлены через тело POST. Реализация доступна на https://github.com/dy10/aws-elasticsearch-query-java
Помимо правильной настройки доступа к вам AWS ES (т.е. не открывайте его в Public), обязательно используйте https (приведенный выше код использует http, просто замените http на https в коде и он будет работать).
Другая полезная, но частичная реализация - https://github.com/aws/aws-sdk-java/issues/861