본문 바로가기
개발/AWS

EC2 기반 ECS 서비스 이용해보기(2)-EC2 기반 ECS 구성

by 앗가 2022. 11. 16.
728x90
반응형

저번에는 ECS를 사용하기 위한 기본 설정을 진행했습니다. 이번에는 본격적으로 ECS를 사용해보도록 하겠습니다. 진행할 내용은 다음과 같습니다.  

 

  1. VPC 구축
  2. bastion, ECR 푸시용 EC2 인스턴스에 도커 설치
  3. IAM 액세스 키 생성 & 설정
  4. ECR에 flask이미지 푸시
  5. EC2 로드 밸런서 구성
  6. EC2기반 ECS 클러스터 구성
  7. EC2 오토스케일링 / ECS 용량 공급자 설정
  8. ECS 테스크 정의
  9. ECS 서비스 정의
  10. ECS 서비스 오토스케일링, EC2 오토스케일링 테스트

본격적으로 ECS를 사용하기 위한 설정을 구성해보겠습니다. 로드 밸런서부터 시작하겠습니다. 

5. EC2 로드 밸런서 구성

트래픽을 처리할 로드 밸런서를 만들어보겠습니다. EC2 탭에서 로드 밸런싱 -> 로드 밸런서 -> 로드 밸런서 생성을 눌러서 진행합니다. 

application load balancer를 선택해주겠습니다. 

로드밸런서 이름은 myapp-lb로 설정해주었고 네트워크 설정은 

다음과 같이 설정해주었습니다. 방금 만든 VPC를 입력하고 매핑은 public subnet으로 설정해줍니다. 

보안그룹은 다음과 같이 설정하겠습니다. VPC를 자신이 만든 VPC로 설정해주시고 80번 포트를 모든 IP에 대해서 개방하겠습니다. VPC 설정 안 하시면 그냥 기본 VPC로 설정됩니다! 보안그룹을 만들었으면 새로고침 버튼을 누르고 default를 삭제하고 새로 만든 myapp-sg-lb를 넣고 진행해줍니다. 

보안그룹을 설정하셨으면 로드 밸런싱 창에서 타깃 그룹을 설정해줍니다. 

타깃 그룹은 이름만 myapp-tg로 설정하고 넘어가겠습니다. 넘어가면 기존에 설치된 EC2 인스턴스를 타깃 그룹에 포함시킬 건지 적용하는 페이지가 나오는데 bastion 말고 없으므로 바로 create target group을 눌러줍니다. 

이렇게 target group을 만들고 로드 밸런싱에서 새로고침을 해주고 등록합니다. 그리고 아래의 create load balancer를 눌러줍니다. 이제 ECS를 설정해보겠습니다.

6. EC2기반 ECS 클러스터 구성

먼저 ECS용 인스턴스의 보안그룹을 설정해주기 위해 EC2탭에서 보안그룹을 설정하겠습니다. 모든 트래픽에 대하여 인바운드 규칙을 적용하겠습니다. 이름은 myapp-sg-ecs로 진행하겠습니다. 

ECS에 와서 클러스터 생성을 눌러주겠습니다.

클러스터 템플릿은 EC2기반으로 하기 때문에 EC2 Linux + 네트워킹을 선택하고 다음으로 넘어가겠습니다. 

클러스터 이름은 myapp-ecs, 인스턴스 구성에서 프로비저닝 모델은 온디맨드 인스턴스 유형, EC2 유형은 t2.micro, 개수는 1로 설정하고 키 페어는 기존에 만든 myapp-key를 이용하겠습니다. 네트워크는 다음과 같이 설정하겠습니다.

VPC는 myapp-vpc, 서브넷은 private로 선언된 서브넷을 선택하고 퍼블릭 IP 자동 할당은 비활성화, 보안 그룹은 ecs용으로 만든 방금 생성한 myapp-sg-ecs를 선택하겠습니다. 생성을 눌러주면 ECS 클러스터를 생성하게 됩니다. 

7. EC2 오토스케일링 / ECS 용량 공급자 설정

여기서 잠시 ECS에서 오토스케일링이 관리되는 방식을 알아보겠습니다. 기본적인 EC2는 부하가 로드밸런서를 통해 들어오는데 트래픽이 많아지면 EC2 인스턴스가 늘어납니다.  

 

ECS도 마찬가지로 부하가 증가하면 EC2 인스턴스가 늘어납니다. 그런데 ECS에서는 늘어나는 주체가 2개인데, 하나는 EC2이고 하나는 EC2위에 올라가야 하는 서버 컨테이너입니다. 따라서 EC2 기반 ECS 오토스케일링을 설정할 때 1. EC2의 오토스케일링과 2. EC2위에 올라갈 서버 컨테이너의 오토스케일링의 두 개가 필요합니다. 이번 부분에서는 트래픽이 증가되었을 때 단순 EC2 인스턴스를 증가시키는 실습을 해보겠습니다. 여기까지 진행하고 트래픽을 증가시킨다면 인스턴스가 늘어나긴 하지만 아무런 응답을 내보내지 못합니다. 

 

