본문 바로가기
개발/AWS

AWS ECS 구성하기

by 궁즉변 변즉통 통즉구 2022. 6. 4.
반응형

AWS ECS 구성을 테스트하면서 진행했던 과정을 정리해본다. ECS(Elastic Container Service)는 AWS에서 제공하는 완전관리형 컨테이너 오케스트레이션 서비스이다. 최근에 EKS를 많이 사용하는 추세인것 같기는 하지만 컨테이너 관리의 난이도나 복잡도 측면에서 EKS는 직접 관리해줘야 하는 부분이 많아 ECS사용도 고려해볼만 하다고 생각한다. 물론, ECS를 사용하면 EKS 보다는 AWS에 종속성은 많이 생긴다.

출처: https://aws.amazon.com/ko/blogs/korea/how-to-choose-aws-container-services/

 

ECS 주요 구성 요소

- Cluster: 관리할 컨테이너 리소스들의 논리적인 그룹 단위

- Task Definition: 사용할 컨테이너들에 대한 작업 정의, 컨테이너 이미지/CPU/Memory/네트워킹모드/로깅구성/호스팅인프라 등 정의

- Task: Task Definition을 인스턴스화 한 개념(K8S의 pod와 비슷한 개념)

- Service: Cluster내의 지정된 수의 Task를 실행하고 관리하는 개념, 원하는 Task의 수를 유지하고 선택적으로 LB와 연결 가능(K8S의 Deployment와 비슷한 개념)

- Container Agent: Cluster의 각 호스팅 인스턴스마다 실행,  리소스들에 대한 정보를 ECS에 전송하고, ECS의 요청을 받아서 수행(K8S의 kubelet와 비슷한 개념)

