본문 바로가기
개발/AWS

EC2 기반 ECS 서비스 이용해보기(1)-사전작업

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

ECS기능이 좋아 보여 한 번 연습해볼까로 시작해서 프로젝트에 이용해 보게 되었습니다. 그렇게 지옥이 펼쳐졌습니다. 처음 해보니 쉽지 않았는데 자료가 많은 fargate에 비하여 난이도가 있었던 것 같습니다. 테스크 오토스케일링 개념이 어려웠고 고생길이었지만, 서비스를 이해하고 프로젝트에 적용돼서 굴러가니 짜릿함이 느껴졌네요. 

 

그래서 한 번 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 오토스케일링 테스트

0. 시작하기 전에

ECS가 뭐죠?

 

ECS는 elastic container service의 약자입니다. 컨테이너 기반으로 서버를 운영할 수 있도록 도와줍니다. 그래서 ECS를 이용하면 컨테이너 기반 배포 자동화, 오토 스케일링과 같은 기능을 구현할 수 있습니다. 

 

기존 EC2 서비스에서 새 배포가 생기면 서버에 접속해서 바꿔주고 AMI를 만들어서 환경 구성하고,,, 이런 번거로운 작업이 필요한데 ECS로는 이 작업을 편하게 진행할 수 있습니다.

 

저희는 기존 github action으로 EC2에 액션 러너를 설치하고 도커를 이용하여 CICD를 구축했습니다. 그러다 보니 오토스케일링 환경에 대응하기 어려웠고 자연스럽게 다른 서비스를 찾아보다 ECS를 사용하게 되었습니다. 쿠버네티스를 도입하기에는 당장 프로젝트에 사용할 정도로 배우기가 어렵다 생각했고 도커 컨테이너 기반 서비스인 ECS로는 해볼 만하지 않을까 생각했습니다(뭔 자신감이었을까요....ㅎㅎㅎ). 물론 이와 비슷한 서비스로 빈스톡이 있지만, 빈스톡도 ECS기반으로 올릴 수 있다면 그냥 ECS를 이용하는 게 더 낫다고 판단했습니다. 

 

fargate? EC2? 무엇을 기반으로?

ECS를 이용할 때 플랫폼을 fargate 기반 서비스 또는 EC2 기반 서비스로 선택할 수 있습니다. EC2는 OS가 갖추어진 인프라 환경에서 도커를 올려 사용하고 fargate는 컨테이너 그 자체로 배포, 관리하는 기능입니다. 그래서 서비스를 이용할 때 fargate, EC2가 약간의 차이가 있습니다.

 

저희는 ECS를 처음 이용하기 때문에 ssh로 인스턴스에 접속해서 도커의 설정이나 상태를 확인하기 위해 EC2기반으로 진행했습니다. 그런데 개발 자료는 fargate가 더 많고 유데미나 유튜브 실습도 fargate기반으로 진행하는 게 더 많습니다. 어쩌다 보니 조금 더 불편한 길을 걷게 되었습니다. 

 

그럼 실습을 시작해보겠습니다. 

1. VPC 세팅

ECS를 띄울 VPC를 구성하겠습니다. 저는 켈리포니아에서 시작해보겠습니다. 지역에 대한 큰 차이는 없습니다. 

AWS VPC에 들어오셔서 VPC생성을 눌러줍니다.

VPC 설정은 VPC등으로 하고 이름은 myapp으로 진행하겠습니다. 기본 구성이 퍼블릭 서브넷 2개, 프라이빗 서브넷 2개이므로 굳이 가용영역 / 프라이빗 서브넷 / 퍼블릭 서브넷 개수는 지정하지 않겠습니다. 하지만 CIDR은 세팅해주겠습니다. 

CIDR은 위의 그림처럼 설정했습니다. /24를 이용하고 퍼블릭 서브넷은 3번째 바이트값을 첫째자리, 프라이빗 서브넷은 3번째 바이트값을 둘째자리로 설정해서 어느 네트워크인지 속하는지 확인할 수 있도록 하겠습니다. ECS와 연결하기 위해 NAT게이트웨이는 1개의 AZ, VPC 엔드포인트는 굳이 사용하지 않아 없음으로 진행하겠습니다. 

이제 VPC를 생성합니다.

2. bastion 호스트, ECR 푸시용 EC2 인스턴스 생성

bastion호스트를 만들어 도커를 깔아 ECR 커밋까지 해당 인스턴스에서 진행해보겠습니다. EC2 창으로 이동하여 EC2 인스턴스를 생성합니다.

 

