본문 바로가기
[AWS]/AWS 기타

[AWS] ECS를 활용해 컨테이너 띄우기

by METAVERSE STORY 2022. 9. 5.
반응형
728x170

 

Q: Amazon Elastic Container Service란 무엇입니까?

Amazon Elastic Container Service(ECS)는 Docker 컨테이너를 지원하는 확장성과 성능이 뛰어난 컨테이너 관리 서비스로서, 이 서비스를 사용하여 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스의 관리형 클러스터에서 애플리케이션을 손쉽게 실행할 수 있습니다. Amazon ECS를 사용하면 자체 클러스터 관리 인프라를 설치, 운영 및 확장할 필요가 없습니다. 간단한 API 호출로 컨테이너 사용 애플리케이션을 실행 및 중지하고, 클러스터의 전체 상태를 쿼리하며, 보안 그룹, Elastic Load Balancing, Amazon Elastic Block Store(EBS) 볼륨 및 Identity Access Management(IAM) 역할과 같이 여러 친숙한 기능에 액세스할 수 있습니다. 리소스 필요 사항과 가용성 요구 사항에 따라 클러스터 전체에 컨테이너 배치 일정을 수립하는 데에도 Amazon ECS를 사용할 수 있습니다. 또는 비즈니스나 애플리케이션의 특정 요구 사항에 맞도록 자체 스케줄러나 서드 파티 스케줄러를 통합할 수 있습니다.

 

시작 유형

컨테이너를 실행하는 데 사용할 수 있는 두 가지 모델이 있습니다.

  • Fargate 시작 유형 - 서버리스 종량제 옵션입니다. 인프라를 관리할 필요 없이 컨테이너를 실행할 수 있습니다.
  • EC2 시작 유형 - 클러스터에서 EC2 인스턴스를 구성하고 배포하여 컨테이너를 실행합니다.

Fargate 시작 유형은 다음 워크로드에 적합합니다.

  • 낮은 오버헤드를 위해 최적화해야 하는 대규모 워크로드
  • 가끔 버스트가 발생하는 소규모 워크로드
  • 작은 워크로드
  • 배치 워크로드

EC2 시작 유형은 다음 워크로드에 적합합니다.

  • 지속적으로 높은 CPU 코어 및 메모리 사용량이 필요한 워크로드
  • 가격에 최적화되어야 하는 대규모 워크로드
  • 애플리케이션이 영구 스토리지에 액세스해야 함
  • 인프라를 직접 관리해야 함

 

용어 정리

 

클러스터

ECS의 가장 기본적인 단위입니다. 클러스터는 논리적인 개념으로 서비스나 태스크가 실행되는 공간이라고 이해할 수 있습니다.

따라서 클러스터가 없으면 ECS에서 컨테이너를 실행할 수 없습니다. 기본적으로 컴퓨팅 자원을 포함하지 않습니다.

 

컨테이너 인스턴스

컨테이너 인스턴스는 클러스터에서 서비스나 태스크를 실행하기 위해 사용하는 컴퓨팅 자원입니다. EC2 인스턴스에 ecs-agent를 설치하고 클러스터명을 설정해서 특정 클러스터의 컨테이너 인스턴스로 등록할 수 있습니다.

클러스터(스케줄러)는 클러스트 인스턴스를 조작할 수 있는 권한을 가지고 있으며, 클러스터에서 서비스나 태스크를 실행하면 조건을 만족하는 컨테이너 인스턴스를 찾아 컨테이너로 실행합니다.

단, 파게이트를 사용하는 경우 컨테이너 인스턴스 없이 컨테이너를 실행할 수 있습니다.

 

이미지

ECS는 컨테이너 오케스트레이션 도구로 컨테이너를 관리합니다. 컨테이너는 이미지로부터 실행되며, 이미지는 특정 애플리케이션을 실행가능한 환경을 재현하기 위한 파일 집합입니다.

이 이미지는 ECS와는 별개로 생성 및 관리됩니다. 따라서 ECS 사용자는 먼저 자신이 실행하고자 하는 애플리케이션을 이미지로 가지고 있어야합니다. ECS를 사용할 때 이미지는 도커Docker 이미지와 동의어로 봐도 무방합니다.

일반적으로 이미지 빌드 파일은 애플리케이션 저장소에서 Dockerfile로 관리되며, 도커 허브Docker Hub나 ECRElastic Container Registry에 업로드해서 사용합니다.

 

작업 정의(태스크 데피니션)

태스크 디피니션은 ECS의 최소 실행 단위인 태스크를 실행하기 위한 설정을 저장하고 있는 리소스입니다. 태스크 디피니션은 하나 혹은 둘 이상의 컨테이너에 대한 정보(컨테이너 디피니션)를 포함할 수 있습니다.

컨테이너 별로 실행하고자 하는 이미지를 지정해야하며, CPU와 RAM과 같은 리소스 제한 정보와 컨테이너 실행에 필요한 옵션들을 지정합니다. 태스크 디피니션은 클러스터에 종속되어있지 않습니다.

 

태스크

