DevOps/AWS

[AWS] ECS를 통한 컨테이너 배포 with Docker hub

샤아이인 2022. 10. 9.

 

이번 글에서는 Amazon의 ECS를 사용해보고 정리하게 될 것이다.

 

1. ECS 기본

ECS는 4가지 범주로 나뉠 수 있습니다.

1) 클러스터

2) 컨테이너

3) 태스크

4) 서비스

 

1 - 1) 컨테이너

이 중에서 컨테이너부터 정의해보도록 하겠습니다!

 

우선 custom 컨테이너를 하나 정의해봅시다.

여기서는 "docker run"을 실행하는 방법에 대하여 정의하게 됩니다.

 

만약 local 환경이었다면 다음과 같이 명령을 전달했을 것입니다.

docker run --name node-demo -p 80:80

 

이를 컨테이너 편집 창에서 작성하면 다음과 같습니다.

(참고로 이미 도커 허브에 배포하고 싶은 이미지를 public으로 업로드한 상태입니다!)

컨테이너 이름을 설정하고,

이미지 주소에는 docker hub상에 등록해둔 public 이미지를 지정해줍니다.

 

또한 포트는 80 하나만 지정하는데, 컨테이너 내부 포트는 항상 외부 포트와 동일하게 매핑되기 때문에 80:80과 같이 숫자를 2번 지정할 필요는 없습니다.

위와 같이 단일 컨테이너가 지정되었습니다.

 

1 - 2) 태스크

AWS에 컨테이너를 시작하는 방법을 알릴 수 있습니다.

"docker run"을 실행하는 방법이 아니라, 이를 실행할 서버를 구성하는 방법입니다.

따라서 태스크에는 둘 이상의 컨테이너가 포함될 수 있습니다.

 

하나 이상의 컨테이너를 실행하는 하나의 Remote 서버, 즉 Remote 서버를 Task(태스크)라고 부를 수 있습니다.

예전 글에서 직접 사용했던 EC2가 이와 유사합니다.

 

다만 이번에는 EC2에 집접 컨테이너를 pull 해서 실행하는 것 이 아니라, ECS를 통해 컨테이너를 실행하는 방법과 컨테이너를 위한 환경을 조성하면 됩니다.

 

또한 호환성으로 FARGATE를 지정했는데, 이는 컨테이너를 시작하는 방법으로 서버리스라고 부르는 모드에서 구동됩니다.

즉, AWS는 실제 EC2와 같은 인스턴스를 생성하지 않고, 대신 그 컨테이너와 실행 설정을 저장합니다.

 

그리고 컨테이너가 무언가를 하도록 하는 요청이 있을 때마다 컨테이너를 시작하고, 요청을 처리한 다음, 다시 중지하게 됩니다.

따라서 FARGATE 방식은 컨테이너가 실행 중인 시간에 대해서만 비용이 발생합니다.

서버리스 컨테이너 구동 모드인 FARGATE를 사용하는 것입니다.

 

물론 FARGATE방식이 아니라, EC2로 전환하여 인스턴스를 생성하는 방식 또한 가능합니다.

 

1 - 3) 서비스

이제 서비스를 정의해봅시다!

서비스에서는 구성된 애플리케이션과 그를 포함하는 컨테이너를 실행하는 방법을 컨트롤합니다.

즉, 모든 태스크가 서비스에 의해서 실행된다고 할 수 있습니다.

태스크당 하나의 서비스가 있는 것입니다.

 

1 - 4) 클러스터

서비스가 실행되는 전체 네트워크라고 할 수 있습니다.

지금은 하나의 컨테이너와 하나의 태스크가 있는 서비스이지만, 다중 컨테이너 앱인 경우에는 하나의 클러스터에 여러 컨테이너를 그룹화할 수 있습니다.

1 - 5) 생성 완료

이제 요청을 보내기 위해 ip를 확인해봅시다.

 

Clusters -> default -> Tasks -> 작업 아이디 선택

네트워크 부분에서 퍼블릭 IP를 확인할 수 있습니다.

 

위 IP로 접속 시 접속이 되는 것을 확인할 수 있습니다.

 

2. 컨테이너 업데이트 하기

이번에는 직전에 "This works!"라고 보이던 부분을 "안녕하세요 Shine!"처럼 보이도록 소스파일을 수정한 후 다시 빌드하여 업데이트해볼 것입니다.

 

로컬 상에서 html 파일의 일부를 수정한 후, 다음 명령어를 통해 다시 build 합니다.

docker build --platform linux/amd64 -t node-dep-example-1 .

참고로 m1 맥북이라 "--platform linux/amd64" 옵션을 추가해줬습니다.

 

그다음으로는 태그를 설정해줍시다.

docker tag node-dep-example-1 zbqmgldjfh/node-example-1

 

이후 업데이트된 이미지를 push 합시다!

docker push zbqmgldjfh/node-example-1

 

이제 AWS에서 업데이트 됐음을 ECS에 알리기만 하면 됩니다!

Clusters -> default -> Tasks

 

작업 정의로 이동한 다음, 새 개정 생성(번역이 이상함... 영어로는 create new revision임...)을 누른다.

 

그다음 다른 설정을 모두 동일하게 한 후, 맨 밑의 생성을 눌러줍시다.

이전 설정과 동일한 설정으로 새로운 task를 생성하는 것입니다.

 

이후 새롭게 생성된 task

 

계속 진행하여 서비스를 업데이트하면 끝납니다.

 

이전에 확인한 방식으로 새로운 task의 IP를 통해 접속해보면, 변경된 결과를 확인할 수 있게 되었습니다.

 

3. 리소스 삭제

우선 서비스 부터 삭제합니다.

서비스가 삭제됬다면, 이후 Cluster 또한 삭제합니다.

시간이 조금 흐른후 삭제된것을 확인할 수 있습니다.

댓글