AWS(Amazon Web Service)

[AWS] AWS's containers - ECS

yunseohhe 2024. 12. 2. 19:02

Amazon ECS(Elastic Container Service)

  • AWS에서 컨테이너를 실행하면 ECS 클러스터에서 ECS 태스크를 실행하는 것이다.
  • EC2 Launch 유형으로 EC2 클러스터를 사용할 때는 인프라를 직접 프로비저닝하고 유지해야 한다.

  • ECS 및 ECS 클러스터가 여러 EC2 인스턴스로 구성되는데, ECS 인스턴스는 특별하게 각각 ECS Agent를 실행해야 한다.
  • 그럼 ECS 에이전트가 각각의 EC2 인스턴스를 Amazon ECS 서비스와 지정된 ECS 클러스터에 등록한다.
  • 이후에 ECS 태스크를 수행하기 시작하면 AWS가 컨테이너를 시작하거나 멈출 것이다.
     - 즉, 새 도커 컨테이너가 생기면 도식에서 볼 수 있듯 시간에 따라 EC2 인스턴스에 지정될 것이다.
  • ECS 태스크를 시작하거나 멈추면 자동으로 위치가 지정된다.
  • 도커 컨테이너는 미리 프로비저닝한 Amazon EC2 인스턴스에 위치한다.

 

Amazon ECS - Fargate Launch Type

  • 두 번째 시작 유형은 Fargate 시작 유형인데, 위에와 마찬가지로 AWS에 도커 컨테이너를 실행하는데 인프라를 프로비저닝하지 않아 관리할 EC2 인스턴스가 없다.
      - 관리할 EC2 인스턴스가 없다. = 서버리스이다. (서버를 관리하지 않아 서버리스이지, 서버가 없는 것은 아니다.)
  • Fargate 유형은 ECS 클러스터가 있을 때, ECS 태스크를 정의하는 태스크 정의만 생성하면 필요한 CPU나 RAM에 따라 ECS 태스크를 AWS가 대신 실행한다.
      - 즉, 새 도커 컨테이너를 실행하면 어디서 실행되는지 알리지 않고 그냥 실행된다.
      - 작업을 위해 백엔드에 EC2 인스턴스가 생성될 필요도 없다. 그래서 확장하려면 간단하게 태스크 수만 늘리면 된다.
  • EC2 시작 유형보다 관리가 쉽다.

 

 

Amazon ECS - IAM Roles for ECS

  • EC2 시작 유형의 예시로 EC2 인스턴스가 도커에 ECS 에이전트를 실행한다고 하자.
  • EC2 시작 유형을 사용한다면 EC2 인스턴스 프로파일을 생성하고, ECS 에이전트만이 EC2 인스턴스 프로파일을 사용하며 그 EC2 인스턴스 프로파일을 이용해 API 호출을 할 것이다. 
  • 그럼 인스턴스가 저장된 EC2 서비스가 CloudWatch 로그에 API 호출을 해서 컨테이너 로그를 보내고 ECR로부터 도커 이미지를 가져온다.
  • Secrets Manager나 SSM Parameter Store에서 민감 데이터를 참고하기도 한다.
  • ECS 태스크는 ECS 태스크 역할을 가진다.
      - EC2와 Fargate 시작 유형에 모두 해당되며, 두 개의 태스크가 있다면 각자에 특정 역할을 만들 수 있다.
  • 위의 도식에 모자처럼 태스크 A는 EC2 태스크 A 역할을 맡고 태스크 B는 EC2 태스크 B 역할을 맡는 것이다.
      - 역할을 다르게 하는 이유는 역할이 각자 다른 ECS 서비스에 연결할 수 있게 하기 때문이다.
      - 예를 들어, EC2 태스크 A 역할은 태스크 A가 Amazon S3에 API 호출을 실행할 수 있도록 한다면 태스크 B 역할은 DynamoDB에 API 호출을 실행할 수 있도록 한다.
  • (EC2 인스턴스 프로파일 역할과 ECS 태스크 역할의 차이점을 기억하면 된다.)

 

 

Amazon ECS - Load Balancer Integrations

  • EC2 시작 유형을 예로 들었지만 Fargate 시작 유형도 마찬가지이다.
  • 위의 여러 ECS 태스크들이 실행되며 ECS 클러스터 안에 있다. HTTP나 HTTPS 엔드포인트로 태스크를 활용하기 위해 애플리케이션 ALB를 앞에서 실행하면 모든 사용자가 ALB 및 백엔드의 ECS 태스크에 직접 연결된다. ALB는 이 경우를 포함해, 대부분의 사용 사례를 지원하는 좋은 옵션이다.
  • 한편, NBL는 처리량이 매우 많거나 높은 성능이 요구될 때만 권장한다. AWS Private Link와 사용할 때도 권장되는 옵션이다. 구세대 ELB는 사용할 수는 있지만 권장하지는 않는다.
    고급 기능이 없을 뿐더러 ELB는 Fargate에 연결할 수 없기 때문이다.
  • 반면, ALB는 Fargate와도 사용할 수 있다.

 

Amazon ECS - Data Volumes (EFS)

  • Amazon ECS의 데이터 지속성을 위해 데이터 볼륨이 필요하며 여러 종류가 있는데 그 중 하나가 EFS에서 자주 사용된다.
  • ECS 클러스터에 EC2 인스턴스와 Fargate 시작 유형 둘 다 구현했다고 가정해보자.
  • EC2 태스크에 파일 시스템을 마운트해서 데이터를 공유하려고 한다. 그러면 Amazon EFS 파일 시스템을 사용하는 게 좋다. 네트워크 파일 시스템이라 EC2와 Fargate 시작 유형 모두 호환이 되며, EC2 태스크에 파일 시스템을 직접 마운트 할 수 있다. 
  • 어느 AZ에 실행되는 태스크든 Aamzon EFS에 연결되어 있다면 데이터를 공유할 수 있고, 원한다면 파일 시스템을 통해 다른 태스크와 연결할 수 있기 때문이다.
  • 따라서 Fargate로 서버리스 방식으로 ECS 태스크를 실행하고 파일 시스템 지속성을 위해서는 Amazon EFS를 사용하는게 가장 좋다.
  • EFS 역시 서버리스이기 때문에, 서버를 관리할 필요 없고 미리 비용을 지불한다. 미리 프로비저닝하기만 하면 바로 사용할 수 있다.
  • 사용 사례
      - EFS와 ECS를 함께 사용해서 다중 AZ가 공유하는 컨테이너의 영구 스토리지가 있다.
  • Amazon S3는 ECS 태스크에 파일 시스템으로 마운트 될 수 없다.