Подтвердить что ты не робот

Как поговорить с сервисом 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.

4b9b3361

Ответ 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