github action CD파트 run time out

권태형·2023년 8월 15일
0

bnb Back-Server Project

목록 보기
30/31

CD run time out

이전 포스팅에 이어서 이제 정상동작하는 appleboy/ssh-action@master 에 정확한 스크립트를 작성하고, 미리 bash창에가서 pm2로 서버를 켜 둔 후 CD를 진행하였는데..

분명 문제가 없을거라 생각했는데 CD의 스크립트 동작이 10분이 넘어가며 run time out이 결과로 나왔다.

에러를 해결하면 또 에러가 나오고 그걸 또 해결하였더니 또 에러가 나왔다.. 윽..


ssh 상태확인 1/2 상태검사 통과 실패

왜 타임아웃이 걸린지 몰라서 bash창에서 ssh로 접속해보려고 하였으나 접속되지 않아서, AWS EC2인스턴스 상태를 확인하러 갔더니, 상태검사가 통과하지 못하고 있었다. -> 상태검사 통과 포스팅

이것 저것 찾아보니, 상태검사나 서버다운이 메모리부족에 의해서 생길 수 있다는 글이 많았다.

실제로 pm2로 서버를 미리 켜 두지않았을 때는 동작에 문제가 없었으나, pm2로 서버를 켜놓으면 서비스에 할당되는 메모리가 생겨서, build과정에서 사용할 메모리가 모자랄 수 있었다.


ssh: connection time out host IP port22

일단은 상태검사를 해결하고 다시 접속하려고 보니 이번에는 connection time out에러가 bash에서 발생햇다.

ssh로 똑같은 pem키를 이용해서 접근하는데도 왜 접속불가 에러가날까?

한참 헤매었는데 AWS EC2의 IP주소가 전혀다른 IP로 변경되어 있었다. 전혀 모르던 일이었는데 EC2의 IP주소는 서버가 다운되는 등 어떠한 문제로 갑자기 상태검사를 통과하지 못하게되고, 인스턴스를 종료 후 재시작을 할 경우 다른 IP주소를 할당해 준다고 한다.

따라서 내가 ssh -i pem키 우분투 @ IP주소 에서 IP주소가 전혀 달라졌기에 접근하지 못할 수 밖에 없었다.

이러한 문제를 해결하기 위해서 고정IP(탄력적IP)를 새로 설정해 주게 되었고, 이제서야 bash창에 다시 내 EC2에 접근할 수 있게 되었다. -> EC2 인스턴스 IP고정 포스팅


메모리 용량 부족 확인

다시 접속해서 pm2 list를 확인하고 pm2 delete 0를 이용해 프로세스를 제거하고 다시 pm2 start dist/src/main.js로 실행하고자 했으나 무한 재시작 하다가 pm2 상태가 error로 멈추었다.

pm2 logs를 이용해 로그를 확인해보니 노드 모듈이 깨진것을 확인할 수 있었다.

❗여기서 힌트를 얻었다. bulid가 아니라 ci과정에서 문제가 발생했다는 것을...

일단 pm2를 다시 실행하기 위해서 npm ci로 다시 설치를 해보았는데 문제가 없었다. 왜지?

npm run build또한 문제없이 동작하고, pm2 start dist/src/main.js로 다시 정상 동작 시키니 서버가 살아났다.

자! 이제 시작이다. 드디어 저번에 서버가 다운되기 이전의 상황까지 돌아왔다.

지금 서비스를 실행하는 중이라면 다시 다운되는 방식을 알아보기 위해서 똑같은 위험한 짓을 하지 않겠지만, 나는 개발을 위한 상황이기 때문에 어떻게 문제가 발생했는지 확인하고 싶었다.

pm2로 서비스를 실행하는 상황에서 yaml파일은 다음과 같은 스크립트를 순서대로 실행하다가 멈췄다.

	script: |
		export NVM_DIR=~/.nvm
		source ~/.nvm/nvm.sh
		cd thbnb
		cd TaeHyeongBnb
		git pull
		npm ci
		npm run build
		pm2 restart main

