用于Elasticsearch/AWS的带Spring引导的Java API运行状况检查
我是我公司的软件工程实习生,我们使用AWS Amazon Web服务,EC2/ECS/Fargate/NLB,我的任务是为我们的Elasticsearch服务添加一个健康检查监视器到我们用Java w/Spring Boot/MVC/Maven编写的后端API。我按照这里的指南将弹簧执行器用于健康检查监视器,这相当简单: 您所要做的就是在SpringBoot中实现HealthIndicator接口,下面是我用基本代码创建的IndexExists类:用于Elasticsearch/AWS的带Spring引导的Java API运行状况检查,java,amazon-web-services,spring-boot,
elasticsearch,Java,Amazon Web Services,Spring Boot,
elasticsearch,我是我公司的软件工程实习生,我们使用AWS Amazon Web服务,EC2/ECS/Fargate/NLB,我的任务是为我们的Elasticsearch服务添加一个健康检查监视器到我们用Java w/Spring Boot/MVC/Maven编写的后端API。我按照这里的指南将弹簧执行器用于健康检查监视器,这相当简单: 您所要做的就是在SpringBoot中实现HealthIndicator接口,下面是我用基本代码创建的IndexExists类: @Component public clas
@Component
public class IndexExists implements HealthIndicator {
private final ESClient esClient;
private static final Logger LOGGER = LoggerFactory.getLogger(IndexExists.class);
@Autowired
public IndexExists(ESClient esClient) {
this.esClient = esClient;
}
@Override
public Health health() {
try {
if (!esClient.hasIndex(Indices.INDEX_ASSETS)) {
return Health.down().withDetail("index", Indices.INDEX_ASSETS + " index does not exist").build();
}
} catch (IOException e) {
LOGGER.error("Error checking if Elasticsearch index {} exists , with exception", Indices.INDEX_ASSETS, e);
}
return Health.up().withDetail("index", Indices.INDEX_ASSETS + " exists").build();
}
}
此外,我为要测试的本地主机和开发环境添加了RESTURI。我使用postman测试API执行器/健康端点,它在本地工作。此配置代码设置在我们的application.yml文件中,下面是一个屏幕截图:
然而,一旦我将构建部署到dev,它就失败了,我正在尝试调试。另一位工程师让我查看AWS日志,有一堆拒绝连接的消息。这位工程师告诉我,他认为url的格式应该是https://前缀???在上面的application.yml文件截图中,或者与导致连接被拒绝的安全/特权有关的内容。这里是AWS日志的一部分,它基本上会导致一个无限循环,因为健康检查失败,Fargate/LB/ECS试图制造更多容器,因为它不断失败工程师说了这样的话,我仍然在学习AWS,如果我屠宰了它,我很抱歉:
我知道这是一个长期的尝试,但我希望有AWS/Elasticsearch经验的人之前可能会设置一个健康监视器端点,然后遇到这样的问题。。。。如果有人需要我提供更多信息,我很乐意帮助。这是我实习时的第一个用户故事,我不想失败。我已经编写了所有代码,看起来很合理,但是我在AWS上遇到了这个网络/连接问题,除非我的配置设置应用程序.yml中有一个我丢失的小错误。首先,实际上我不会在elasticsearch的应用程序中进行健康检查,AWS有办法监视elasticsearch,群集运行状况等。如果您的状态为红色,则表示它们至少存在一个红色索引。所有索引都应该是绿色的,如果有红色索引,则需要从快照还原它。你的应用程序可以假设es一直都是健康的。如果调用失败,请使用log.error记录该调用。您可以在Kibanna中创建一个仪表板,该仪表板可以监视对ES的这些调用,以了解这一切的进展情况 至于连接到es,这取决于您使用的是公共端点还是VPC端点 VPC端点 如果使用VPC endpoint,则需要具有正确的安全组配置,因此连接到es群集的安全组需要允许来自应用程序的流量。令人困惑的是,您正在es中看到您的日志,但它们很可能来自logstash实例,因此您的应用程序正在连接logstash而不是es。检查应用程序的安全组是否包含在es群集安全组的允许部分中 公开的
如果是公用es,则您需要在应用程序上具有正确的iam权限才能连接。检查应用程序的角色是否有权访问es:{TODO}对于您的域,您可以找到策略。我对应用程序进行了错误配置。yml,它应该是:
spring:
elasticsearch:
rest:
uris: ["aws-dev-url"]
这就解决了我的问题。今天,一位工程师告诉我x-api-key头不起作用这一事实。不确定这是否会导致问题。