Docker image를 AWS ECS에 등록하여 서버 띄우기

728x90

서론

지난 편에서 Spring boot에서 Docker image를 만들고 Docker image를 Docker Hub에 등록하는 것까지 해봤다. 이번에는 등록한 이미지를 끌어와 ECS에서 구동하는 법을 실습해본다. 해당 실습은 AWS 계정이 있고 해당 계정이 IAM에서 VPC 접근 권한과 ECS 접근 권한이 허용되어있어야 한다. 

주의사항 


프리티어를 제공하는 EC2와는 다르게 ECS는 프리티어가 제공되지 않는다. 컴퓨팅 서비스를 띄우는 시간에 비례하여 요금이 청구되기 때문에 이에 유념하며 사용하자. 사용하지 않는 Task는 중지시켜 요금을 절약할 수 있다. 

ECS 구성 요소

 ECS를 생성하여 컨테이너를 구동하기 전에 ECS가 어떻게 구성되어있는지 살펴본다. ECS는 다음과 같이 구성되어있다.

클러스터

 컨테이너를 실행할 수 있는 가상공간. 논리적으로 묶인 그룹을 의미함. 보통 프로젝트 단위로 실행
 

작업

생성한 컨테이너를 구동하는 최소 단위. 하나의 task 내에 여러 컨테이너가 있을 수 있음

작업정의

 Task를 실행할 때, 컨테이너 네트워크 모드, Task 역할, 도커 이미지, CPU 메모리 제한 등 설정이 필요한데, 이런 설정을 매번 하는 게 아니라 하나의 집합 단위로 두고 필요할 때 사용하는데, 이 때 이 집합 단위가 Task definition이다. 

서비스

 cluster 는 두 가지 방식으로 Task를 실행할 수 있는데, 하나가 Task definition으로 직접 Task 실행, 다른 하나는 service 를 정의하여 여러 Task를 동시에 실행하는 것이다. 

VPC와 보안그룹 생성하기

VPC 생성

ECS는 기본적으로 EC2나 Fargate와 같은 클라우드 컴퓨팅 서비스 위에서 구동된다. AWS의 컴퓨팅 서비스는 VPC위에서 구동되는데, ECS를 생성할 때에도 어느 VPC에서 작동할 것인지 지정해줘야 한다. 이미 기본 VPC가 존재하지만, 해당 서비스가 구분되길 원하므로 별도의 VPC를 생성할 것이다. 그러므로 ECS를 생성하기 전에 VPC를 먼저 생성하도록 한다. 

1. AWS VPC에 접근한다.



2. 오른쪽에 'VPC생성'을 누른다.

 



3. 생성할 리소스에서 'VPC등'을 선택한다. 서브넷과 라우팅 테이블, 인터넷 게이트웨이와 엔드포인트를 함께 생성할 것이다. 


4. 제목을 입력하고 나머지 모든 설정을 그대로 두면 아래와 같이 리소스들이 생성된다.

 

보안그룹 생성


VPC를 생성했으면 해당 VPC의 보안그룹도 생성해준다. 보안그룹은 허용되지 않은 IP나 프로토콜이 접근하지 못하도록 네트워크에 제한을 걸어준다. 반대로 말하면 특정 IP가 VPC에 접근하기 위해서는 보안그룹을 생성하여 해당 IP와 PORT를 열어두어야 한다. 

5. VPC 왼쪽 탭에서 보안 그룹에 접근하여 오른쪽 보안 그룹 생성 클릭

 



6. 보안 그룹 이름과 설명을 채워넣는다. VPC에서 방금 전 생성한 VPC를 선택한다. (이름으로 구분할 수 있음)

 


7. 인바운드 규칙에 HTTP와 HTTPS를 선택하고 소스 유형 모두 Anywhere-IPv4를 선택한다.  이렇게 설정하면 모든 인터넷 사용자는 이 컨테이너 서비스에 접근할 수 있다. 인바운드 규칙은 외부에서 해당 서버로 들어올 때 허용 규칙을 의미한다.

 


8. 아웃바운드 규칙은 기본적으로 모든 트래픽에 접근 할 수 있도록 허용되어있다. 서버에서 외부로 나갈 때, 모든 IP와 모든 포트를 허용한다는 뜻이다. 해당 설정은 그대로 둔다. 

 



9. 보안 그룹 생성 버튼을 눌러서 생성하면 VPC위에 보안그룹이 생성된다.

 

 

ECS 클러스터 생성하기

본격적으로 컨테이너를 띄울 클러스터를 생성할 것이다. 

1. AWS ECS에 접근한다


2. 왼쪽 탭에서 클러스터에 들어가 오른쪽 클러스터 생성 버튼을 누른다.

 


3. 클러스터 이름을 넣고 네크워킹에서 방금전 생성한 VPC를 선택한다. 서브넷을 선별적으로 선택할 수도 있으나, 어떤 서브넷을 사용할지 선택하는 작업은 서비스를 생성할 때도 선택할 수 있으므로 우선 모든 서브넷을 선택한 기본 설정 그대로 둔다.

 

 


