개발 일기

[AWS] Amazon Elastic Container Service 도입기 본문

DevOps/AWS Services

[AWS] Amazon Elastic Container Service 도입기

개발 일기장 주인 2024. 11. 23. 00:21

Amazon SageMaker, Amazon Lex, Amazon Polly, AWS Batch 등이 ECS를 기반으로 동작한다.

 

Built for Security, Reliability, Availability, and Scale

 

컨테이너 오케스트레이션 도구의 구조는 Control PlaneData Plane이 있는데 

사용자가 원하는 상태로 동작하도록 관리하는 것이 핵심이다.


Amazon ECS Construct

크게 3가지로 구성된다.

 

첫번째로 Cluster

테스크가 실행되는 논리적 그룹

  • Region 내 서비스 및 작업의 논리적 그룹화
  • IAM은 클러스터에 대한 사용자 권한 제어
  • 기본 인프라를 EC2를 사용할지 Fargate로 사용할지
    • 클러스터 생성 시 EC2 선택하면 ECS AMI 사용한 AutoScaling 그룹 생성 가능, 현재 클러스터에 컨테이너 인스턴스로 등록되어 작업(실행할 컨테이너들)이 배치되는 형태
  • 인스턴스 수준이 아닌 Task 수준으로 모니터링 진행하기 위한 컨테이너 인사이트 기능 제공
  • 작업을 스케쥴링할때도 스케쥴링 범위가 클러스터 안에 조인되어 있는 Container Instance가 대상이 되며 클라우드 워치 메트릭도 크게는 클러스터 단위로 집계가 된다.

두번째 Task & Task Definition

Task: 작업

  • Running Instance of a Task Definition
  • Oner or More Containers
  • ECS 클러스터에서 최소 실행 단위 - 네트워킹, 스토리지, 파라미터, IAM 역할, 컴퓨터 리소스 등을 구성
  • 작업 정의 내용을 기반으로 작업 배포
    - 배포 타입 설정: Fargate, EC2, External
    - 컨테이너 이미지 맵핑을 통한 정의 작업
    - 작업 역할을 부여해 API 요청을 받을 때 권한에 따라 동작
    - 작업 크기 설정
  • 작업 당 한 개 또는 최대 10개의 컨테이너 구성 가능

Task Definition: 작업정의

  • 작업을 시작하기 위해 Amazon ECS에서 사용되는 템플릿
  • Docker 실행 매개변수와 유사 요구사항을 정의
    • CPU/메모리
    • Container Image
    • Logging
    • IAM Role

마지막 세번째로 Sevice

필요한 태스크 수를 유지 및 ELB와 연동되어 외부로 서비스 노출

  • Maintains desired # of running tasks
  • Replaces unhealthy tasks
  • ELB integrated
  • ECS 위에서 여러 개의 작업을 실행
  • Unhealthy Task 확인 및 교체
  • 서비스 타입
    - Relica: 여러 개의 작업을 유지
    - Daemon: 컨테이너 인스턴스 하나당 한개의 작업. 즉, AutoScaling불가능하여 로그나 모니터링 사용
  • 배포 옵션 구성
    - Rolling Update
    - Blue/Green Deploy
    - Service Auto Scaling

 

작업 정의 후 서비스까지 만들었다면 외부로부터 트래픽을 받을 준비가 된 것이다.

그래서 앞단에 ALB나 NLB를 붙혀서 여러 Task들에게 트래픽을 분산한다.

 만약 Service가 여러개라면 ALB의 경로 기반 라우팅을 통해서 하나의 ALB만으로 여러 서비스로 라우팅

Unhealthy한 Task가 발생하면 Task를 재시작해주는 Auto Healing 기능을 제공한다.

 

추가적으로 ECS Agent, Agent Communication Service, Cluster Management Engine

  • Amazon ECS 자체는 AWS에서 관리하는 Control Plane으로, VPC 외부에 있습니다. 이를 통해 ECS 클러스터 내부의 각 EC2 인스턴스에서 실행 중인 ECS 에이전트와 통신하며 작업(Task)을 배포하고 상태를 관리한다.
  • Agent Communication Service은  ECS의 Control Plane에서 각 인스턴스의 ECS Agent와 통신해서 클러스터를 유지하고 여러 클러스터들이 하나의 논리적인 그룹으로 동작할 수 있도록 한다.
  • Cluster Management Engine은 ECS 클러스터를 구동 및 관리하는 엔진

 


배포

Rolling Update

어플리케이션의 구 버전을 순차적으로 신 버전으로 교체하여 다운 타임을 최소화 한다.

이때 MinimumHealthyPercent는 배포 시 Running 상태의 Task가 최소 몇 퍼센트 이상 되어야 하는지 지정하는 것이고 

MaximumHealthyPercent는 Running과 Pending 상태를 합한 Task가 최대 몇 개까지 허용될 수 있는지 설정하는 것이다.

 

Blue/Green Update

 


AWS Fargate Benefits

 


Amazon ECS Networking

Private Subnet에 위치한 경우

외부 API 요청

외부로 요청보낼 때 NAT Gateway로 Internet으로 요청 보내고 응답 받는 형태

그리고 외부 API를 요청할 때 업체 측에서 인바운드 요청을 받기위한 IP를 요구한다면 NAT Gateway에 고정 IP를 제공해서 서비스를 하는 형태가 될 것이다.

 

이미지를 불러오는 경우

일반적으로 AWS 환경에서 컨테이너 이미지는 ECR로부터 불러온다.

이는 VPC 외부에 있는 서비스로 외부 통신을 통해 이미지를 들고와야 한다.

이때 NAT Gateway를 사용할 수도 있지만 데이터 전송 비용 절감을 위해 VPC Endpoint를 통해 접근할 수 있다.

이는 VPC 외부에 배치 된 서비스인 ECR, S3, DynamoDB 모두에 해당된다.   

 

Public Subnet에 위치한 경우

이 경우에는 NAT Gateway가 아닌 Internet Gateway를 통해 데이터 전송 가능


Security Groups

보통 보안 그룹을 과도하게 오픈한다.

ALB로부터 ECS, ECS에서 DB로 접속할 때 왼쪽은 VPC 전체 대역을 대상으로 엑세스를 제어한다. 이는 필요 이상의 권한을 주는 것이라오른쪽과 같이 ECS는 ALB로부터만 가능하고 DB는 ECS로 부터만 가능하도록 한다.


Manage Secrets

민감 정보를 저장할때 API 키나 DB Password 등을 static하게 넣어두는 것은 유출의 위험이 있다.

그래서 아래와 같이 ECS 서비스 외부에 파라미터 값을 저장하고 Task가 프로비저닝 되는 시점에 ECS Agent가 AWS Secrets Manager로 부터 파라미터 값을 들고와 안전하게 실행시키는 방법을 채택하도록 하자.


Logging & Monitoring

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

'DevOps > AWS Services' 카테고리의 다른 글

[AWS] NAT Gateway와 Bastion Host  (0) 2024.11.23
[AWS] VPC - 보안그룹과 NACL  (0) 2024.11.23
[AWS] VPC와 Subnet  (0) 2024.11.23
[AWS] 퍼블릭 IP, 프라이빗 IP 그리고 탄력적 IP  (0) 2024.06.28
[AWS] Region와 AZ  (0) 2024.06.25