ECS 클러스 구성 예시 [출처:https://www.freecodecamp.org/news/amazon-ecs-terms-and-architecture-807d8c4960fd/]

 

1. ECS 클러스터 생성

먼저 AWS 콘솔에서 ECS > 클러스터 메뉴의 상단에 클러스터 생성 버튼을 클릭한다.

 

다음으로 EC2 Linux + 네트워킹을 선택한다.

  • 네트워킹 전용– AWS Fargate 또는 외부 인스턴스(ECS Anywhere)에서 호스팅되는 워크로드에 사용
  • EC2 Linux + Networking– Linux 기반 클러스터를 실행하기 위한 Amazon EC2 인스턴스 클러스터를 생성
  • EC2 Windows + Networking – Windows 기반 컨테이너를 실행하기 위한 Amazon EC2 인스턴스 클러스터를 생성

 

다음으로 클러스터 이름을 입력하고, 인스턴스 정보를 입력한다. 여기서는 인스턴스 유형은 t3.micro, 인스턴스 개수는 2개로 설정했다.

 

하단에 네트워크 설정부분에서는 기본 VPC와 기본 서브넷 중 2개를 임의로 선택했다. 일반적으로는 서브넷은 private서브넷을 선택하는 것이 맞을 것인데 테스트 과정에서 EC2에 직접 접속할 필요가 있을것 같아서 임의로 선택한 서브넷은 public서브넷이다.

IAM 역할 부분에서는 "새 역할 생성"을 그대로 두고 하단의 생성 버튼을 클릭한다. 생성을 하게 되면 IAM 역할에 ecsInstanceRole이 자동 생성된다.

 

다시 클러스터 화면에서 보면 클러스터가 하나 생성되었고, 인스턴스는 2개가 설정된 것을 볼 수 있다.

클러스터 이름을 클릭 후 상세 화면에서 Tab별로 자세한 정보를 확인가능하다. 현재는 다른 정보는 없고 'ECS 인스턴스' Tab에서 인스턴스 할당 정보 정도만 확인이 가능하다.

 

2. ECS Task Definition 생성

Task Definition은 k8s에서 pod정의 yaml을 정의하는 것과 비슷한것 같은데 Task Definition은 json 또는 콘솔화면에서 정의가 가능하다. 여기서는 콘솔로 정의하는 방법으로 진행해 볼텐데 먼저 작업정의 메뉴에서 '새 작업 정의 생성'을 클릭한다.

 

시작 유형에서 EC2 인스턴스로 실행을 할 예정이라서 EC2를 선택한다.

'태스트 정의 이름'을 입력하고 '태스트 역할'은 사용할 IAM Role을 선택하는 부분인데 선택하지 않아도 상관없다. 다음으로 '네트워크 모드'를 선택한다. 네트워크 모드는 총 4가지를 제공하는데 내용은 아래와 같다.

  • awsvpc — 태스크에 고유한 탄력적 네트워크 인터페이스(ENI)와 기본 프라이빗 IPv4 주소가 할당됩니다. 이렇게 하면 태스크에 Amazon EC2 인스턴스와 동일한 네트워킹 속성이 적용됩니다.
  • bridge — 태스크를 호스팅하는 각 Amazon EC2 인스턴스에서 실행되는 Docker의 기본 가상 네트워크를 이용(포트 매핑을 사용하여 컨테이너의 포트를 Amazon EC2 호스트의 포트와 매핑)
  • host — Docker의 기본 가상 네트워크를 우회하여 컨테이너 포트를 호스팅하는 Amazon EC2 인스턴스의 ENI에 직접 매핑. 따라서 포트 매핑을 사용할 때 단일 Amazon EC2 인스턴스에서 동일 태스크에 대해 다중 인스턴스화를 실행할 수 없습니다.
  • none — 태스크에 외부 네트워크 연결이 없습니다.

자세한 내용은 AWS 공식 문서를 참조하자(https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/task-networking.html)

 

다음으로 '컨테이너 추가' 버튼을 클릭하여 실행 할 컨테이너를 정의한다. '컨테이너 이름'을 입력하고 '이미지'는 ECR 이미지 URL을 입력한다. ECR 이미지 업로드는 다음을 참조한다. (https://happy-jjang-a.tistory.com/157) 마지막으로 '포트 매핑'에서 컨테이너에서 사용할 포트(ex. 8080)를 입력한다.

 

3. Task 실행

서비스를 생성하기 전에 먼저 위에서 정의한 Task Definition을 Task로 실행해본다. k8s에서 pod만 단독으로 실행을 하듯이 ECS에서 Task만 실행이 가능하다. '작업정의'에서 위에서 정의한 Task Definition을 체크하고 작업 > 작업 실행을 클릭한다.

 

 

시작유형은 EC2로 하고 우측 하단에 '작업 실행' 클릭하여 바로 실행

작업이 실행되면 아래와 같이 클러스터의 '작업' 탭에서 실행 중인 작업이 확인다. 그룹에는 'family:...' 으로 표기가 된다. 나중에 Service로Task를 실행하게 되면 그룹에 'service:...'로 표기되는 것을 확인 할 수 있다.

작업을 클릭하고 상세화면으로 이동하면 하단 컨테이너 정보에서 '외부링크' 정보를 확인가능하다. 이 외부 링크를 클릭해보면 Task로 실행한 컨테이너에 접속이 가능하다.

컨테이너 접속 확인

 

 

4. Service 구성

클러스터 메뉴의 '서비스' 탭에서 생성 버튼을 클릭한다.

서비스 구성에서 EC2를 선택하고, 작업 정의, 클러스터, 서비스명 등을 입력하고 다음으로 이동한다.

다음 네트워크 구성에서는 일단 로드 밸런서 없음으로 선택하고 진행해본다. 로드밸런서 없이 먼저 간단히 테스트만 해보고 하단에 다시 ALB를 선택해서 서비스를 구성해보도록 할 예정이다.

- 나머지는 설정들은 디폴트로 두고 다음 다음으로 넘겨서 서비스를 생성했다. 그리고 클러스터에서 서비스를 조회해보면 서비스가 생성된 것을 확인할 수 있다. 위에서 서비스 생성 시 작업 개수를 1개로 해서 작업이 1개로 나온다.

 

- 'ECS 인스턴스' 탭을 클릭해서 컨테이너가 실행 중인 인스턴스를 확인해 본다.

- 컨테이너가 실행 중인 EC2 인스턴스 public iP를 확인 후 ssh로 접속을 해보자

- ssh 접속 후 실행 중인 컨테이너 확인 및 curl 접속 테스트를 해본다. 먼저 docker ps 로 실행 컨테이너를 확인하고 포트 포워딩이 49153->8080으로 설정된 것을 확인한다. 그리고 curl localhost:49153으로 접속 테스트를 진행한다.

- EC2 보안그룹에서 포트 49153을 Inboud 설정을 하고 브라우저에서도 접속해보니 잘 된다.

컨테이너 접속 확인

 

5. Service 생성 with ALB(로드밸런스)

(1) 대상 그룹 생성

먼저 ALB 생성을 위한 대상그룹을 'EC2 > 대상그룹 > 대상 그룹 생성' 메뉴에서 생성한다. 대상그룹 이름 외에는 디폴트값이고 하단에 VPC는 ECS클러스터와 동일한 VPC를 선택한다.

- 위에서 ECS 인스턴스로 생성된 2개의 EC2를 선택 후 생성한다.

 

(2) ALB 생성

다음으로 'EC2 > 로드 밸런서' 메뉴에서 ALB를 생성한다. 아래와 같이 이름을 입력한다.

네트워크 매핑에서는 ECS 클러스터와 동일한 VPC를 선택하고 서브넷은 public서브넷으로 2개 선택한다.

-  보안그룹은 80포트 인바운드 설정된 보안그룹을 등록해서 선택하고, 리스너 및 라우팅에서는 80포트에 위에서 생성한 대상그룹을 선택한다.

 

(3) EC2 보안그룹 설정

다음으로 대상그룹으로 지정된 EC2 인스턴스의 보안 그룹을 설정해줬다. 일단 소스 ALB로 들어오는 모든 포트에 대해 inboud 설정을 추가했다. 

 

(4) ECS 서비스 생성

이제 ECS 클러스터 메뉴로 와서 서비스를 다시 생성해본다. 이번에는 작업 개수는 2개로 진행한다.

로드 밸런싱에서는 ALB를 선택하고, 위에서 설정한 80:HTTP 포트대상 그룹을 선택한다.

나머지는 디폴트로 다음 다음으로 넘기고 마지막으로 검토 한번 후 서비스를 생성한다.

서비스를 생성한 후 클러스터에서 서비스 상태를 보면 EC2 유형에 원하는 작업,실행중인 작업 모두 2개로 나오는 것을 확인할 수 있다.

'작업' 탭에서는 2개의 작업(task)를 확인가능하다. 그룹은 서비스로 실행 시 'service:...'으로 표기된다.

마지막으로 ALB 도메인주소로 접속 테스트를 해본다.

 

 

반응형

댓글