이제 다시 EC2 탭으로 돌아가 봅시다. 오토 스케일링 탭에 들어오면 이미 ECS에 의해 오토스케일링이 자동으로 구성되어 있습니다. 

여기서 ECS로 생성된 EC2를 선택하고 편집을 누릅니다.  원하는 용량 / 최소 용량 / 최대 용량은 여기서 1 / 1 / 6으로 선택하겠습니다. 원하는 용량을 선택합니다. 그리고 밑 로드 밸런싱 구성에서 대상그룹을 방금 만든 로드 밸런서로 구성합니다. 

이렇게 용량과 로드밸런서만 수정하고 업데이트해주겠습니다. 다시 수정한 오토스케일링 그룹을 선택하고 자동 크기 조정에서 동적 크기 조정 정책 생성을 눌러줍니다. 

CPU 사용률을 5%로 선택하고 생성하겠습니다.

이렇게 EC2 오토스케일링 그룹의 설정을 완료했습니다. 이제 이 오토스케일링 그룹 설정을 ECS에 연결시키겠습니다. 다시 ECS탭에서 생성한 ECS클러스터 -> 용량 공급자 -> 생성을 클릭합니다. 그러면 용량 공급자를 설정할 수 있는데 공급자 이름은 myapp-provider, 오토 스케일링 그룹은 방금 편집한 그룹, 관리형 조정 / 관리형 종료 방지 기능은 비활성화하고 목표 용량은 100%로 진행하겠습니다.

 

관리형 조정을 선택하게 되면 ECS에서 자동으로 동적 크기 조정 정책을 만들어주는데 편집이 안됩니다. 그래서 빠르게 스케일 인 / 아웃을 확인할 수 없습니다. 관리형 종료 방지 기능을 활성화하면 오토스케일링에서 스케일 인이 동작하지 않습니다. 

 

목표 용량은 관리형 조정이 활성화될 경우 사용되는 값으로 보이는데, 비활성화해도 설정할 수 있긴 합니다. 값은 100이 기본적인 설정이라 이렇게 설정하겠습니다. 

 

그럼 용량 공급자 생성을 해주겠습니다. 

다시 용량 공급자 탭을 보면 수정한 용량 공급자로 적용되어 있음을 확인할 수 있습니다. 이제 클러스터를 업데이트해줍니다. 

클러스터 업데이트에서 기본 용량 공급자 전략을 생성한 myapp-provider를 집어넣고 업데이트해줍니다. 이렇게 ECS에서 컨테이너가 올라갈 EC2 인스턴스의 오토스케일링 설정이 끝났습니다.

8. ECS 테스크 정의

테스크는 EC2 위에 올릴 컨테이너의 목록을 정의하는 기능입니다. 올라갈 컨테이너마다 포트 번호, 메모리와 CPU 사용량을 정의할 수 있습니다.

 

이제 ECS위에 올라갈 컨테이너를 정의하기 위해 테스크를 만들어보겠습니다. ECS 탭 -> 작업 정의 -> 새 작업 정의 생성으로 이동합니다. 

EC2 기반으로 진행하고 있어 EC2를 선택합니다. 테스크 이름은 mapp-task로 정의하고 테스크 역할을 추가해주겠습니다. 네트워크 모드는 브리지로 설정하겠습니다. 

 

네트워크 모드중 호스트 모드는 권장되지 않습니다. AWS 문서에서 이 모드를 선택하면 테스크의 인스턴스화를 하나 이상 실행할 수 없다고 나옵니다. EC2 인스턴스의 도커 위에 테스크로 정의된 컨테이너가 3000번 포트를 점유하고 있다면 같은 이미지로부터 생성된 다른 컨테이너는 EC2위에 올라가지 못합니다. 

 

브릿지 모드는 가상의 네트워크 브릿지를 만들어서 포트 매핑을 진행합니다. 

 

네트워크에 대한 자세한 설명은 https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/bestpracticesguide/networking-networkmode.html문서에서 확인할 수 있습니다.

작업 크기는 400 / 400으로 진행하겠습니다. 만약 작업 메모리나 작업 CPU가 너무 크다면 테스크가 제대로 올라가지 않을 수 있습니다. 

컨테이너 정의에서 컨테이너 추가를 누르면 컨테이너를 설정할 수 있습니다. 컨테이너 이름은 myapp-ct, 이미지는 ECR리포지토리의 주소, 메모리 제한은 하드 제한으로 400, 포트 매핑은 0:5000으로 진행하겠습니다. 포트 매핑을 0으로 진행하는 이유는 브릿지에서 자동으로 포트를 바인딩하게 하기 위함입니다. 설정을 완료하고 추가하겠습니다. 