해당 스크립트를 직접 bash에서 따라해 보았다. 아니나 다를까 npm ci 과정에서 nodemoduls파일들을 설치받다가 90~95퍼쯤 설치상태가 멈추더니 그대로 굳어버렸다.

퍼센테이지(%)가 넘어가지 않아서 강제로 bash를 종료하고 다시 ssh로 접속해보고자 했지만,
ssh: connect to host 내 IP port 22: connection timed out으로 접속되지 않았다.

다시 EC2 인스턴스로 돌아가니 다시 상태검사 1/2상태가 되었다.

해당 상태검사의 원인을 확인하기 위해서 Ec2 인스턴스의 log를 확인해 보았는데, 이유가 무엇인지.. log를 기록하지 못하고 정상 접속된 내용만 남아있었다.

AWS 지식센터에서는 메모리가 부족하다면 다음과 같은 시스템 에러로그가 남는다고 했는데

내가 찾아본 내 인스턴스 로그에는 정상동작되는 내용만 남아있을 뿐이었다.

인스턴스를 껏다 키고 메모리상태를 실시간으로 확인하기위해 bash창을 2개 키고 둘다 같은 ssh로 접속했다.

이후 하나의 bash창은 그대로 접속해서 같은 스크립트를 실행하고, 나머지 하나의 bash창은
watch -n 1 free -h명령어를 통해 1초마다 새로고침 되며 현재 메모리 사용량을 모니터링 해보았다.

처음 아무것도 안했을 때 가용가능한 메모리 용량(available)은 대략 630MiB(메비바이트)!

이후 npm ci를 실행히 50까지 떨어지는 것을 확인했다. 대략 570MiB가 필요한 상황.

이후 npm run build에서 300~350MiB가 필요한걸 확인했고, pm2로 서버를 켜두면, 가용가능한 메모리 용량이 518MB까지 떨어지는 것을 확인했다.

그렇다면, CI/CD npm ci를 동작시킨다면 미리 pm2 서버가 켜져 있어야하고, 가용가능한 용량이 518MiB가 남는데, 필요한건 570MiB나 필요하기 때문에, 메모리용량이 부족해져서 서버가 멈추는 것 같다는 의심을 더 강하게 가지게 되었다.


메모리용량 문제 해결

메모리용량 부족에 의한 문제라 생각한 나는 ec2인스턴스 메모리증가 방법에 대해서 찾아보고 인스턴스 유형변경과, 스왑공간 할당 방법중에 스왑공간을 할당하여 이 문제를 해결해 보고자 햇다. - AWS EC2 인스턴스 메모리용량 증설 포스팅

메모리가 모자랄 때 사용할 수 있는 방법으로 Linux OS에서 스왑파일을 이용한 하드 디스크의 메모리 보조공간 활용 방법으로 ci과정이 발생하여도 메모리공간이 모자라지 않도록 하는 방법으로 효과가 있었다.

npm ci명령어를 수행하면 할당가능한 메모리용량이(available) 이 줄어들다가 50~100 MiB가 남으면 자동으로 Swap공간에서 공간 사용(used)이 발생한다. 기존에 한참 걸리다가 서버가 멈춰버리는 경우가 사라지고 일단 bash창에서 발생하는 문제는 해결할 수 있었다.

그럼 이제 CD도 정상적으로 동작할까?

드디어 CD가 정상 통과했다.

profile
22년 12월 개발을 시작한 신입 개발자 ‘권태형’입니다. 포스팅 하나하나 내가 다시보기 위해 쓰는 것이지만, 다른 분들에게도 도움이 되었으면 좋겠습니다. 💯컬러폰트가 잘 안보이실 경우 🌙다크모드를 이용해주세요.😀 지적과 참견은 언제나 환영합니다. 많은 댓글 부탁드립니다.

0개의 댓글