@GetMapping( "/" ) 在 Elastic Beanstalk 中不起作用,但在本地工作



My Elastic Beanstalk envrionement的健康状态为severe。我相信这是因为我没有进行健康检查。这可以在我的日志中看到:

/var/log/nginx/access.log
----------------------------------------
172.31.75.161 - - [08/Nov/2021:13:21:41 +0000] "GET / HTTP/1.1" 404 116 "-" "ELB-HealthChecker/2.0" "-"
172.31.75.161 - - [08/Nov/2021:13:21:41 +0000] "GET / HTTP/1.1" 404 116 "-" "ELB-HealthChecker/2.0" "-"
...
43 connect() failed (111: Connection refused) while connecting to upstream, client: 172.XX.XX.XX, server: , request: "GET / HTTP/1.1", upstream: "http://172.XX.XX.XX:8080/"

这是我的Docker文件:

# Build stage 
# 
FROM maven:3.8.1-jdk-8 
ADD src /tmp/src
ADD pom.xml /tmp/pom.xml
RUN mvn -f /tmp/pom.xml clean package
#
# Package stage
#
FROM openjdk:8
COPY --from=0 /tmp/target/para-host-0.0.1-SNAPSHOT.jar /usr/local/lib/para.jar
EXPOSE 5000
ENTRYPOINT ["java","-jar","/usr/local/lib/para.jar"]

所以我的Spring Boot应用程序在5000端口上运行。这在本地和Elastic Beanstalk中都有效。

到目前为止我已经尝试过我已经尝试使用此依赖项来添加健康检查功能:

<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-actuator
</artifactId>
</dependency>

在那之后,我能够在本地运行服务器,并像这样到达端点:http://localhost:5000/actuator/health并得到响应:

{
"status": "UP"
}

(这甚至是一个状态代码吗?(

这就是它损坏的地方在我的Elastic Beanstalk环境中的负载均衡器中,它说我的健康检查路径是/。如果我将该值编辑为/actuator/health/,那么它只是返回到/。我试过很多次,甚至试过删除它并创建一个新的。没有什么所以我放弃了。相反,我想,我只需要让路径/返回健康检查的状态代码。

所以我做了这个:

@GetMapping("/")
public ResponseEntity<String> dummyMethod() {
return new ResponseEntity<>("Hello from Dummy-Root-Method", HttpStatus.OK);
}

认为现在当健康检查被调用时,它会成功,但这也不起作用。如果我在本地运行服务器,我可以到达/端点,但当它在Elastic Beanstalk中时,它会认为路径不存在。但是,我的其他端点DO可以工作。以下是工作端点(getGroupResults(和非工作端点(dummyMethod(的片段:

@GetMapping("/get-group-results")
public ResponseEntity<String> getGroupResults(@RequestBody ObjectNode objectNode)
throws IOException, AddressException, MessagingException {
String groupFolder = objectNode.get("group").asText();
String sendToEmail = objectNode.get("email").asText();
logger.info("Attempting to get results from folder: {}", groupFolder);
String attachmentPath = Test.getMapFromGroupFolder(groupFolder).getAbsolutePath();
String subject = "Results from parallenium";
MailService.sendEmailWithAttachment(sendToEmail, attachmentPath, subject);
return new ResponseEntity<>("Successfully sent results email", HttpStatus.OK);
}
/**
* Dummy response for ELB so we do not receive errors
* 
* @return
*/
@GetMapping("/")
public ResponseEntity<String> dummyMethod() {
return new ResponseEntity<>("Hello from Dummy-Root-Method", HttpStatus.OK);
}

这是我在Elastic Beanstalk中尝试命中/actuator/health/端点时得到的响应,类似于http://para-server.us-east-1.elasticbeanstalk.com/actuator/health:

{
"timestamp": "2021-11-08T16:56:20.785+00:00",
"status": 404,
"error": "Not Found",
"path": "/"
}

同样,这在本地有效。为什么?

摘要。我能做什么

  1. 为什么我不能在Elastic Beanstalk控制台中更改健康检查的路径
  2. 为什么根路径/在本地工作,但在我的Elastic Beanstalk环境中不工作

我只是希望我的环境不要变成红色。它运行良好,但有健康检查错误。

验证Beanstalk是否正在运行最新版本的代码。可能仍在使用添加新映射之前启动的容器。

问题是,尽管我通过EBS CLI部署了一个新版本,但它实际上并没有部署我的最新更改。如果项目中有git设置,那么它将只部署最后一次提交。所以我不得不提交我的更改,然后重新部署它并开始工作。

最新更新