Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

마로의 개발일지

Vertical-api 장애 회고 본문

기록

Vertical-api 장애 회고

maro0201 2023. 4. 8. 09:39

 22년 3월 아무 문제 없이 잘 돌아가던 Vertical-api에 장애가 발생했다. 새로운 버티컬 페이지가 배포된 다음날이었다. 처음엔 테스트도 문제없이 잘 돌아가고 로직을 수정한 게 아니라 단순히 페이지만 추가했을 뿐인데 에러가 나는 게 이상했다. 상대적으로 이전과 차이 나는 건 트래픽이 좀 더 늘었다는 것이었고, 들어갈 때마다 발생하는 게 아니라 간헐적으로 발생했기에 AWS Lambda 자체의 오류라고 생각했다. 지금 생각하면 정말 멍청한 생각이었다. 겨우 그 정도 트래픽이 늘어난 것 때문에 장애가 발생할 서비스가 아닌데 말이다.

 

당시 상황

하필 장애가 났을 땐 팀장님이 휴가를 간 상태였고 오랫동안 기다리던 휴가였기 때문에 방해하고 싶지 않았다. 팀장님을 제외한 다른 팀원분들은 serverless framework에 대해 잘 알지 못하는 상황이었고, 게다가 코로나가 심해져 재택을 하고 있던 상황이었다. 집에서 혼자 부서진 멘탈을 추스르며 내가 만든 서비스를 책임지고 고쳐야겠다고 마음먹었다.

 

원인파악

 AWS Lamda의 CloudWatch를 통해 에러 로그를 확인했다. 

ConnectionError [SequelizeConnectionError]: getaddrinfo EMFILE {DB주소}

해당 문구가 뜨면서 DB연결이 안 되는 것 같았고 DB를 담당하는 팀장님에게 문의를 드렸다. 하지만 DB는 아무런 문제 없이 잘만 작동하고 있었다. 담당 팀장님과 팀의 시니어분이 DB 커넥션이 제대로 닫히지 않아서 생기는 문제라고 조언을 해주셨지만 sequelize는 코드상에서 제대로 닫고 있었고 이것저것 수정해 봤지만 소용이 없었다.

 

결국 서비스 비활성화

 금방 해결할 수 있었던 문제가 점심시간까지 해결이 되지 않자 결국 서비스를 일단 비노출처리하기로 했다. 여기서 나의 멘탈은 한 번 더 금이 갔고, 어떻게든 빨리 해결해야 한다는 생각과 내가 꼭 해결하고 싶다는 생각이 합쳐져 정상적인 사고를 하지 못했다. 그때까지도 코드에 대한 의심은 하지 않았다. 전에도 잘 돌아가던 코드였고 이제 와서 문제가 생긴다면 다른 곳에서 생긴 문제라고 생각했다. 

 

부하 테스트 거기서 하는 거 아닌데

 일단 트래픽이 몰릴 때 발생하는 에러니 스트레스 테스트를 진행하고자 했다. 이 생각까지는 좋았다. 하지만 이 테스트를 운영 환경에서 하면 안 됐었다... vertical-api의 호출수가 많아짐에 따라 다른 lambda들도 영향을 받았고 결국 다른 서비스들에까지 영향이 갔다. 회사에 나와있던 시니어분으로부터 전화가 왔고 그때서야 "아... 나 뭐 한 거지?"라는 생각이 들었다. 내 멍청한 짓으로 인해 회사 서비스의 일부가 일시적으로 정지됐고 결국 티켓을 끊어 AWS에 문의하기로 했다.

 

내가 싼 똥은 내가 치운다

 밥도 먹지 않은 채 열심히 했지만 돌아온 결과는 아무것도 없었다. 내가 한 삽질들로 인해 주변만 더러워져 있었을 뿐. 티켓을 끊었으니 곧 원인 파악이 될 거라는 안도감과 문제를 해결하지 못했다는 자책을 하며 30분 정도 멍하니 책상에 앉아 가만히 있었다. 그러다 문득 이대로 끝내면 너무 아쉬울 것 같았고 내 잘못은 내가 해결하고 싶었다. 답변이 오기 전까지라도 열심히 해보자라는 생각이 들었다. 다른 팀의 serverless framework를 사용하는 분에게 물어보면서 개발 환경에서 부하 테스트를 진행했다. 개발 환경에서도 동일 한 현상이 나타났고 코드에서 의심 가는 부분을 하나하나 지우고 배포한 뒤 테스트를 진행했다. 결국 원인은 Redis 연결을 제대로 닫지 않아서 생긴 문제였고 저녁때가 다 되어갈 때쯤 코드 수정 및 배포를 통해 다시 서비스를 활성화할 수 있었다.

 

후기

에러가 발생하면 일단 침착하자

- 당황해서 허둥지둥 대다가 문제를 제대로 살피지  못해 많은 실수들을 했었고 빨리 해결해야지 하는 마음만 앞서 당연히 해야 하는 것들을 많이 놓쳤던 것 같다. 가장 좋은 건 에러가 발생하지 않는 것이지만, 언제나 예상치 못한 에러는 발생하기 마련이기 때문에 좀 더 에러 상황에 익숙해질 필요가 있다고 느꼈다. 익숙해지면 좀 더 침착해지고 잘 대처할 수 있게 되지 않을까

가장 먼저 의심할 건 내 코드다

- 그동안 잘만 돌아가던 코드였고, 수정된 부분이 하나도 없었지만 가장 먼저 생각해야 하는 건 "내 코드가 잘못됐나?"라고 생각한다. 물론 그동안 실수하지 않기 위해 많은 노력을 해왔고 테스트도 많이 했기 때문에 아닐 수도 있다. 하지만 내가 만들 결과물이 완벽할 순 없기에, 항상 내가 만든 에러인지 의심해 보는 좋은 습관이 생겼다.

테스트는 개발 환경에서 하는 것

- 운영환경에서만 발생하는 에러더라도 개발환경에서 먼저 테스트를 진행해야 한다는 사실을 덕분에 뼈저리게 느꼈다. 변명할 여지없이 명백한 실수고 잘못이었다. 다음부턴 이러지 않을 것이다.

Comments