삽질을 끝내고 드디어 ecs에서 정상적으로 배포를 성공했다 ㅎㅇㅎㅇㅎㅎㅎㅇㅎㅇ
docker container가 정상적으로 동작하는지 로컬에서는 테스트해보았지만 실제 EC2에서는 테스트할 방법을 찾지 못해 실제 환경에서 docker container가 뜨는지 알 수 없었다.
ecs service에 연결한 alb가 unhealthy를 반환하여 계속해서 task가 죽어버렸지만 이유를 찾지 못했다.
ecs가 어떻게 ecr의 이미지를 가져와 ec2에서 컨테이너로 관리해주는지 원리를 알지 못했다.
public subnet에 bastion host를 두어 ssh를 통해 접속한 뒤, private subnet에 있는 ec2에 한번더 ssh를 통해 접속하여 ecs container instance 내에 직접 접속할 수 있었다.
2번 문제점에는 내가 생각하기에 크게 두가지 문제가 있었다.
보안그룹 설정 문제
docker container가 container instance에서는 잘 뜨지 않는 문제
1번 문제의 경우 alb 에서오는 모든 트래픽을 container instance 가 받을 수 있도록 인바운드 설정을 해주어 해결하였다.
2번 문제의 경우 로컬에서는 docker container가 잘 뜨지만 ec2에서는 잘 뜨지 않았다.
docker container가 환경에 따라 다르게 동작하는가?
-> 운영체제가 VM을 띄우는 방식이 다를 것이므로 로컬에서 잘 빌드된 이미지더라도 환경에 따라 다른 결과를 나타낼 수 있었다.
-> docker command에 --platform linux/amd64 옵션을 주어 ec2와 동일한 운영체제 상에서 이미지를 빌드하여 해결할 수 있었다.
docker image를 ecr에서 제대로 받아오지 못하는가?
-> 확인한 결과, ecr repository의 url을 ecs task에 지정하고 사용하였는데, latest image를 제대로 받아오지 못하는 문제가 있음을 확인하였다. (xxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/backend)
-> docker image 의 url을 사용하여 문제를 해결하였다. (xxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/backend:latest)
ecs가 ec2 container instance를 인식하는 방법
ecs-optimized AMI를 사용하여 ec2를 띄우면 container instance로 알아서 인식이 된다.
해당 ec2에 들어가 docker ps 를 입력해보면 ecs-agent 라는 container가 동작하고 있다.
해당 container가 ecs, ecr 과의 연결 등 모든 부분을 처리해준다
아직 nginx, spring 만 구성하였기에 front와의 연동을 제대로 확인하지 못했다.
하나의 ec2 내에서 여러 task가 실행될 때, spring container의 port를 고정 값으로 주었기 때문에 사용중인 port라는 에러 메시지와 함께 task가 죽어버린다.
ecr에 이미지가 변경되어도 ecs에서 감지하여 재 배포를 하지 못한다.
github action을 통해 ecr에 이미지를 업로드하는 과정을 자동화하지 못했다.
다음편에 계속...