이 글은 24년 하반기 AWS Certified Solutions Architect - Associate(이하 AWS SAA-C03) 자격증 취득을 위해서 아래 유데미 강의를 보고, 공부한 내용을 정리하였습니다.
https://www.udemy.com/course/best-aws-certified-solutions-architect-associate
Docker
- 앱 배포를 위한 소프트웨어로 컨테이너 기술
- 컨테이너는 앱을 패키징.. 표준화 되어 있어서 아무 OS에나 실행 가능
- OS와 상관없이 동일하게 실행됨.. 호환성 문제 없음
- 사례 : MSA
동작 원리
- 도커 에이전트 실행 시 Docker 컨테이너 실행
- 다수의 컨테이너가 동시에 실행 가능
- 도커 이미지는 도커 리포지토리에 저장됨
- DockerHub : 공개 리포지토리, 많은 기본 이미지를 찾을 수 있음
- ECR : 기본적으로 비공개 리포지토리, ECR Public Gallery라는 공개 옵션도 있음
도커와 가상 머신 차이점
도커
- 정확히 가상화 기술은 아님
- 리소스가 호스트와 공유되어, 한 서버에서 다수의 컨테이너 공유 가능
- 도커는 Host OS 위에 도커 데몬이 있고, 그 위에 컨테이너가 올라감
- 가볍게 실행되는 컨테이너라 공존 가능.. 네트워크나 데이터 공유 가능(보안 측면에선 덜 안전)
가상머신
- 가상머신은 Host OS위에 하이퍼바이저가 있고, 그 위에 게스트 OS가 있음
- EC2 머신은 하이퍼바이저에서 실행되는 가상 머신
- 가상 머신의 EC2인스턴스는 각자 분리되어 있음... 리소스 공유 안함
사용방법
1. Dockerfile 작성
2. Build 하여 도커 이미지 생성
3. Docker 리포지토리에 푸시 가능
4. Docker 리포지토리에서 pull 받아서 실행하면 도커 컨테이너가 됨
AWS에서 도커 관리
ECS : 아마존 고유의 컨테이너 플랫폼
EKS : 쿠버네틱스의 관리형 버전.. 오픈 소스 프로젝트
Fargate : 서버리스 컨테이너 플랫폼.. ECS / EKS 함께 작동 가능
ECR : 컨테이너 이미지 저장에 사용
ECS
- 실행시 ECS 클러스터에 ECS 테스크를 실행하는 것
Launch Type
EC2 시작 유형
- ECS 클러스터가 여러 EC2 인스턴스로 구성됨
- 인프라를 직접 프로비저닝하고 유지해야함
- 각각 ECS 에이전트를 실행하는데, ECS 에이전트가 각 EC2 인스턴스를 ECS 서비스와 지정된 ECS 클러스터에 등록
- ECS 테스크를 실행하면, AWS가 컨테이너를 시작/중지 함
`Fargate 시작 유형
- 인프라를 프로비저닝 하지 않음.. 서버리스
- ECS 태스크 정의만 있으면, 필요한 CPU, RAM에 따라 ECS 태스크를 AWS가 실행해줌
- 확장하려면 태스크 수만 늘리면되고, EC2인스턴스를 관리할 필요 없음
ECS IAM Role
EC2 인스턴스 프로파일 역할
- EC2 시작유형에서는 EC2 인스턴스 프로파일을 생성
- ECS agent 만이 EC2 인스턴스 프로파일을 이용해 ECS 서비스에 API 호출을 함
- ECS 서비스가 CloudWatch 로그에 API 호출을 해서 로깅
- ECS 서비스가 ECR로부터 도커 이미지를 가져옴
- 필요에 따라 시크릿 매니저나 SSM에서 민감 데이터를 참고하기도 함
ECS 태스크 역할
- ECS 태스크는 ECS 태스크 역할을 가짐
- EC2, Fargate 공통
- 각 태스크마다 각자의 특정 역할을 만들 수 있음
- 역할을 각자 만드는 이유는, 각 역할이 다른 ECS 서비스에 연결할 수 있게 하기 때문
- ECS 서비스의 '태스크 정의'에서 태스크 역할을 정함
로드밸런서 통합
- HTTP나 HTTPS 엔드포인트로 ECS 태스크를 활용하기 위해 ALB 사용
- 모든 사용자가 ALB 사용하면 백엔드의 ECS 태스크에 직접 연결
- NLB는 고성능을 요구하거나, AWS Private Link를 만들 때 사용
- ELB(구세대)는 사용할 수는 있지만 권장되지 않음... 고급기능X, Fargate 지원 X
데이터 볼륨(EFS)
- EFS를 쓰면 둘다 호환되고, EC2 태스크에 파일시스템을 직접 마운트 가능
- 어느 AZ에서 실행되더라도 EFS에 연결되어 있다면 데이터를 공유할 수 있음
- Fargate + EFS로 서버리스에서 파일 시스템 지속성 확보 가능
- 사례 : EFS+ECS로 다중 AZ가 공유하는 컨테이너의 영구 스토리지
- * S3는 ECS에 파일 시스템으로 마운트 될 수 없음
ECS 오토스케일링
- 태스크 수를 자동으로 줄이거나 늘릴 수 있음
`- 사용할 수 있는 지표 : ECS 서비스 CPU/메모리 사용률, ALB 타겟당 요청 수
- 대상 추적 스케일링, 단계 스케일링, 예약 스케일링
- EC2 시작 유형이라면.. ECS 서비스 오토스케일링(태스크 레벨) != EC2 오토스케일링(EC2 인스턴스 레벨)
- EC2 오토스케일링이 필요없다면, Fargate를 사용하는 것이 서비스 오토스케일링에 도움이 됨
EC2 시작 유형에서 EC2 인스턴스 스케일링
- ASG 스케일링 : CPU 사용률 등에 맞춰 스케일링
- ECS 클러스터 용량 공급자 사용(권장) : 새 태스크를 실행할 용량이 부족하면 자동으로 ASG 확장
ㄴ 용량 공급자는 ASG와 함께 사용, CPU/RAM이 부족할 때 EC2 인스턴스 추가
사례
EventBridge에 의해 호출된 ECS 태스크
1. 사용자들이 객체를 S3 버킷에 업로드
2. S3버킷의 모든 Event는 EventBridge로 전송
3. EventBridge는 ECS 태스크를 실행하기 위한 규칙 가짐
4. ECS 태스크 역할로 S3: GetObject와 DynamoDB에 결과를 전송하는 역할을 가짐
EventBridge 스케줄러를 이용
1. EventBridge는 1시간마다 ECS 태스크 생성 트리거
2. S3에 배치 프로세스 가능
SQS 큐
1. 메시지가 SQS 큐로 들어오면, ECS 서비스 자체가 메시지 폴링
2. SQS 큐 내 메시지 수에 따라 ECS 태스크 오토스케일링
EventBridge를 사용하여 ECS 클러스터 안에서 이벤트 가로채는 형태
1. ECS 태스크가 삭제될 때 이벤트 트리거
2. SNS로 관리자에게 경보
ECR
- AWS에 도커 이미지를 저장할 수 있음... DockerHub 등 온라인 저장소 대용
- Private / Public 옵션 있음
- ECR은 ECS와 완전히 통합되어 있고, 이미지는 백그라운드에서 S3에 저장됨
- ECS 클러스터 內 EC2 인스턴스에서 ECR 이미지를 pull 해올 때는 IAM 역할 필요
- 단순히 리포지토리 기능뿐만 아니라, 이미지의 취약점 스캐닝, 버저닝, 태그 및 수명 주기 확인 지원
EKS
EKS란
- 관리형 쿠버네티스 클러스터 실행하는 서비스
- 오픈소스 시스템으로 Docker로 컨테이너화한 애플리케이션의 자동 배포, 확장, 관리 지원
- ECS(오픈소스 아님)와 유사하지만 사용하는 API가 다름... k8s는 여러 제공자가 지원하기에 표준화 기대
실행모드
EC2 시작 모드 : EC2 인스턴스에서처럼 작업자 모드를 배포
Fargate 모드 : EKS 클러스터에 서버리스 컨테이너를 배포할 때 사용
- 사례 : 회사가 온프레미스나 클라우드에서 k8s나 k8s API를 쓰고 있을 때, k8s 클러스터를 관리할 때 사용
`- k8s는 클라우드 애그노스틱으로 (애저, 구글 등 모든 클라우드에서 지원).. 다른 클라우드와 마이그레이션 시 솔루션이 될 수 있음
형태
- VPC 內 각 AZ에서 public/private 서브넷이 있음
- 각 private 서브넷 안에 여러 EKS 노드 들이 EKS Pods(ECS 태스크와 유사)를 이루고 있음
- EKS Pods는 ASG로 관리가능
- 로드밸런서로 웹에 연결해야함
노드 유형
관리형 노드 그룹
- AWS로 노드, 즉 EC2 인스턴스를 생성하고 관리
- 노드는 EKS 서비스로 관리되는 ASG 그룹의 일부
- 온디맨드/스팟 인스턴스 지원
자체 관리형 노드
- 직접 노드 설정하고 EKS 클러스터에 등록 후 ASG의 일부로서 관리
- 사전 빌드된 AMI인 Amazon EKS 최적화 AMI를 사용하면 시간절약 가능
- 온디맨드/스팟 인스턴스 지원
AWS Fargate
- 유지 관리 필요 없음
- 노드 관리 필요 없음
- EKS에서 컨테이너만 실행하면됨
데이터 볼륨
- StorageClass 매니패스트(manifest, 명백한)를 지정해야함
`- CSI(컨테이너 스토리지 인터페이스)라는 규격 드라이버 사용
- EBS나 Fargate모드가 작동하는 EFS를 지원
- Amazon FSx for Lustre, NetApp ONTAP 지원
AWS App Runner
- 완전 관리형 서비스로 규모에 따라 웹 애플리케이션, API 배포를 도움
- 인프라나 컨테이너, 소스 코드 등을 알 필요 없음
- 소스 코드나 Docker 컨테이너 이미지로 원하는 구성 설정하면 App Runner가 알아서 웹 앱을 빌드하고 배포
- API나 웹 앱이 배포된 다음엔 URL로 바로 액세스 가능
- 오토스케일링 가능, 가용성 높음, 로드 밸런싱 및 암호화
- VPC 액세스 가능
- 메시지 대기열, DB, 캐시에 연결 가능
- 사례 : 빨리 배포해야하는 웹 앱, API, MSA... 신속한 프로덕션 배포 가능
- AWS에 프로덕션 애플리케이션 컨테이너를 배포할 수 있는 강력한 올인원 서비스
+ 그냥 코드만 올려도 빌드해서 도커 이미지로 만듬
+ Elastic Beanstalk이 보다 많은 설정과 유연성 제공하지만, App Runner는 모범 사례를 따라 가장 쉬운 방식으로 배포 가능
+ lambda는 이벤트 기반 코드에 적합, App Runner는 지속적인 코드에 적합