AWS App Runner 배포 시 health check 실패로 Create failed가 뜨는 경우

AWS App Runner로 새로운 어플리케이션을 배포 하던 도중 health check가 실패하면서 서비스가 Create failed로 뜨면서 생성이 되지 않았습니다. 다른 어플리케이션 배포 시에는 문제가 없었던 것 같은데 왜 그런걸까요?
2023.03.21

AWS App Runner로 새로운 어플리케이션을 배포 하던 도중 health check가 실패하면서 서비스가 Create failed로 뜨면서 생성이 되지 않았습니다. 다른 어플리케이션 배포 시에는 문제가 없었던 것 같은데 왜 그런걸까요?

원인

AWS App Runner로 배포를 하는 경우에 기본적으로 AWS App Runner가 헬스 체크를 실시하고, 헬스 체크를 실패하면 서비스 생성을 취소합니다.

헬스 체크가 실패하면 아래와 같은 로그와 아이콘이 뜨게 됩니다.

03-21-2023 11:46:28 AM [AppRunner] Deployment with ID : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx failed. Failure reason : Health check failed.
03-21-2023 11:46:15 AM [AppRunner] Health check failed on port '8080'. Check your configured port number. For more information, read the application logs.
03-21-2023 11:39:59 AM [AppRunner] Performing health check on path '/' and port '8080'.
03-21-2023 11:39:48 AM [AppRunner] Provisioning instances and deploying image for publicly accessible service.
03-21-2023 11:39:36 AM [AppRunner] Successfully copied the image from ECR.
03-21-2023 11:37:30 AM [AppRunner] Deployment Artifact :- Repo Type: ECR; Image URL : xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/health-check-fail; Image Tag : latest
03-21-2023 11:37:30 AM [AppRunner] Deployment with ID : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx started. Triggering event : SERVICE_CREATE

그러면 헬스 체크를 어떻게 하고 있는 걸까요?

AWS App Runner가 기본적으로 동작하는 헬스 체크는 아래와 같습니다.

위 형태의 path에 요청을 하고 요청이 실패하면 헬스 체크되지 않는다고 판단하는게 됩니다.

그러면 어떻게 하면 고칠 수 있을까요.

고치기

경로

헬스 체크를 성공시키기 위해서는 헬스 체크 path에 요청이 성공해야 합니다.

AWS App Runner가 헬스 체크하는 기본 path를 변경하고, 해당 path에 요청을 성공시키게 합시다.

아래와 같이 특정 경로를 성공시키는 방법이 있겠네요.

import type { FastifyInstance } from "fastify";

/**
 *
 * Require for health check in aws app runner
 */
export default async function HealthCheckController(fastify: FastifyInstance) {
  fastify.get("/health-check", async (req, rep) => {
    rep.code(200).send(`health check OK! ${Date().toLocaleString()}`);
  });
}

포트

또 하나 포트가 잘못되어 있는 경우가 있는데요. AWS App Runner 생성 시에 기본 포트를 설정할 수 있습니다. 자신이 생성한 컨테이너에서 노출한 포트와 동일하게 해주시면 되겠습니다.

기본으로는 8080으로 설정되어 있기 때문에 자신의 컨테이너에 맞게 설정해주시면 됩니다.

기본적으로 확인하는 경로가 / 이기 때문에 프론트엔드를 배포하는 경우는 인식 못하고 지나갈 경우가 있습니다. (제가 그랬습니다 ???)