elasticsearch,Java,Amazon Web Services,Spring Boot,elasticsearch" /> elasticsearch,Java,Amazon Web Services,Spring Boot,elasticsearch" />

用于Elasticsearch/AWS的带Spring引导的Java API运行状况检查

用于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

我是我公司的软件工程实习生,我们使用AWS Amazon Web服务,EC2/ECS/Fargate/NLB,我的任务是为我们的Elasticsearch服务添加一个健康检查监视器到我们用Java w/Spring Boot/MVC/Maven编写的后端API。我按照这里的指南将弹簧执行器用于健康检查监视器,这相当简单:

您所要做的就是在SpringBoot中实现HealthIndicator接口,下面是我用基本代码创建的IndexExists类:

@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头不起作用这一事实。不确定这是否会导致问题。