안녕하세요,
이번 포스팅에서는 AWS EC2 프리티어 환경에서의 서버 배포를 위해 AWS CodePipeLine, CodeBuild, CodeDeploy를 도입한 것에 대한 사용 배경 및 팁을 공유하고자 합니다.
개발 내용에 대한 리뷰를 목표로 작성하였으며, 실습을 통해 AWS CodeBuild, CodeDeploy를 적용하고자 하시는 분들은 다음 포스팅을 참고해보시길 추천드립니다.
- 이동욱 개발자님의 AWS로 배포하기 시리즈 (Java) - https://jojoldu.tistory.com/281
- 개발쨔 우미님의 AWS CI/CD 구축하기 (Node.js) - https://senticoding.tistory.com/91
사용 배경 - 프리티어에선 서버 빌드가 너무 무거워요..
최근에 간단한 웹 프로젝트를 개발하게 되었습니다. node.js로 백엔드를 설계하였고, 서버 개발 후 배포를 하려는데 문제가 생겼습니다. 서버 빌드 과정에서 프리티어의 AWS EC2 서버가 멈춰버리는 것이었습니다.
주요 증상은 다음과 같습니다.
- EC2 콘솔에서 장시간(수 분 이상)CPU 점유율 100% 유지
- 서버 SSH 접속 불가
- 기존 접속 SSH 세션에서 터미널 조작 불가. 시간 경과 후 접속이 종료됨
해당 케이스는 보통 서버 메모리 부족으로 발생합니다. 속된 말로 똥컴이라는 것이지요.. -_-;; 무료로 사용하는 메모리 1기가 짜리 프리티어라 어쩔 수 없습니다. 구글링해보니 이미 겪어보신 분들이 많이 계시더군요.
서버 빌드 과정에서 발생하는 메모리 부족 문제
에 대해서 제가 검토했던 방법은 다음과 같습니다.
1. 스왑 공간을 생성한다. (프리티어는 메모리 1기가이며, 2기가 스왑 생성이 권장됨)
2. 서버 외부에서 빌드 및 배포가 수행될 수 있도록 CI/CD를 구축한다. (젠킨스, AWS CodeDeploy 등)
첫 번째 방법은 리눅스 메모리 스왑 공간을 생성하는 것인데요, 스왑이란 RAM으로만 사용하던 메모리 공간이 부족할 때 HDD에 할당하여 사용하는 메모리 공간을 말합니다. 심플하고 빠르게 적용할 수 있는 방법이지만, 서버의 퍼포먼스가 저하된다는 단점이 있습니다. RAM에 비해 속도가 느린 HDD로 인해 서버의 I/O 속도가 느려지게 되는 것이죠.
퍼포먼스 이슈는 너무 큰 단점이라고 판단하여, 결국 두번째 방법인 CI/CD를 통해 서버를 배포하게 되었습니다. CI/CD 설정을 위한 개발 비용이 발생하지만 서버의 퍼포먼스를 떨어뜨리지 않으며, 일단 구축해두면 서비스 배포 과정이 정말 간단해지기 때문입니다. 깃헙 푸시하는 것만으로 테스트 및 배포가 완료되니까요.
AWS CI/CD 도입에 대한 팁
- CI, CD 각 단계 별로 확실하게 성공 여부를 확인해야 합니다.
- CI인 CodeBuild에서는 의도한대로 빌드 파일이 생성이 됐는지, (테스트 코드를 작성했다면) 테스트코드가 의도대로 됐는지, 실제로 서버에서 실행이 되는 빌드 파일인지 확인하여야 합니다.
- CD인 CodeDeploy에서는 빌드 후 만들어진 artifact 파일에 누락된 파일이 없는지 확인합니다.
- 배포할 서버와 CodeDeploy에 적절한 권한, IAM Role이 설정되어있는지 확인합니다. IAM Role이 안 맞으면 빌드 후 S3로 저장할 때, S3에서 EC2로 배포할 때 등의 과정에서 권한, 역할 관련 에러가 발생할 수 있습니다.
지금까지 AWS CodeDeploy, CodeBuild를 적용하게 된 배경과 팁에 대한 포스팅이었습니다. 보통 CI/CD는 자동화와 편리성 측면에서 검토하게 되는데, 퍼포먼스 관련해서도 해결책으로 검토할 수 있음을 배울 수 있었네요. 감사합니다. 피드백은 언제나 환영입니다 :)
'Infra > git | devOps' 카테고리의 다른 글
리눅스 환경에서 git 사용법 (0) | 2018.10.09 |
---|