Подключение к кластеру Elasticsearch
Важно
Сервис Yandex Managed Service for Elasticsearch недоступен с 11 апреля 2024 года.
Вы можете создать кластер OpenSearch в Yandex Cloud в качестве альтернативы Elasticsearch.
К хостам кластера Managed Service for Elasticsearch с ролью Data node можно подключиться:
-
Через интернет, если вы настроили публичный доступ для нужного хоста.
-
С виртуальных машин Yandex Cloud, расположенных в той же виртуальной сети.
Вне зависимости от способа подключения, Managed Service for Elasticsearch поддерживает только соединения с SSL-сертификатом к хостам кластера.
Настройка групп безопасности
Для подключения к кластеру необходимо, чтобы группы безопасности содержали правила, которые разрешают трафик с определенных портов, IP-адресов или из других групп безопасности.
Настройки правил будут различаться в зависимости от выбранного способа подключения:
Настройте все группы безопасности кластера так, чтобы они разрешали входящий трафик с любых IP-адресов на порты 443 (Kibana GUI и Kibana API) и 9200 (Elasticsearch). Для этого создайте следующие правила для входящего трафика:
- Диапазон портов —
443
,9200
. - Протокол —
TCP
. - Источник —
CIDR
. - CIDR блоки —
0.0.0.0/0
.
На каждый порт создается отдельное правило.
-
Настройте все группы безопасности кластера так, чтобы они разрешали входящий трафик из группы безопасности, в которой находится ВМ, на порты 443 (Kibana GUI и Kibana API) и 9200 (Elasticsearch). Для этого создайте в этих группах следующие правила для входящего трафика:
- Протокол —
TCP
. - Диапазон портов —
443
,9200
. - Источник —
Группа безопасности
. - Группа безопасности — если кластер и ВМ находятся в одной и той же группе безопасности, выберите значение
Текущая
(Self
). В противном случае укажите группу безопасности ВМ.
На каждый порт создается отдельное правило.
- Протокол —
-
Настройте все группы безопасности, в которых находится ВМ так, чтобы можно было подключаться к ВМ и был разрешен трафик между ней и хостами кластера.
Пример правил для ВМ:
-
Для входящего трафика:
- Диапазон портов —
22
,443
,9200
. - Протокол —
TCP
. - Источник —
CIDR
. - CIDR блоки —
0.0.0.0/0
.
На каждый порт создается отдельное правило.
- Диапазон портов —
-
Для исходящего трафика:
- Диапазон портов —
0-65535
. - Протокол —
Любой
(Any
). - Назначение —
CIDR
. - CIDR блоки —
0.0.0.0/0
.
Это правило разрешает любой исходящий трафик, что позволяет не только подключаться к кластеру, но и устанавливать на ВМ необходимые для этого сертификаты и утилиты.
- Диапазон портов —
-
Примечание
Вы можете задать более детальные правила для групп безопасности, например, разрешающие трафик только в определенных подсетях.
Группы безопасности должны быть корректно настроены для всех подсетей, в которых будут размещены хосты кластера. При неполных или некорректных настройках групп безопасности можно потерять доступ к кластеру.
Подробнее о группах безопасности см. в разделе Группы безопасности.
Получение SSL-сертификата
Чтобы использовать шифрованное соединение, получите SSL-сертификат:
mkdir -p ~/.elasticsearch && \
wget "https://storage.yandexcloud.net/cloud-certs/CA.pem" \
--output-document ~/.elasticsearch/root.crt && \
chmod 0600 ~/.elasticsearch/root.crt
Сертификат будет сохранен в файле ~/.elasticsearch/root.crt
.
mkdir $HOME\.elasticsearch; curl.exe -o $HOME\.elasticsearch\root.crt https://storage.yandexcloud.net/cloud-certs/CA.pem
Сертификат будет сохранен в файле $HOME\.elasticsearch\root.crt
.
FQDN хоста Elasticsearch
Для подключения к хосту потребуется его FQDN — доменное имя. Его можно получить несколькими способами:
-
Скопируйте команду для подключения к кластеру в консоли управления
. Команда содержит заполненный FQDN хоста. Чтобы получить команду, перейдите на страницу кластера и нажмите кнопку Подключиться. -
Посмотрите FQDN в консоли управления:
- Перейдите на страницу кластера.
- Перейдите в раздел Хосты.
- Скопируйте значение в столбце FQDN хоста.
Для хостов кластера также используется особый FQDN.
Автоматический выбор хоста для подключения
При подключении к кластеру Elasticsearch вы можете:
-
Явно задать имена хостов с ролью Data node в строках подключения.
Этот способ подходит для любого способа подключения. Например, его можно использовать для подключения через интернет в случае, когда только для нескольких хостов включен публичный доступ.
-
Использовать специальный FQDN вида
c-<идентификатор_кластера_Elasticsearch>.rw.mdb.yandexcloud.net
(например,https://c-e4ut2....rw.mdb.yandexcloud.net
). Хост для подключения выбирается случайным образом среди всех хостов с ролью Data node.Этот способ подходит только в том случае, если для всех хостов с ролью Data node включен публичный доступ или же подключение выполняется только с виртуальных машин Yandex Cloud.
Подготовка к подключению из Docker-контейнера
Чтобы подключаться к кластеру Managed Service for Elasticsearch из Docker-контейнера, добавьте в Dockerfile строки:
RUN apt-get update && \
apt-get install curl --yes
RUN apt-get update && \
apt-get install wget curl --yes && \
mkdir --parents ~/.elasticsearch && \
wget "https://storage.yandexcloud.net/cloud-certs/CA.pem" \
--output-document ~/.elasticsearch/root.crt && \
chmod 0600 ~/.elasticsearch/root.crt
Примеры строк подключения
Примеры для Linux проверялись в следующем окружении:
- Виртуальная машина в Облаке с Ubuntu 20.04 LTS из Cloud Marketplace.
- Bash:
5.0.16
. - Python:
3.8.2
; pip3:20.0.2
. - Go:
1.13.8
.
Примеры для Windows проверялись в следующем окружении:
- Локальная машина с Windows 10 Pro build
19042.1052
. - PowerShell:
5.1.19041
.
Перед подключением подготовьте сертификат.
Для подключения нужно использовать имя пользователя и пароль, которые были заданы при создании кластера.
Примеры кода с заполненным FQDN хоста доступны в консоли управления
Если хосту с ролью Data node назначен публичный IP-адрес:
- Перед подключением установите SSL-сертификат
в хранилище доверенных корневых сертификатов браузера (инструкция для Mozilla Firefox). - В браузере перейдите по одному из адресов:
https://c-<идентификатор_кластера_Elasticsearch>.rw.mdb.yandexcloud.net
, если публичный IP-адрес назначен всем хостам с этой ролью. Идентификатор кластера можно получить со списком кластеров в каталоге.https://<FQDN_любого_хоста_с_ролью_Data_node_и_публичным_IP>.mdb.yandexcloud.net
- Введите имя пользователя и пароль.
Примечание
При использовании API Kibana:
- Для отправки запросов используйте порт
443
вместо штатного5601
. - Добавьте путь к SSL-сертификату в конфигурацию вашего приложения для работы с API. Например, для приложения Winlogbeat пропишите путь в переменной
ssl.certificate_authorities
.
Если ни одному хосту с ролью Data node не назначен публичный IP-адрес:
-
Создайте виртуальную машину на основе Linux в той же виртуальной сети, что и кластер.
-
Подключитесь к виртуальной машине по SSH.
-
Установите зависимости:
sudo apt update && sudo apt install -y nginx ssl-cert
-
Скопируйте загруженный SSL-сертификат в директорию
/etc/nginx/
:sudo cp ~/.elasticsearch/root.crt /etc/nginx/root.crt
-
Измените файл конфигурации по умолчанию для NGINX, например, так:
/etc/nginx/sites-available/default
upstream es-datanodes { server <FQDN_хоста_1_с_ролью_Data_Node>:443; ... server <FQDN_хоста_N_с_ролью_Data_Node>:443; } server { listen 443 ssl; ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; server_name _; location / { proxy_pass https://es-datanodes; proxy_ssl_trusted_certificate /etc/nginx/root.crt; proxy_ssl_session_reuse on; } }
Также можно использовать директиву
proxy_pass
со специальным FQDN:proxy_pass https://c-<идентификатор_кластера_Elasticsearch>.rw.mdb.yandexcloud.net;
Важно
В этом примере конфигурационного файла используется самоподписанный сертификат
snakeoil
из пакетаssl-cert
. Использовать этот сертификат в реальном кластере небезопасно. Вместо самоподписанного сертификата укажите путь к вашим публичным и приватным ключам SSL-сертификата в директивахssl_certificate
иssl_certificate_key
. -
Перезапустите NGINX:
sudo systemctl restart nginx
-
Добавьте сертификат, указанный в директиве
ssl_certificate
, в хранилище доверенных корневых сертификатов браузера (инструкция для Mozilla Firefox). -
Перейдите в браузере по адресу
https://<публичный_IP-адрес_ВМ>
. -
Введите имя пользователя и пароль.
Примечание
При использовании API Kibana:
- Для отправки запросов используйте порт
443
вместо штатного5601
. - Добавьте путь к SSL-сертификату в конфигурацию вашего приложения для работы с API. Например, для приложения Winlogbeat пропишите путь в переменной
ssl.certificate_authorities
.
Пример команды для подключения с использованием SSL-соединения:
curl \
--user <имя_пользователя>:<пароль> \
--cacert ~/.elasticsearch/root.crt \
--request GET 'https://c-<идентификатор_кластера_Elasticsearch>.rw.mdb.yandexcloud.net:9200/'
Пример команды для подключения с использованием SSL-соединения:
curl `
-Certificate <абсолютный_путь_к_файлу_сертификата> `
-Uri https://c-<идентификатор_кластера_Elasticsearch>.rw.mdb.yandexcloud.net:9200 `
-Credential <имя_пользователя>
В открывшемся окне введите пароль пользователя.
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes python3 python3-pip && \
pip3 install elasticsearch==7.17.2
Пример кода для подключения с использованием SSL-соединения:
connect.py
from elasticsearch import Elasticsearch
ES_CA = '~/.elasticsearch/root.crt'
ES_USER = '<имя_пользователя>'
ES_PASS = '<пароль>'
ES_HOSTS = [
"<FQDN_хоста_1_Elasticsearch_с_ролью_Data_Node>",
...,
"<FQDN_хоста_N_Elasticsearch_с_ролью_Data_Node>"
]
conn = Elasticsearch(
ES_HOSTS,
http_auth=(ES_USER, ES_PASS),
use_ssl=True,
verify_certs=True,
ca_certs=ES_CA)
print(conn.info())
conn.close()
Подключение:
python3 connect.py
Перед подключением установите зависимости:
sudo apt update && sudo apt install --yes golang git && \
go get github.com/elastic/go-elasticsearch
Пример кода для подключения с использованием SSL-соединения:
connect.go
package main
import (
"crypto/tls"
"crypto/x509"
"github.com/elastic/go-elasticsearch"
"io/ioutil"
"log"
"net/http"
)
var ES_CA = "/home/<домашняя_директория>/.elasticsearch/root.crt"
var ES_USER = "<имя_пользователя>"
var ES_PASS = "<пароль>"
var ES_HOSTS = []string{
"https://<FQDN_хоста_1_Elasticsearch_с_ролью_Data_Node>:9200",
...,
"https://<FQDN_хоста_N_Elasticsearch_с_ролью_Data_Node>:9200"}
func main() {
caCert, err := ioutil.ReadFile(ES_CA)
if err != nil {
log.Fatal(err)
}
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(caCert)
cfg := elasticsearch.Config{
Addresses: ES_HOSTS,
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
RootCAs: caCertPool,
},
},
Username: ES_USER,
Password: ES_PASS,
}
conn, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Printf("Error creating the client: %s", err)
} else {
log.Println(conn.Info())
}
}
В отличие от других способов подключения, в этом коде необходимо указывать полный путь к сертификату CA.pem
для Elasticsearch в переменной ES_CA
.
Подключение:
go run connect.go
О том, как получить FQDN хоста, см. инструкцию.
При успешном подключении будет выведена общая информация о кластере Elasticsearch.