如何通过Spring Boot配置ClientConfiguration连接AWS Elasticsearch(基础认证)
问题描述
已成功部署AWS Elasticsearch,可通过终端curl命令(携带基础认证信息)完成操作:
curl -XPUT -u 'admin:xxxx' 'https://search-xxxxxxx-xxxxxxu.eu-west-1.es.amazonaws.com/xxxxx/_doc/1' -d '{"name": "product", "description": "crema..."}' -H 'Content-Type: application/json'
项目已引入依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
本地连接Elasticsearch的配置可正常运行:
@Configuration public class ElasticClient extends ElasticsearchConfiguration { @Override public ClientConfiguration clientConfiguration() { return ClientConfiguration.builder() .connectedTo("localhost:9200") .build(); } }
尝试多种配置(包括已弃用的RestHighLevelClient)均无法连接AWS Elasticsearch,想确认能否像curl那样通过Spring Boot结合基础HTTP认证实现连接,需获取正确的clientConfiguration()配置代码。
解决方案
完全可以通过基础HTTP认证连接AWS Elasticsearch,只需在ClientConfiguration中添加认证信息并启用HTTPS协议即可,修改后的配置如下:
@Configuration public class ElasticClient extends ElasticsearchConfiguration { @Override public ClientConfiguration clientConfiguration() { // 替换为你的AWS ES端点(无需带https://前缀) String awsEsEndpoint = "search-xxxxxxx-xxxxxxu.eu-west-1.es.amazonaws.com"; // 替换为你的基础认证用户名和密码 String username = "admin"; String password = "xxxx"; return ClientConfiguration.builder() .connectedTo(awsEsEndpoint) // AWS ES默认使用HTTPS,必须启用SSL配置 .usingSsl() // 对应curl命令中的-u参数,添加基础HTTP认证 .withBasicAuth(username, password) .build(); } }
关键配置说明
usingSsl():AWS Elasticsearch默认采用HTTPS协议,必须启用SSL,否则会连接失败withBasicAuth(username, password):直接对应curl命令中的基础认证参数,完成身份校验connectedTo():传入AWS ES的端点地址时,不要带https://前缀,ClientConfiguration会结合SSL配置自动处理协议
如果希望从配置文件读取参数(更符合Spring Boot最佳实践),可修改为如下形式:
@Configuration @ConfigurationProperties(prefix = "elasticsearch") public class ElasticClient extends ElasticsearchConfiguration { private String endpoint; private String username; private String password; @Override public ClientConfiguration clientConfiguration() { return ClientConfiguration.builder() .connectedTo(endpoint) .usingSsl() .withBasicAuth(username, password) .build(); } // 生成getter和setter方法 public String getEndpoint() { return endpoint; } public void setEndpoint(String endpoint) { this.endpoint = endpoint; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
随后在application.yml中添加配置:
elasticsearch: endpoint: search-xxxxxxx-xxxxxxu.eu-west-1.es.amazonaws.com username: admin password: xxxx
内容的提问来源于stack exchange,提问作者chiarotto.alessandro
相关产品推荐
相关产品推荐