4. 클러스터 생성을 누르면 클라우드가 클러스터를 생성하기 시작한다. 클러스터가 완전히 생성되기 까지는 시간이 어느 정도 소요된다.


ECS 태스크정의 생성하기


1. 왼쪽 태스크정의 탭을 누르고 오른쪽 새 태스크정의 생성을 누른다. JSON을 사용하여 태스크정의를 생성할 수도 있으나, 여기서는 일반 태스크정의를 생성하도록 한다.

 



2. 태스크 정의 패밀리의 이름을 등록한다. 해당 이름을 등록하면 이후에 여러 서비스나 태스크를 생성할 때, 이 패밀리 이름을 선택할 수 있다.

 

 

 


3. 컨테이너 세부 정보에서 이미지를 등록한다. 이미지 URI에 이미지가 존재하는 URI를 등록할 수 있는데, 앞에 도메인 이름을 생략하고 작성하면 Docker Hub를 참조하여 이미지를 가져온다. 

 

 


4. 연결을 허용할 포트를 지정한다. 기본적으로 80포트가 설정되어있으므로 그대로 둔다. 환경변수를 넣을 수도 있다. 이미지에는 빠져있을 수도 있는 환경 변수를 여기서 등록할 수 있다. 지금 당장 넣지 않아도 나중에 태스크정의 개정을 통해 다시 등록할 수 있으므로 지금은 패스한다.

 



5. 환경에서 해당 Task를 구동하기 위한 HW 환경 및 스펙을 설정할 수 있다. Fargate를 선택하고 태스크 크기는 최소 사양으로 선택한다. (사양이 높을수록 비용이 올라간다.)

 

 


6. 컨테이너 상황을 추적하기 위해 AWS에서 제공하는 모니터링에는 여러 가지 옵션이 있다. 우선 AWS CloudWatch 그대로 둔다. 

 

 


7. 나머지 설정은 그대로 둔채 생성을 실행하면, 태스크정의가 정상적으로 생성된다.


ECS 서비스 등록 및 Task 실행

이제 클러스터 생성도 마쳤고 태스크정의도 생성되었으므로 이제 작성한 태스크정의를 토대로 태스크를 돌려볼 차례다. 앞서 설명한대로 태스크는 서비스로 묶여서 실행할 수 있다. 여기선 서비스 생성을 통해 태스크를 실행할 것이다. 

1. AWS ECS에서 왼쪽 클러스터 탭을 누르고 방금 생성한 클러스터 이름을 클릭해서 들어간다. 



2. 클러스터 화면 아래에 서비스 생성 버튼을 누른다. 

 


3. 환경에서 시작 유형을 선택한다. 용량 공급자 전략은 복수의 용량 공급자에 태스크를 분산하기 위해 사용한다. Auto-scaling을 효율적으로 할 수 있다는 장점이 있으나, 현재는 Auto scale 없이 서버를 띄울 것이므로 시작 유형을 선택한다.

 


4. 배포 구성에서는 서비스를 선택한다. 태스크를 선택해도 실행하는 데 문제는 없지만, 태스크는 중지하면 사라져서 다시 실행시킬 때마다 태스크를 생성해야해서 번거롭다. 서비스를 생성해서 태스크를 생성하면, 태스크가 중지되어 사라져도 서비스에서 다시 태스크를 생성하여 실행할 수 있다.
태스크 패밀리는 방금 전 생성한 태스크 작업 정의를 선택해준다. 서비스 이름은 임의로 입력한다.

 


5. 아래 네트워킹에서 VPC에는 기본적으로 클러스터가 있는 VPC가 지정되어있고, 모든 서브넷이 선택되어있다. 해당 컨테이너에 외부 접속을 차단하고 싶으면 public subnet을 지우면 된다. 현재 지금은 외부 접속을 통해 서버에 요청할 것이므로 모든 public subnet를 열어 놓는다.

 

 


6. 보안 그룹에서는 기존 보안 그룹을 선택하고, 이전에 보안그룹을 선택하여 넣는다. 해당 보안 그룹은 인바운드 규칙으로 HTTP와 HTTPS 프로토콜을 모든 IP에 대해 허용하는 보안 그룹이다.

 



7. ECS에 AWS에서 제공하는 NLB 또는 ALB를 연결할 수 있다. 외부 네트워크 트래픽을 각각의 ECS 컨테이너에 적절하게 분산하도록 도와준다. 현재는 로드밸런스 설정은 건들지 않고 넘어간다.

 



8. 생성을 누르면 AWS ECS가 이미지를 가지고 와서 컨테이너 배포를 실행한다.

서버 접속 하기

1. 클러스터에 들어가서 아래 태스크 탭을 누르고 방금 생성한 태스크를 클릭한다.

 



2. 구성에서 퍼블릭 IP의 주소열기를 클릭

 


3. 서버 띄우기 성공