태스크는 ECS의 최소 실행 단위로 하나 혹은 둘 이상의 컨테이너의 묶음입니다. 태스크는 독립 실행되거나 서비스에 의해서 실행될 수 있습니다. 클러스터를 선택하고 태스크 디피니션을 지정해서 태스크를 독립적으로 실행할 수 있습니다.

클러스터는 적절한 컨테이너 인스턴스를 찾아 태스크 디피니션을 기반으로 태스크를 실행합니다. 독립적으로 실행된 태스크는 한 번 실행된 이후로는 관리되지 않습니다.

 

서비스

서비스는 태스크를 지속적으로 관리하는 단위입니다. 서비스는 클러스터 내에서 태스크가 지정된 수만큼 지속적으로 실행될 수 있도록 관리합니다.

또한 아마존의 로드 밸런서와 연동해서 실행중인 태스크를 찾아 자동적으로 로드 밸런서에 등록 및 제거하는 역할도 담당합니다.

 

 

 

 

1. ECS 클러스터 생성하기

 

먼저 ECS의 클러스터는 일종의 디렉토리 정도로 생각하는 것이 편하다. ECS를 사용하기 위해서는 클러스터 생성이 우선적으로 필요하다. ECS 클러스터 시작하기를 눌러준다. 

 

 

생성을 클릭하면 이렇게 3가지 선택지가 등장한다. 

Fargate를 사용해서 ECS를 사용할 것인지 아니면 EC2를 통해 ECS를 사용할건지에 대한 시작 유형을 묻는 부분이다.  

우리는 Fargate를 통해서 만들 것이기 때문에 네트워킹 전용을 클릭한 후 다음 단계를 눌러준다. 

 

 

그 후 클러스터의 이름을 지정해준다. 

밑에 있는 부분은 이 클러스터를 위해 새로운 VPC를 생성할 것인가에 대한 선택지로 나는 굳이 선택하지 않고 생성을 눌렀다. 

 

 

그렇다면 ecs cluster가 완성 된 것을 확인할 수 있다. 

 

 

 

 

2.  작업 정의 생성하기

 

ECS 클러스터를 생성한 다음 작업 정의를 생성해 준다. 이는 작업의 일부가 될 컨테이너 개수, 리소스, 컨테이너간 연결 방식, 컨테이너가 사용할 포트 등 애플리케이션 관련 컨테이너 정보를 설정해주는 작업이다.

 

 

생성을 클릭하면 시작 유형 호환성 선택이 먼저 나온다. 우리는 FARGATE를 시작유형으로 한 ECS를 하려고 하기 때문에 FARGATE를 클릭한 후 다음 단계로 넘어간다.

 

 

그 다음 태스크 정의 이름을 설정해 준다. 태스크 역할은 AWS 서비스에 API 요청을 할 떄 사용하는 IAM 역할 옵션으로 빈 칸으로 놔둔다. 

그 다음 운영 체제 패밀리를 통해서 Linux, Windows에 대한 선택을 할 수 있다. 

 

 

 

그 후 작업 크기를 지정할 수 있다. 할당할 메모리와 할당할 CPU를 클릭해 준다. 

 

 

그 다음 컨테이너 추가를 클릭 해 준다. 

 

 

 

그 후 이름을 지정해 준다. 

컨테이너 이름을 지정한 후 컨테이너에 지정할 이미지 URI가 필요하다. 

 

나는 내 ECR 이미지를 사용하였다.

ECR에 도커 이미지를 업로드 하는 방법은

[AWS] AWS ECR에 도커 이미지 PUSH (tistory.com) 

 

[AWS] AWS ECR에 도커 이미지 PUSH

이 글은 사전에 도커가 설치되어 있어야 진행할 수 있다. 도커 설치를 진행하기 위해서는 Windows에 Docker 설치하기 (tistory.com) 를 먼저 진행하면 된다. 1. ECR 생성하기 먼저 ECR 리포지토리를 생성할

cloud-allstudy.tistory.com

이 글을 읽고 따라하면 된다. 

 

 

 

그 다음 메모리 제한을 입력해 준다.

소프트 제한은 컨테이너가 일정량의 메모리양을 예약하는 것이다.

하드 제한은 해당 메모리 이상으로 사용이 된다면 컨테이너를 죽이는 것이다. 

 

그 후 자신의 컨테이너 포트 매핑을 진행해주면 된다. 

 

 

그러면 아까 비어있던 컨테이너 정의 부분에 컨테이너가 추가 된 것을 확인할 수 있다.

여기서는 하나의 컨테이너만 정의할 것이지만 하나의 작업 정의에는 컨테이너를 여러개 추가할 수 있다. 

그 후 생성을 눌러준다. 

 

 

 

그렇다면 이런식으로 시작이 완료 된다. 

 

이 작업정의를 가지고 서비스를 만들거나 작업을 실행할 수 있다. 

작업과 서비스의 차이점은 

작업은 그냥 작업이라고 한다면 

서비스는 이 작업 여러개를 한번에 관리할 수 있고 더 많은 기능(오토스케일링, ELB ...)을 제공한다. 그러므로  웹 서비스에는 서비스가 조금 더 적합하다. 

