다디와 괴발개발

[AWS] CD 과정 중에 생긴 로드밸런서 대상그룹 draining, unhealthy 문제 본문

TroubleShooting

[AWS] CD 과정 중에 생긴 로드밸런서 대상그룹 draining, unhealthy 문제

아임다디 2022. 4. 3. 18:19

DevOps 2번째 프로젝트를 하면서 가장 골치아팠던 문제를 꼽자면 바로 CD 과정에서 대상그룹이 정신을 못차리고 계속 draining되거나 unhealthy가 되는 문제였다.

프로젝트에서 백엔드 CI/CD를 위해 Github Actions와 AWS의 ECR, ECS, CodeBuild, CodePipeline을 사용하였다.

image

보안그룹 문제


발생 시기

Mongo Docker 이미지를 ECS에 배포할 때 생겼던 문제

상황

DB 이미지를 ECS로 배포작업에 사용된 로드밸런서 대상 그룹이 계속 draining -> init 상태가 무한 반복되는 문제가 있었다.

원인

ECS 보안그룹에 Mongo를 연결하기 위한 27017 포트를 인바운드 규칙에 넣어주지 않아서 연결을 하지 못했던 것이다

해결

  1. ECS 클러스터 서비스 탭에 들어간 뒤, 세부 정보에서 보안 그룹을 클릭해준다.

  2. image

  3. 인바운드 규칙에서 사용자 지정 TCP27017 포트를 넣어준다.

  4. image

  5. 짜잔 우리 아이가 건강해졌어요

  6. image

포트 문제


발생 시기

서버를 ECS에 배포 시 대상 그룹이 unhealthy되는 문제

상황

서버 코드에 문제가 없고, 환경 설정을 다 제대로 설정했다고 생각했는데, 대상 그룹이 계속 unhealthy가 되어버렸다

원인

해당 ECS의 작업에서 로그를 확인해보니, 다음과 같은 메시지를 볼 수 있었다.

{"level":30,"time":1648821222620,"pid":18,"hostname":"ip-172-31-21-183.ap-northeast-2.compute.internal","msg":"Server listening at http://0.0.0.0:3000"}

서버 포트가 3000으로 열리고 있었는데, 나는 80 포트만 리스닝을 해주었다.
이걸 보고, 왜 킥오프 세션에서 크루분께서 3000포트로 설정하셔서 고생한 팀들이 있다라고 말씀하셨는지 알게되었다.

해결

AWS 건드리는 것 보다 서버 코드에서 80번 포트로 열리도록 바꿔주는게 낫겠다 싶어서 package.json의 코드를 수정해주었다.

  "scripts": {
    "test": "tap \"test/**/*.test.js\"",
    "start": "FASTIFY_ADDRESS=0.0.0.0 fastify start -l info -p 80 app.js",
    "dev": "FASTIFY_ADDRESS=0.0.0.0 fastify start -w -l info -P app.js"
  },

-p 옵션을 이용하여 80번 포트에서 열리도록 해주었다

image

fastify-cli 공식 문서에서 해당 내용을 확인할 수 있다!

image

우리 아이가 건강해졌어요^^

서버 코드 문제


발생 시기

역시나 서버 이미지를 ECS로 배포 할 때 생겼던 대상그룹 unhealthy 문제

상황

ECS 작업에서 로그를 보니, MongoServerError : AUthentication failed 라는 에러가 떴다.
몽고디비 연결이 안되는 문제.

원인

몽고디비 연결을 위한 서버 코드의 url 변수가 잘못되었다.
문제가 된 url : mongodb://아이디:비밀번호@로드밸런서주소:27017/데이터베이스이름

해결

집와서 데스크탑(윈도우)으로 MongoDB Compass에 저 url로 접속해보려 하니 같은 에러가 떠서 구글링을 해봤더니 27017/ 뒤에 baedal 때문에 안되는건가라는 직감이 들었고, 바로 제거한 뒤에 접속해보았더니 잘 접속됐다.

++ 추가
url을 통해 API 통신을 하기 위해서는 mongodb://아이디:비밀번호@로드밸런서주소:27017/데이터베이스이름?authSource=admin&authMechanism=SCRAM-SHA-1
로 해야 정상적으로 통신이 된다. 뒤에 부가적인 조건들때문에 에러가 떴던 것이다

결론


Deploy과정에서 문제가 생겼다면 확인해야 할 것

  • 보안 그룹
  • 리스닝 포트
  • 서버 코드

ECS 작업의 로그를 보고 어떤 문제인지 파악한다면 금방 해결할 수 있을 것이다.

번외


무한 Deploy의 시간 + 기도메타

image

Deploy 시간이 10분 넘어가서 포기하고 있었는데 15분 지나니까 갑자기 성공!

노션에 작성하는거랑 티스토리 마크다운에서 작성되는거랑 왜이렇게 보이는게 다를까ㅠㅠ 티스토리에서 자꾸 이상하게 수정된다