[AWS] EC2와 ECS배포 비교하기

예리에르·2023년 2월 23일
5

AWS

목록 보기
1/2
post-thumbnail

ECS(Elastic Container Service)

AWS에서 제공하는 컨테이너 오케스트레이션 서비스로 여러 어플리케이션 컨테이너를 쉽고 빠르게 실행하고,컨테이너를 적절하게 분배 및 확장 & 축소 할 수 있도록 도와주는 서비스.

비슷한 서비스로 Docker의 Docker Swarm, 구글의 Kubernetes, 하시코프의 Nomad등이 있다.

Googel의 쿠버네티스에 비해 다소 오케스트레이션에 부족한 기능들도 있지만, ECS에서 제공해주는 정도의 수준만 필요한 경우라면 비용적인 부분이나, 다른 오케스트레이션에 비해 비교적 적은 학습 시간으로 빠르게 여러분들의 서비스를 ECS로 적용할 수 있다.

구성요소

1. 클러스터

  • Amazon ECS의 도커 컨테이너를 실행할 수 있는 논리적인 공간.
  • ECS의 가장 기본적인 단위. 서비스나 태스크가 실행되는 공간을 나누는 논리적인 공간.

2. 태스크 정의

  • 어플리케이션을 구성하는 하나 이상의 컨테이너를 설명하는 텍스트 파일.(JSON)
  • 최대 10개의 컨테이너를 설명할 수 있다.
  • 운영 체제에 대한 파라미터, 사용할 컨테이너, 애플리케이션에 대해 개방할 포트, 태스크의 컨테이너와 함께 사용할 데이터 볼륨을 지정할 수 있다.

3. 태스크

  • 태스크 정의를 인스턴스화 하는 것.
  • 컨테이너를 실행하는 최소 단위.

4. 서비스

  • 태스크는 2가지 방법을 실행가능하다.
    (1) 태스크 디피니션으로 직접 태스크를 실행.
    (2) 서비스 정의.

    (1)방법은 곧바로 실행되고 이후에 관리되지 않는다. 특별한 이유 없다면 거의 사용 X.
    (2)방법은 클러스터에서 개수만큼 태스크가 실행되도록 자동적으로 관리해준다.

    리플리카데몬 타입이 있는데, 데몬은 모든 컨테이너 인스턴스에 해당하는 테스크가 하나씩 실행된다. 그래서 인스턴스 관리를 위한 용도로 사용된다. 리플리카는 웹서버를 비롯한 실제 서비스에 주로 사용.

    즉, 태스크를 관리하는 상위그룹이라고 볼 수 있습니다.

  • 실행 유형
    (1) EC2

    (2) Fargate (serverless)

    ECS 클러스터내에 인스턴스가 없어도, 태스크에 정의한 CPU, 메모리 설정에 따라 인스턴스 없이 서버리스 하게 서비스를 실행할 수 있다.

5. ECR (Elastic Container Registry)

  • 도커 이미지를 저장 및 관리하는 서비스. 도커 허브와 비슷
  • IAM과 조합함으로 세세한 권한 관리 가능하다.
  • EC2와 비교해서 생각해보면 CodeBuild후 산출물이 S3에 들어간다면 ECS는 ECR에 생성된다고 보면 된다.

EC2 & ECS 배포비교

buildspec.yml

1) EC2

version: 0.2
phases:
  install:
    runtime-versions:
      nodejs: 16
    commands:
      - npm i npm@latest -g
  pre_build:
    commands:
      - npm install
  build:
    commands:
      - npm run build
artifacts:
  files:
    - 'deploy-live/**/*'
  name: mktc-bundle-live

2) ECS

version: 0.2
phases:
  install:
    runtime-versions:
      nodejs: 16
      docker: 20
    commands:
      - npm i npm@latest -g
  pre_build:
    commands:
      - aws ecr get-login-password /*하단 푸시 명령어 보기 참고*/
      - REPOSITORY_URI= /*레지스트리 URI*/
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - npm install
  build:
    commands:
      - echo Npm 빌드
      - npm run build
      - echo 도커 이미지 빌드
      - docker build -t $REPOSITORY_URI:latest deploy/live
  post_build:
    commands:
      - echo ECR 푸시
      - docker push $REPOSITORY_URI:latest
      - echo Writing image definitions file...
      - printf '[{"name":"/*레지스트리 이름*/","imageUri":"%s"}]' $REPOSITORY_URI:latest > imagedefinitions.json
artifacts:
  files: imagedefinitions.json
  • phase.install : Java SDK, Docker CLI를 설치
  • phase.pre_build : ECR 서비스에 로그인
  • phase.build : Maven 및 Docker 빌드
  • phase.post_build : Docker 이미지를 ECR에 push
  • cache.paths(선택): 소스코드 빌드에 사용하는 파일을 cache하는 경우 위치

ECR을 만든뒤 상단에 [푸시 명령보기] 버튼을 통해 확인할 ECR에 푸시하는 명령어를 볼 수 있다.

해당 레지스트리에 image가 올라가있다면 build가 잘 된걸 확인 할 수 있다.

codeBuild 문제해결

IAM 권한

  • 코드 빌드시 ECR에 접근할 수 있는 권한을 줘야한다. 권한이 없으면 build fail이 발생한다.

docker 권한

  • 도커를 사용하는 경우 환경의 권한이 있음 에 체크를 해야한다.

    기본적으로 Docker 컨테이너는 모든 디바이스에 엑세스를 허용하지 않기 때문에 엑세스 권한을 부여해야한다.

출처
https://boostbrothers.github.io/technology/2020/01/29/AWS-ECS-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0/
https://countrymouse.tistory.com/entry/awsecs
https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/launch_types.html

profile
비전공 프론트엔드 개발자의 개발일기😈 ✍️

0개의 댓글