이번 미니프로젝트를 겪으면서 가장 절실했던 한가지 기능이 있었다.. 그것은 바로 CI/CD였다. 나는 아침엔 피곤하고 밤에는 살아나는 올빼미형이기에 주로 새벽까지 코드를 짜고 아침에는 잠을 더 자는데 문제는 혼자만 하는 프로젝트가 아닌 팀과 같이 하는 프로젝트였기에 배포를 담당한 나는 팀원이 푸쉬했다고 배포해달라고 하면 자다가도 배포를 해줘야하는 상황이 있었다. 그래서 CI/CD가 너무나도 절실했고 구현을 했다.
먼저 github actions을 이용해서 우리의 프로젝트를 이미지를 만든 후 ecr에 푸쉬하고 푸쉬된 이미지를 ecs를 통해서 ec2안에서 컨테이너로 돌렸다. 말로는 간단하고 쉬웠지만 여러가지 문제점이 있었다.
첫번째, env는 깃허브에 올릴 수 없으니 작업정의 컨테이너를 만들 때 직접 넣어줬는데 작업정의를 깃허브에 올리다보니 그대로 노출이 되었다. 우선 급하게 프라이빗으로 돌렸으나 코드 평가를 받아야하는데 프라이빗으로 되어있으니 코드 평가를 받지 못하는 상황이 되버렸다. 그래서 여러가지 방법을 검색해보았고 github actions secret을 이용하는 방법도 있었고 parameter store를 쓰는 방법도 있었다. 나는 파라미터 스토어를 이용했고 파라미터를 만든 후 arn을 작업 정의 secret에 넣어주는 방식으로 해결했다. 그러나 arn의 노출이 되고 매니저님은 arn이 노출되면 안 되지 않느냐라고 지적을 해주셨다. 개인적으로 arn은 노출되도 큰 상관이 없지않을까 라고 생각했지만 다른 방법을 생각해보았다.
간단하게 생각해보면 여기서 문제는 작업정의 파일이다. 작업정의 파일 자체를 노출이 되지않게 해버리면 해결되는 문제였다. 그러면 작업정의 파일 자체를 github actions secret에 저장하면 파라미터 스토어를 쓰지않아도 되고 작업정의 파일을 gitignore 처리하고 환경변수가 추가될때마다 github actions secret만 수정하면 되는 것이다. 하지만 github actions secret은 json 파일을 입력하지 못 한다고 한다. 그래서 해결책으로 create json을 쓸거고 아직 github actions secret에 권한이 없어서 행하지는 못 했지만 권한을 받는 즉시 한번 해볼려고 한다.
두번째, ec2를 이용해서 컨테이너를 돌리다보니 새로운 배포가 될려고 하면 포트 번호가 겹쳐버려 오류가 나는 상황이 만들어졌다. 서버는 꺼지면 안 되기에 기본 서버가 계속 돌아가고 새로 배포된 서버가 준비가 다 되면 기본 서버가 꺼지는 배포 방법이기에 일어나는 오류였다. 방법을 찾아본 결과 동적 포트 매핑을 이용하면 해결되는 문제였다. 작업 정의에 호스트 포트를 0으로 주면 새로운 컨테이너가 돌아갈 떄 49153~65535 및 32768~61000에서 자동으로 매핑을 해주고 우리는 로드밸런서를 통하여 자동으로 타겟그룹에 등록하여 연결되게 구현하였다. 이렇게하면 새로 배포되도 배포가 다 되면 알아서 로드밸런서의 타겟그룹이 바뀌기 때문에 https을 적용해두면 적용시켜둔 도매인 주소로 새로 배포된 서버에 요청을 보낼 수 있게 되면 완전한 자동화가 완성된다.
세번째, 알수없는 이유로 정상적인 컨테이너가 자꾸 꺼졌다. 처음에 env 처리를 할 때였다. 정상적으로 파라미터 스토어에서 값을 받아온걸 확인하고 폴더구조를 변경 및 추가하여 배포를 하였고 여기서부터 컨테이너가 자꾸 재시작 되었다. 나는 이미지에 오류가 있어 자꾸 재시작이 되는거라고 추측하였고 변경한게 폴더 구조였기에 루트폴더에서 다른 폴더로 옮겨서 환경변수를 못 읽어와서 에러가 난다고 추측하였다. 그래서 ecr에 배포된 이미지를 받아와 로컬에서 돌려본 결과 환경변수를 못 읽어오는걸 확인하였다. 그래서 다시 폴더구조를 정상적으로 동작했던 곳으로 돌렸고 정상적으로 포트 번호를 읽어오는 것을 확인하였고 컨테이너 또한 정상인걸 확인하였지만 알 수 없는 이유로 자꾸 컨테이너가 재시작 되는걸 확인하였다. 문제는 에러가 난다고 해도 작업의 원하는 상태는 RUNNING이어야 자꾸만 STOPPED로 바뀌었다.그래서 작업정의, 클라스터, 서비스를 모두 다시 설정해보았으나 같은 현상이 반복되었다. 마지막으로는 컨테이너를 돌리는 ec2의 문제가 아닐까 싶어 ec2를 끄고 다시 돌려보니 정상적으로 동작되었다. 왜 ec2에 이런 현상이 일어나는지 알아보기위해 폴더 구조를 하나 변경하고 배포하고 확인하고 다시 변경하고 배포하는 행동을 반복하였고 모두 정상적으로 동작했다. 이유는 알 수 없지만 추측하기론 ec2 내부에서 문제가 생겼던것같다.
우선 수많은 에러를 겪으면서 CI/CD를 구축해놨고 이제는 코드만 작성하고 푸쉬하고 화장실을 가던 커피 한잔 마시러 가면 된다. 많은 에러를 겪였지만 정말 하나도 빠짐없이 중요한 경험치였고 ECS 배포에 대해서는 조금은 자신감이 붙은거 같다.

'TIL' 카테고리의 다른 글
| PresignedURL S3 - Lambda image Resizing (0) | 2023.01.15 |
|---|---|
| nodemailer + AWS lambda (0) | 2023.01.04 |
| CORS (0) | 2022.12.18 |
| Decoupling, Component 패턴 (0) | 2022.12.15 |
| SQL과 noSQL 차이 (0) | 2022.12.11 |