Spring Boot连接AWS OpenSearch报错需Elasticsearch6及以上版本
在Spring Boot应用中集成AWS Elasticsearch(OpenSearch)服务时,按参考教程实现并做少量调整后,应用无法创建索引、无法与OpenSearch服务正常通信,启动时抛出Elasticsearch version 6 or more is required错误,多次尝试未解决。
1. Maven依赖配置
<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-elasticsearch</artifactId> <version>1.12.244</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>io.awspring.cloud</groupId> <artifactId>spring-cloud-starter-aws</artifactId> <version>2.4.1</version> </dependency>
2. 父POM配置
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.0</version> <relativePath/> <!-- lookup parent from repository --> </parent>
3. application.yml配置
server: port: 8087 spring: application: name: AWS ELK Demo management: health: elasticsearch: enabled: false cloud: aws: credentials: access-key: my-access-key secret-key: my-secret key region: static: eu-central-1
注意:原配置YAML缩进存在错误,cloud.aws下的credentials、region层级未对齐,运行时会导致配置加载失败
4. Rest High-Level Client配置类
@Configuration @EnableElasticsearchRepositories(basePackages = "com.example.awselkdemo.repository") public class ElasticSearchRestClientConfiguration { @Bean public RestHighLevelClient client() { final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("myuser", "myuser-password") ); RestClientBuilder builder = RestClient.builder(httpHost()).setHttpClientConfigCallback( httpClientBuilder -> httpClientBuilder .setDefaultCredentialsProvider(credentialsProvider) ); return new RestHighLevelClient(builder); } @Bean public ElasticsearchOperations elasticsearchTemplate() { return new ElasticsearchRestTemplate(client()); } private HttpHost httpHost() { return new HttpHost( "search-my-test-cluster-jashsah67ashas.eu-central-1.es.amazonaws.com", 443, "https" ); } }
注意:配置类中声明的Repository扫描包路径为com.example.awselkdemo.repository,但异常栈中实际的Repository类位于com.bosch.awselkdemo.repository包下,包路径不匹配也会引发Bean创建异常
5. 启动异常栈信息
应用启动失败,核心报错为Elasticsearch version 6 or more is required,异常关键片段如下:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'photoRepository' defined in com.bosch.awselkdemo.repository.PhotoRepository defined in @EnableElasticsearchRepositories declared on ElasticSearchRestClientConfiguration: Invocation of init method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.elasticsearch.repository.support.SimpleElasticsearchRepository]: Constructor threw exception; nested exception is org.springframework.data.elasticsearch.UncategorizedElasticsearchException: Elasticsearch version 6 or more is required; nested exception is ElasticsearchException[Elasticsearch version 6 or more is required] ... Caused by: org.elasticsearch.ElasticsearchException: Elasticsearch version 6 or more is required at org.elasticsearch.client.RestHighLevelClient.performClientRequest(RestHighLevelClient.java:2701) ~[elasticsearch-rest-high-level-client-7.17.3.jar:7.17.3]
6. OpenSearch集群版本信息
直接访问集群端点返回信息显示,当前集群为OpenSearch 1.2.4版本:
{ "name": "5a8d2c313919cc9hjh3287ehje872", "cluster_name": "3873287387:my-test-cluster", "cluster_uuid": "shas_asjasihhjdjhq", "version": { "distribution": "opensearch", "number": "1.2.4", "build_type": "tar", "build_hash": "unknown", "build_date": "2022-04-18T07:00:42.948341Z", "build_snapshot": false, "lucene_version": "8.10.1", "minimum_wire_compatibility_version": "6.8.0", "minimum_index_compatibility_version": "6.0.0-beta1" }, "tagline": "The OpenSearch Project: https://opensearch.org/" }
报错和集群实际兼容能力无关,核心是客户端的硬编码校验逻辑问题:
当前引入的Elasticsearch 7.17.3版本RestHighLevelClient内置了版本校验规则,请求集群后会读取返回值里的version.number字段,只有识别到版本号属于Elasticsearch 6.x、7.x序列才会正常运行。对接OpenSearch 1.2.4集群时,客户端读取到的版本号为1.2.4,直接判定为版本低于6.0,就抛出了该错误。
- 优先选择替换为OpenSearch官方客户端(生产环境推荐)
OpenSearch官方提供了适配Spring Data Elasticsearch的高版本客户端,完全兼容现有Spring Data Elasticsearch API,不需要修改业务逻辑:- 移除原有Elasticsearch客户端依赖,引入OpenSearch官方适配依赖,版本和集群1.2.4版本对齐
- 调整配置类,将原有Elasticsearch RestHighLevelClient替换为OpenSearch对应的客户端,凭证、访问端点配置保持不变即可
- 同步修正YAML配置缩进、Repository扫描包路径两个配置错误
- 临时兼容方案(仅用于测试环境)
如果不想替换依赖,可以在RestClient的HTTP配置中添加响应拦截器,修改OpenSearch返回的版本字段:将distribution值改为elasticsearch,number值改为7.10.2(OpenSearch 1.x完全兼容ES 7.10.2版本API),绕过客户端的版本校验。该方案后续版本升级可能出现API不兼容问题,不建议生产使用。
内容的提问来源于stack exchange,提问作者Loui