작업은 배치나 도커로 만든 간단한 스크립트 같이 돌렸다가 바로 내려도 될 때 적합하다. 

 

 

 

3. 컨테이너 실행

 

다시 ECR의 작업 정의로 돌아온 후 우리가 생성한 작업 정의를 클릭하고 서비스 생성을 클릭한다. 

 

 

먼저 우리는 Fargate로 생성할 것이므로 시작 유형을 Fargate로 지정해 준다. 그 다음 운영 체제 패밀리를 선택한다.

우리는 Linux로 설정한다.

작업정의는 현재 하나밖에 없기 때문에 자동으로 선택 되었다.

개정은 작업 정의의 버전이라고 생각하면 된다. 만약 같은 이름의 작업 정의를 만든다면 하나의 패밀리에 개정이 쌓이게 되는 구조이다.

그리고 서비스의 이름을 정해주었다. 플랫폼 버전, 클러스터는 모두 기본으로 놔두었다. 

클러스터 역시 하나밖에 없으므로 그냥 놔두면 된다. 

 

 

그 다음 작업 개수를 선택해준다. 작업 개수는 말 그대로 서비스 실행 개수를 의미한다.

최소 정상 상태 백분율이란 만약 내가 작업 개수를 2개로 지정했다. 그 후 최소 정상 상태 백분율을 50으로 지정한다면 명시된 50%만큼을 유지한다. 2개의 50% 즉 1개를 유지하는 것이다.

그리고 최대 백분율이란 배포중 인스턴스들을 최대 지정한 숫자% 까지 제한한다.

만약 기존 Task가 2개이고 최대 백분율이 200%이면 최대 4개이며 그 이상은 켜지지 않는다. 

 

그 후 배포는 서비스의 배포 옵션을 선택하는 것이다.

먼저 롤링 업데이트는 인스턴스를 정해놓은 단위로 교체하는 방식을 의미한다.

서비스를 구성하는 총 서버 댓수가 10대이고, 2대씩 롤링 업데이트를 진행하겠다고 했다면 새로운 버전 2개가 생성되고 정상적 서비스가 가능한 상태일 때 트래픽이 2대로 전환되고, 구버전 2대는 서비스에서 제외(draining) 한다. 이 방식으로 2대씩 순차적으로 교체 후 새로운 버전으로 교체되는 방식이다.

 

블루 그린 배포 방식은 옛날 버전은 블루, 새로운 버전은 그린이라고 붙여진 이름이고 동일한 서버를 미리 구축한 다음 라우팅을 순간적으로 전환해 새로운 버전을 배포하는 방식이다. 

여기서는 우리는 롤링 업데이트로 진행한다. 

 

 

그 후 VPC와 서브넷을 선택한다.

 

보안그룹은 작업 정의에서 명시해준 컨테이너의 포트와 일치시켜 줘야 한다. 

 

 

그 후 자동할당 퍼블릭 IP는 ENABLED라고 지정해준다.

나는 Private Subnet에 생성했는데 왜 퍼블릭 IP를 ENABLED로 지정했을까?

이 화면은 단순히 Public IP만 할당해 준다고 생각해서는 안된다.

Public IP를 꺼버리면 Private IP만 할당이 된다. 

Private ENI만 할당이 된다. 이는 ECR에 붙을 수 없어서 도커 이미지를 가져오지 못한다.

이를 따로 해결하려면 프라이빗 서브넷에 인터넷 게이트웨이나 ECR에 대한 엔드포인트가 정확하게 설정을 해줘야 한다. 그렇지 않고서는 ECR에서 이미지를 못가져오는 경우가 있다.

그러므로 우리는 자동 할당 퍼블릭 IP를 ENABLED로 지정했다. 

 

 

 

 

그 후 EC2로 들어가 ALB를 만들어 준 후 리스너를 삭제한다. 어차피 리스너는 ecs이기 때문에 타겟그룹을 지정한 후 ALB가 생성이 되면 타겟그룹을 제거하면 된다. 

 

 

그 후 로드밸런서 유형을 Application Load Balancer로 클릭해 준 후 

밑 로드 밸런싱할 컨테이너 컨테이너 이름: 포트를 로드 밸런서에 추가 눌러준다. 

 

 

그럼 프로덕션 리스너 포트를 지정해준다. 이는 외부에서 접속하는 Load balancer 포트이다. 

 

 

그 후 Auto Scaling은 선택적으로 선택한다. 나는 딱히 Auto Scaling을 사용하지 않을 거라서 다음 단계를 눌렀다. 

 

그럼 마지막으로 검토가 나오고 끝이 난다. 

 

그 후 화면을 보면 ACTIVE 상태를 확인할 수 있다. 

 

 

 

그 후 ALB 주소로 들어가 보면 화면이 뜨게 된다. 

 

 

 

출처

https://www.youtube.com/watch?v=o7s-eigrMAI 

https://www.youtube.com/watch?v=blDvDDZ1ngg 

https://www.44bits.io/ko/post/getting-started-with-ecs-fargate

AWS EC2 Container Service(ECS) (1) - 구조와 특징 (tistory.com)

반응형
그리드형

댓글