本文介紹如何使用Java、Python、Go語言串連Elasticsearch叢集(ES)。
準備工作
擷取叢集串連地址
您可以通過VPC私網或公網地址串連到ES叢集。
VPC私網串連地址:通過VPC私網地址訪問ES叢集,延遲低,穩定性高。該地址在叢集建立成功後預設開啟。
公網串連地址:通過公網訪問ES叢集,需手動開啟。
如何開啟公網訪問:
登入ES控制台,進入執行個體基本資料頁面。
單擊左側導覽列 配置與管理>安全配置,開啟公網訪問。待叢集狀態由生效中變更為生效時,表示公網訪問已成功開啟。
重要公網地址會降低ES叢集的安全性,如果使用公網地址,請務必配置IP白名單,並在使用完畢後及時關閉公網訪問。
設定IP白名單
為保障叢集安全,您需要將待訪問裝置的IP地址加入ES叢集的VPC私網或者公網白名單,該IP地址所屬的裝置才能訪問ES叢集。
擷取待訪問裝置IP。
您可以參照以下情境,擷取待訪問裝置的IP地址。
情境
需擷取的IP地址
擷取方式
在本地裝置中串連ES叢集
本地裝置公網IP。
如果本地裝置位於區域網路(如家庭或公司網路)內,需將該區域網路的公網出口IP地址添加到ES叢集的公網白名單中。
通過
curl ipinfo.io/ip查詢本地裝置公網IP。在不同VPC的ECS執行個體中串連ES叢集
ECS執行個體的公網IP
登入ECS控制台,在執行個體列表查看。
在相同VPC的ECS執行個體中串連ES叢集
ECS執行個體的私網IP
登入ECS控制台,在執行個體列表查看。
將擷取到的IP地址添加到白名單分組中。
登入ES控制台,進入執行個體基本資料,單擊左側導覽列 配置與管理>安全配置,單擊修改在彈窗中設定VPC私網或者公網訪問白名單。
單擊default分組右側的配置 ,在彈出的對話方塊中添加VPC私網或者公網白名單。單個叢集最多可配置300個IP或者IP網段,多個IP或者IP網段之間用英文逗號隔開,且逗號前後不能有空格。
也可單擊新增IP白名單分組,自訂分組名稱。
白名單分組僅用於IP地址管理,不影響存取權限。所有分組內的IP地址許可權相同。
配置類別
格式和樣本值
重要注意事項
IPv4地址格式
單個IP:
192.168.0.1網段:
192.168.0.0/24
禁止訪問:
127.0.0.1允許所有訪問:
0.0.0.0/0重要存在高危風險,強烈建議不要配置
0.0.0.0/0。部分叢集版本(如7.16/8.5)和地區不支援
0.0.0.0/0,請以控制台介面或者報錯提示為準。
IPv6地址格式
(僅v2部署架構且所屬地區為杭州的叢集支援)
單個IP:
2401:XXXX:1000:24::5網段:
2401:XXXX:1000::/48
禁止所有訪問:
::1允許所有訪問
::/0重要存在高危風險,強烈建議不要配置
::/0。部分叢集版本不支援
::/0,請以控制台介面或者配置提示資訊為準。
配置完成後,單擊確認。
協議與認證說明
為確保相容性,建議用戶端使用的 Java、Python 或 Go 語言版本與ES叢集底層運行時的版本保持一致。
公網HTTPS:使用權威CA簽發的認證,用戶端無需特殊配置,直接使用
https://協議串連即可。私網HTTPS:使用自我簽署憑證加密傳輸,用戶端需配置跳過認證校正,詳見各語言樣本中的私網HTTPS配置。
串連叢集
Java
安裝Java JDK,JDK版本為1.8及以上。
配置pom依賴。
重要請將
version設定為正確的ES版本號碼,只有當version設定正確時才能拉取相關依賴,本樣本ES版本為8.17.0。<dependency> <groupId>co.elastic.clients</groupId> <artifactId>elasticsearch-java</artifactId> <version>8.17.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency>配置YML參數,開啟自動建立索引:
action.auto_create_index: true。以下樣本將串連ES叢集並建立名為hr_test的索引。
基礎串連樣本
以下樣本適用於公網HTTPS或私網HTTP情境:
package org.example;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.cat.IndicesResponse;
import co.elastic.clients.elasticsearch.indices.*;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.*;
import java.io.IOException;
public class RestClientTest {
public static void main(String[] args) {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("{UserName}", "{YourPassword}"));
// 公網HTTPS使用 "https",私網HTTP使用 "http"
RestClient restClient = RestClient.builder(new HttpHost("{YourEsHost}", 9200, "https"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
}).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient elasticsearchClient = new ElasticsearchClient(transport);
try {
CreateIndexResponse indexRequest = elasticsearchClient.indices().create(createIndexBuilder -> createIndexBuilder
.index("hr_test")
.aliases("foo", aliasBuilder -> aliasBuilder.isWriteIndex(true))
);
System.out.println("Index document successfully! " + indexRequest.acknowledged());
transport.close();
restClient.close();
} catch (IOException ioException) {
// 異常處理
}
}
}
私網HTTPS串連樣本
私網HTTPS需額外配置跳過認證校正:
package org.example;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.ssl.SSLContexts;
import org.elasticsearch.client.*;
import javax.net.ssl.SSLContext;
public class RestClientTestPrivateHttps {
public static void main(String[] args) throws Exception {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("{UserName}", "{YourPassword}"));
// 建立信任所有認證的 SSLContext
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(null, (chain, authType) -> true) // 信任所有認證
.build();
RestClient restClient = RestClient.builder(new HttpHost("{YourEsHost}", 9200, "https"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder
.setDefaultCredentialsProvider(credentialsProvider)
.setSSLContext(sslContext) // 設定 SSLContext
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE); // 跳過主機名稱驗證
}
}).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
ElasticsearchClient elasticsearchClient = new ElasticsearchClient(transport);
// 執行操作...
System.out.println(elasticsearchClient.info());
transport.close();
restClient.close();
}
}Python
以下代碼以ES 8.17.0版本為例,請根據實際ES版本替換版本號碼。
基礎串連樣本
以下樣本適用於公網HTTPS或私網HTTP情境:
pip install elasticsearch==8.17.0from elasticsearch import Elasticsearch
es = Elasticsearch(
hosts=['https://<YourEsHost>:9200'], # 公網HTTPS使用https://,私網HTTP使用http://
basic_auth=('<UserName>', '<YourPassword>'),
)
print(es.info())
私網HTTPS串連樣本
from elasticsearch import Elasticsearch
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 關閉SSL警告(可選)
es = Elasticsearch(
hosts=['https://<YourEsHost>:9200'],
basic_auth=('<UserName>', '<YourPassword>'),
verify_certs=False, # 跳過認證校正
ssl_show_warn=False, # 關閉SSL警告
)
print(es.info())
Go
以下以ES 8.x版本為例介紹如何通過Go串連ES,更多Go API Client的使用特性,請參見Elasticsearch Go Client。
基礎串連樣本
以下樣本適用於公網HTTPS或私網HTTP情境:
go get github.com/elastic/go-elasticsearch/v8
package main
import (
"github.com/elastic/go-elasticsearch/v8""log"
)
func main() {
cfg := elasticsearch.Config{
Addresses: []string{"https://<YourEsHost>:9200"}, // 公網HTTPS使用https://,私網HTTP使用http://
Username: "<UserName>",
Password: "<YourPassword>",
}
es, _ := elasticsearch.NewClient(cfg)
res, _ := es.Info()
defer res.Body.Close()
log.Println(res)
}
私網HTTPS串連樣本
package main
import (
"crypto/tls""net/http""github.com/elastic/go-elasticsearch/v8""log"
)
func main() {
cfg := elasticsearch.Config{
Addresses: []string{"https://<YourEsHost>:9200"},
Username: "<UserName>",
Password: "<YourPassword>",
Transport: &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // 跳過認證校正
},
}
es, _ := elasticsearch.NewClient(cfg)
res, _ := es.Info()
defer res.Body.Close()
log.Println(res)
}參數說明
參數 | 說明 |
UserName | 預設訪問使用者名稱為elastic,該使用者具有叢集最高許可權(可理解為管理員賬戶)。 出於安全考慮,不建議在生產環境中直接使用此預設管理員賬戶,您可以通過Elasticsearch X-Pack的RBAC(Role-based Access Control)機制,自訂角色並分配許可權,然後將角色指派給使用者,實現許可權精細化管控,具體操作請參見通過Elasticsearch X-Pack角色管理實現使用者權限管控。 |
YourPassword | UserName對應的密碼。 |
https | 訪問協議,http協議預設開啟。 為了保障叢集安全性,建議使用https協議,需手動開啟。登入ES控制台進入執行個體基本資料,單擊左側導覽列 配置與管理>安全配置,開啟https協議。 重要
|
YourEsHost | 準備工作中已擷取的叢集串連地址:
|
9200 | 叢集的訪問連接埠,VPC私網和公網預設連接埠號碼均為9200。 |