인스턴스 이름은 myapp-ec2-bastion, OS는 awscli가 설치되어 있어 바로 사용이 가능한 AWS linux를 이용하겠습니다. 키페어는 인스턴스 접속을 위해 myapp-key로 만들어주겠습니다. 편집할 부분은 네트워크 설정 부분입니다. 

VPC는 방금 생성한 myapp-vpc로, 서브넷은 퍼블릭 영역 중 원하는 곳에 설정합니다. 보안 그룹은 myapp-sg-bastion으로 생성해주겠습니다. 규칙은 ssh접속을 위해 22만 여는 기본 설정으로 진행하겠습니다. 그리고 인스턴스를 시작해주겠습니다.

 

퍼블릭 IP 자동할당을 안 해주어 외부 접속을 위해 엘라스틱 IP를 연결해주겠습니다. EC2 설정 환경에서 네트워크 보안 -> 탄력적IP -> IP주소 할당 -> 할당하면 Name이 - 로 표시되어 있는데, myapp-eip-bastion으로 바꿔주겠습니다. 

그리고 연결해줍니다. 

인스턴스를 bastion으로 잡아줍니다. 이제 EC2에 접속해서 도커를 설치해주겠습니다. 

연결을 누르시면 웹 환경에서 설치가 가능한데 편한 방법으로 진행하면 됩니다.

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-container-image.html

 

Creating a container image for use on Amazon ECS - Amazon Elastic Container Service

Creating a container image for use on Amazon ECS Amazon ECS uses Docker images in task definitions to launch containers. Docker is a technology that provides the tools for you to build, run, test, and deploy distributed applications in containers. Docker p

docs.aws.amazon.com

AWS ECS 아마존 리눅스2에 도커를 설치하는 가이드 문서를 참고하여 진행하겠습니다. 

sudo yum update -y
sudo amazon-linux-extras install docker
sudo service docker start
sudo usermod -a -G docker ec2-user

 

위 명령어를 하나씩 입력하면 bastion호스트에 도커가 설치됩니다.

3. IAM 액세스 키 생성 & 설정

awscli를 이용하기 위해 IAM에서 액세스키를 생성합니다. IAM에 들어가서 엑세스 관리자 -> 사용자 -> 사용자 이름 선택 -> 보안 자격 증명 -> 엑세스 키 만들기 -> .csv 파일 다운로드를 진행해줍니다. 그러면 Access Key ID, Secret access key를 확인할 수 있는데 이를 이용하여 awscli congifure를 진행합니다.

 

다시 아까 만든 bastion호스트의 터미널에 다음을 입력합니다. 

aws configure

그리고 아래처럼 세팅합니다.

AWS Access Key ID [None]: [엑셀에 있는 Access key ID]
AWS Secret Access Key [None]: [엑셀에 있는 Secret access key]
Default region name [None]: [AWS 리젼. 저는 켈리포니아라 us-west-1으로 진행하겠습니다. 서울이면 ap-northeast-2]
Default output format [None]: json

4. ECR에 flask이미지 푸시

ECS에 올릴 이미지를 생성해보겠습니다. docker이미지를 만들기 위해 폴더를 만들어줍니다. myapp-test폴더를 만들고 flask를 실행하는 Dockerfile과 flask서버를 여는 app.py파일을 다음과 같이 만들겠습니다.

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "hello 1.1"

if __name__ == '__main__':
    app.run()

Dockerfile은 다음과 같이 작성하겠습니다. 

FROM python:3.9-slim
COPY . /app
RUN pip3 install flask
WORKDIR /app
CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0"]

전체 폴더구조는 다음과 같습니다. 

/home/ec2-user/myapp-flask/
├── app.py
└── Dockerfile

이제 ECR로 넘어가서 이미지를 만들어보겠습니다. 

ECR에서 리포지토리 생성 밑 시작하기를 눌러줍니다. 

이름은 myapp-ecr로 진행하겠습니다. 생성하고 myapp-ecr을 누르고 푸시 명령 보기를 누르면

이렇게 화면이 나오는데 위의 1~4번 명령어를 bastion호스트에서 입력합니다. 그러면 이미지가 ECR로 푸시되는 것을 확인할 수 있습니다. (여기서 윈도우로 진행하면 마지막 명령에서 무한로딩이 발생하기도 하는데 리눅스나 wsl환경에서 진행해보시면 해결할 수 있습니다)

이렇게 이미지가 올라간 것을 확인할 수 있습니다. 


여기까지 ECS를 진행하기 전 세팅을 해봤습니다. 다음 포스팅에서는 ECS를 본격적으로 이용해보겠습니다.

728x90

댓글