이후 작업을 생성합니다. 

9. ECS 서비스 정의

ECS 테스크를 정의했으면 이 테스크를 EC2위에 컨테이너로 올리는 작업을 해주기 위해 서비스를 정의합니다. ECS 클러스터 탭 -> 서비스 탭 -> 생성을 눌러줍니다. 

 

서비스 구성에서 용량 공급자는 따로 설정하지 않아도 기본으로 등록됩니다. 서비스 이름은 myapp-sv, 작업 개수는 1로 진행하겠습니다. 

 

최소 정상 상태 백분율과 최대 백분율은 서비스를 새로 배포할 때 남겨둘 기존 컨테이너와 새로 생길 기존 컨테이너를 정의하는 값입니다. 예를 들어 서비스를 컨테이너 2대로 진행하다가 배포를 위해 서비스를 실행하는 경우, 최소 정상상태 백분율을 100, 최대 백분율을 150으로 한다면, 기존 컨테이너 2대 -> 기존 컨테이너 2대 + 새로운 컨테이너 1대 -> 기존 컨테이너 1대 -> 새로운 컨테이너 2대 -> 새로운 컨테이너 2대로 업데이트가 진행됩니다. 여기서는 100, 200으로 설정하겠습니다. 

 

이후 다음 단계로 넘어가겠습니다. 

이후 로드 밸런싱을 선택합니다. 저희는 ALB를 만들었으니 ALB를 선택하고 로드 밸런싱할 컨테이너에 로드 밸런싱에 추가를 누르면 대상 그룹을 지정하게 하는데 기존에 만든 myapp-tg를 선택하겠습니다. 그리고 다음으로 진행합니다. 

그다음은 컨테이너에 대한 오토스케일링을 정의하는 화면입니다. 여기는 EC2 인스턴스의 오토스케일링과 다릅니다. EC2 인스턴스에 올라갈 컨테이너, 더 정확히는 테스크의 오토스케일링입니다. 여기도 설정해주도록 하겠습니다. 최소 작업 개수 / 원하는 작업 개수 / 최대 작업 개수를 1 / 1 / 12로 구성하겠습니다. 정책 이름은 myapp-ecs-task-as로 설정했고 대상 값은 5, 확장 / 축소 기간은 5초로 설정했습니다. 

 

여길 건너뛰면 부하가 많아졌을 때 EC2 만 덩그러니 놓여 부하분산이 제대로 이루어지지 않습니다!

다음 단계로 넘어가서 서비스를 생성해줍니다. 

 

myapp-ecs에 들어가서 작업 탭을 보면 작업이 provisioning -> pending -> running 순으로 상태가 변화합니다. running이 뜬다면 성공입니다. 

 

이제 다시 EC2 탭의 대상 그룹을 보면 다음처럼 80번 포트에 unhealthy로 떠있는데 제거해줍시다.

이제 로드 밸런서의 도메인을 입력하면

이렇게 hello 1.1이 뜨는 것을 확인할 수 있습니다!

 

이제 한 번 ECS 컨테이너가 띄워진 인스턴스에 접속해서 확인해보겠습니다. 자신의 컴퓨터에 다운로드된 myapp-key.pem파일을 메모장으로 열어서 내용을 복사한 뒤 bastion호스트에 접속하여 myapp-key.pem파일을 만들고 붙여 넣고 저장합니다. 

위의 명령어 두 줄을 차례대로 복사하여 입력하면 ECS용 인스턴스에 접속됩니다. 접속한 인스턴스에서 docker ps -a를 입력하면 동작하는 컨테이너를 확인할 수 있습니다.

포트 매핑과 커맨드를 확인할 수 있습니다. 컨테이너의 로그를 확인해보겠습니다.  docker logs -f <컨테이너 ID>를 입력하면 로그를 확인할 수 있습니다. 

10. 오토 스케일링 테스트

이제 부하를 줘서 오토 스케일링 동작을 확인해보겠습니다. 배스천 호스트에서 다음을 입력합니다. 

yum install httpd-tools -y
ab -n 200000 -c 1000 http://<로드벨런서 도메인>/

로드밸런서 도메인 자리에 로드밸런서 도메인을 입력하고 실행합니다. 그러면 잠시 뒤 EC2 인스턴스가 이렇게 늘어난 것을 확인할 수 있습니다. 

또한 ECS에서 작업도 서비스에 의해 다음과 같이 배포됨을 확인할 수 있습니다. 

또 기다리다 보면 종료가 되는 것도 확인할 수 있습니다(종료까지 시간이 걸립니다). 

728x90

댓글