【问题标题】:Java API Health check with Spring Boot for Elasticsearch/AWS使用 Spring Boot 对 Elasticsearch/AWS 进行 Java API 运行状况检查
【发布时间】:2020-04-06 09:45:48
【问题描述】:

我是我公司的一名软件工程实习生,我们使用 AWS(亚马逊网络服务)、EC2/ECS/Fargate/NLB,我的任务是为我们的 Elasticsearch 服务添加一个运行状况检查监视器到我们的后端 API使用带有 Spring Boot/MVC/Maven 的 Java 编写。我按照此处的指南将 Springs 执行器用于运行状况检查监视器,这非常简单: https://www.amitph.com/custom-health-check-spring-boot-actuator/

您所要做的就是在 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();
    }
}

此外,我为 localhost 添加了 rest Uris 以进行测试和开发环境。我使用邮递员测试 API 执行器/健康端点,它在本地工作。此配置代码在我们的 application.yml 文件中设置,这是一个屏幕截图:

但是,一旦我将构建部署到 dev,它就失败了,我正在尝试调试。另一位工程师让我查看 AWS 日志,并且有一堆“连接被拒绝”消息。工程师告诉我,他认为它要么是 application.yml 文件(上面的屏幕截图)中 uri 的格式(url 是否应该有 https:// 前缀???),要么与导致连接被拒绝的安全/特权有关.这里是AWS日志的一部分,基本上导致了无限循环,因为健康检查失败,Fargate/LB/ECS因为一直失败而试图制造更多的容器(工程师说了这样的话,我还在学习AWS,很抱歉如果我杀了那个):

我知道这是一个很长的机会,但我希望具有 AWS/Elasticsearch 经验的人之前可能设置了一个运行状况监控端点并遇到了这样的问题......如果有人需要我提供更多信息,我很高兴帮助。这是我实习时的第一个用户故事,我不想失败。我已经编写了所有代码,而且看起来很合理,但我遇到了 AWS 的网络/连接问题,除非我的配置设置 (application.yml) 中有一个我遗漏的小错误。

【问题讨论】:

  • 一位工程师今天向我更新了一个事实,即“x-api-key”标头无法正常工作。不确定这是否会导致问题。

标签: java amazon-web-services spring-boot elasticsearch


【解决方案1】:

首先,实际上我不会在弹性搜索应用程序中进行健康检查,AWS 有办法监控弹性搜索、集群运行状况等。如果您的状态为红色,则意味着它们至少存在一个红色索引。所有索引都应该是绿色的,如果有红色索引,您需要从快照中恢复它。您的应用程序可以假设 es 一直是健康的。如果呼叫失败,请使用log.error 记录它。您可以在 Kibanna 中创建一个仪表板,它可以监控这些对 ES 的调用,以了解这一切是如何进行的。

至于连接到es,这取决于您使用的是公共端点还是 VPC 端点。

VPC 端点 如果您使用 VPC 终端节点,您需要具有正确的安全组配置,因此附加到您的 es 集群的安全组需要允许来自您的应用程序的流量。令人困惑的是,您在es 中看到了您的日志,但它们很可能来自logstash 实例,因此您的应用程序连接到logstash 而不是es。检查您的应用的安全组是否包含在您的es 集群的安全组的允许部分中。

公开

如果它是公开的es,那么您需要对您的应用拥有正确的iam 权限才能连接。检查您的应用角色是否有权访问您的域的es:{TODO},您可以找到政策online

【讨论】:

    【解决方案2】:

    我的 application.yml 配置错误,应该是:

    spring:
      elasticsearch:
        rest:
          uris: ["aws-dev-url"]
    

    这解决了我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多