AWS SAA : Container : ECS, Fargate, ECR, EKS
Docker
앱 배포를 위한 소프트웨어 배포 플랫폼 : 앱이 컨테이너에 패키징되어있음
- 모든 OS에서 작동 가능함
- 어떤 머신이든 호환성 문제가 없음
- 행위 특성 예측해 작업을 덜어줌
- 유지 및 배포가 쉬움
- 언어, 운영체제, 기술에 상관없이 작동
Use case
- Microservice Architecture
- Lift-and-shift apps from on-premises to the AWS cloud
Docker image store : Docker Repository에 Docker image 저장됨
- Docker Hub
- public repository
- 많은 기술 / OS에 맞는 기본 이미지 찾을 수 있음
- Amazon ECR (Elastic Container Registry)
- private repository
- public repository (Gallery)
Docker (← Virtual Machine과 비교했을 때)
- 가상화 기술 중 하나로 볼 수 있지만, 정확히 가상화라고 볼 수 없음
- 리소스가 호스트와 공유됨 ⇒ 한 서버에서 다수의 컨테이너 공유
- Infra > Host OS > Docker Daemon > 다수의 Container
- 네트워크, 데이터 등을 공유
- 가상머신보다 덜 안전하지만, 하나의 서버에서 많은 컨테이너를 실행할 수 있기에 도커 컨테이너를 많이 사용함
Docker 사용법
- DockerFile (도커 컨테이너를 구성하는 파일) 작성
- base docker image에 몇가지 파일을 추가해 구축하면 Docker Image가 됨
- Docker Image를 Docker Repository에 push해 저장
- 나중에 Docker Repository에서 Docker Image를 pull해 실행
- Docker Container가 되고, DockerFile을 실행
Docker Containers Management on AWS
- ECS (Elastic Container Service)
- 도커 관리를 위한 Amazon의 전용 플랫폼
- EKS (Elastic Kubernetes Service)
- 관리형 Kubernetes (open source)
- Fargate
- Serverless Container platform
- ECS, EKS와 함께 동작
- ECR (Elastic Container Registry)
- Container Image 저장하는 Repository
ECS
AWS에서 Docker container를 실행 = ECS Cluster 위에서 ECS Task 실행
Launch Type
- EC2 Launch Type
- 각 EC2 instance 안에 docker container가 존재하고, docker 안에 ECS agent가 있음
- infra를 미리 프로비저닝하고 관리해야 함
- 각 EC2 instance들은 ECS agent를 실행 → EC2 instance들을 ECS Cluster와 ECS service에 register
- ECS task 수행 후, AWS가 컨테이너를 시작하거나 멈춤
- Fargate Launch Type
- infra를 미리 프로비저닝하지 않음 → 관리할 EC2 instance가 없음
- 서버리스
- ECS task를 정의하면, 필요한 infra를 AWS가 대신 실행
- 새 도커 컨테이너가 실행되면, AWS Fargate가 어디서 실행되는지 알리지 않고 그냥 실행. 작업을 위해 백엔드에 EC2 instance가 생성될 필요 X
- 확장을 위해 간단히 task 수만 늘리면 됨
IAM Roles
- EC2 Instance Profile (EC2 launch type only)
- ECS agent에 의함
- ECS service에 API call
- CloudWatch Log에 container log 전송
- ECR로부터 Docker Image Pull
- Secrets Manager, SSM Parameter store에 민감 데이터 저장
- ECS Task Role (EC2, Fargate)
- task definition 통해 각 task에 특정 역할을 만들 수 있음
- 역할이 각자 다른 ECS 서비스에 연결할 수 있도록 만듦
Load Balancer Integration
ECS Cluster 내에 ECS Task들이 여러 개 존재할 때,
ECS Cluster 앞에 Load Balancer 연결
- ALB : 대부분의 케이스에서 사용
- NLB : 높은 처리량을 요구하는 케이스 / AWS Private Link와 연결하는 케이스
Data Volumes
- EFS
- ECS task에서 file system을 이용해 데이터를 공유하고 싶을 때 사용
- EC2, Fargate 모두 사용 가능
- ECS task에 파일 시스템을 직접 마운트할 수 있음
- 어떤 AZ에 있던 같은 데이터를 활용해 태스크 수행 가능
⇒ Fargate + EFS = Serverless
ECS Service Auto Scaling
ECS task를 자동으로 scaling
: AWS Application Auto Scaling을 이용하여 ECS Auto Scaling 가능
Metrics
- ECS Service Average CPU Utilization
- ECS Service Average Memory Utilization
- ALB Request Count Per Target
Scaling 방법
- Target Tracking : 특정 타겟 추적해 설정
- Step Scaling : 단계별로 설정
- Scheduled Scaling : 미리 ECS 서비스 확장을 설정
Auto Scaling EC2 instances
- Auto Scaling Group Scaling
- Metric에 기반하여 ASG를 scaling
- ECS Cluster Capacity Provider
- ASG와 함께 사용됨
- 새 task를 실행할 용량(RAM, CPU)이 부족하면 자동으로 ASG 확장
- 이것이 더 권장됨
ECR
Elastic Container Registry → AWS에 도커 이미지를 저장하고 관리하는데 사용
저장 외에도 이미지 취약점 스캐닝, 버저닝 태그, 수명 주기 확인 가능
ECS와 완전히 통합되어 있고, S3에 저장되어있음
EKS
Elastic Kubernetes Service → AWS에 관리형 쿠버네티스 클러스터 실행
Kubernetes : Docker로 컨테이너화한 애플리케이션의 자동 배포, 확장, 관리
컨테이너를 실행한다는 목적으로 ECS와 비슷하지만 API가 다름 (오픈 소스, 표준화)
쿠버네티스는 cloud-agnostic → 모든 클라우드에서 지원
클라우드 또는 컨테이너간 마이그레이션할 경우, EKS 사용 가능
Launch mode
- EC2 launch mode
- worker node 배포
- Fragete launch mode
- serverless container 배포
동작
- 각 AZ에 EKS node가 있음. 이 노드들은 auto scaling group으로 관리됨
- 각 node는 EKS pods 실행
- private LB나 public LB를 설정해 웹과 연결
노드 유형
- Managed Node Groups
- AWS로 노드 (EC2 instance) 생성, 관리
- 노드는 EKS 서비스로관리되는 ASG 의 일부
- On-Demand 인스턴스와 Spot 인스턴스 지원
- Self-Managed Node
- 사용자 지정 사항이 많고 제어 대상이 많은 경우 사용
- 직접 노드를 생성하고 EKS 클러스터에 등록한 다음 ASG의 일부로 관리
- prebuilt AMI인 Amazon EKS Optimized AMI 사용하면 시간 절약
- On-Demand 인스턴스와 Spot 인스턴스 지원
- AWS Fargate
- 노드를 원하지 않을 경우 사용
Data Volume
- EKS Cluster에 데이터 볼륨을 연결하려면, StorageClass manifest 지정
- CSI (Container Storage Interface) 규격 드라이버 활용
- EBS, EFS (fargate), FSx for Lustre, FSx for NetApp ONTAP 지원
AWS App Runner
- 완전 관리형 서비스
- 규모에 따라 Web Application이나 API 배포
- infra 경험이나 지식이 없어도 배포 가능
- source code나 container image로 시작하면 app runner가 자동으로 빌드하고 배포해줌
- 오토 스케일링, 가용성 높음, 로드 밸런서, 암호화, VPC Access support, DB 연결, 캐시, 메세지 큐 서비스 등.