AWS Container (1) - Docker & ECS Intro
2024년 8월 14일 작성
공부 & 사이드프로젝트에 적용 겸 쿠버네티스 스터디를 시작하게 되었는데 그 전에 혼자 컨테이너 부분만 다시 SAA 강의를 들어볼 생각이다!
강의에 컨테이너 섹션에서 docker-ecs-ecr-eks-apprunner 순으로 알려줘서 이걸 들어보고 쿠버네티스에 대해 더 공부해봐야지.
1. Docker Instruction
도커란?
- 도커는 애플리케이션을 배포하기위한 software development platform
- 앱은 컨테이너로 패키징된다; containers can be run on any OS
- 애플리케이션이 컨테이너와 마찬가지로
- any machine
- no compatibility issues
- Predictable behavior
- Less work
- Works with any language, any OS, any technology
- Use cases: MSA, lift-and-shift apps from on-premise to the AWS cloud
Docker on an OS
그림과 같이 어떤 애플리케이션이든 컨테이너로 패키징해 실행할 수 있다.
도커 이미지는 어디에 저장되나요?
- 도커 이미지는 '도커 저장소'에 저장된다.
대표적으로 다음 두 저장소가 있다.
- Docker hub
- public repository
- 알려진 많은 기술 혹은 OS의 베이스 이미지를 찾아볼 수 있다.
- AWS ECR
- Private repository
- Public repository 도 있다. (Amazon ECR Public Gallery https://gallercy.ecr.aws)
Docker vs. Virtual Machines
- 도커는 가상화 기술 중 하나이지만, 정확하게 그렇지는 않다.
- 리소스가 하나의 호스트 내에서 공유된다. -> 컨테이너 여러대가 하나의 서버에 있다.
Virtual Machine의 구조
- vm 마다 리소스를 공유하지 않고, 격리되어있다.
- AWS의 EC2가 생성되는 방식 :D
도커 컨테이너 생성 구조
반면에 도커 컨테이너들은 사실상 네트워킹과 데이터들을 공유한다. 이 점에서는 vm 보다 보안성이 높진 않지만 하나의 서버에 더 많은 컨테이너를 실행할 수 있게 한다.
Getting Started with Docker
다음은 간단한 ECR 이용 흐름
Docker containers Management on AWS
- Amazon Elastic Container Service (Amazon ECS)
- Amazon's own container platform
- Amazon Elastic Kubernetes Service (Amazon EKS)
- Amazon's manages Kubernetes (open source)
- AWS Fargate
- Amazon's own Serverless container platform
- works with ECS and with EKS
- Amazon ECR:
- Store container images
2. Amazon ECS
ECS는 실행하는 방식이 두가지 있는데, 우선 EC2 Launch Type 부터 본다.
Amazon ECS - EC2 Launch Type
-
도커 컨테이너를 AWS에서 런치한다는 뜻은, ECS Task 를 ECS 클러스터에서 실행한다는 것이다.
-
EC2 Launch Type: 이 타입은 우리가 반드시 EC2 인스턴스를 프로비저닝하고, 인프라를 관리해야한다.
-
이 인스턴스들을 ECS 클러스터에 등록하기 위해서는 반드시 ECS 에이전트를 실행하고 있어야한다.
-
이 경우, AWS는 컨테이너 실행과 중지에만 관여한다.
Amazon ECS - Fargate Launch Type
- 우리가 인프라를 프로비저닝 할 필요가 없다.
- EC2 인스턴스를 관리할 필요가 없다는 뜻이다.
- 서버리스 서비스이다.
- 우리는 task definition만 정의하면 된다.
- AWS 는 우리가 정의한 ECS Task(based on the CPU/RAM) 를 실행한다.
- 스케일링을 위해서는 task의 숫자만 높여주면 된다.
Amazon ECS - IAM Roles for ECS
ECS 에서 활용 가능한 IAM 역할을 소개한다.
-
EC2 Instance Profile (EC2 Launch Type에서만 사용 가능):
- ECS 에이전트가 사용하는 IAM 역할이다.
- ECS Service API를 호출할 수 있다.
- 컨테이너 로그를 Cloudwatch로 전송할 수 있다.
- 도커 이미지를 ECR 에서 pull 받을 수 있다.
- Secrets Manager 혹은 SSM parameter store을 참조할 수 있다.
- ECS 에이전트가 사용하는 IAM 역할이다.
-
ECS Task Role: 위 그림에서 task에 있는 role A, B이다.
- task 정의 시 붙일 수 있는 역할이다.
- 각 ECS 서비스에 대한 접근 권한을 정의하는 역할이다.
- 그래서, 컨테이너가 인스턴스 내에서 실행되면 컨테이너 내부에서 이 역할을 사용해서 ECS 서비스에 필요한 권한을 얻을 수 있게 된다.
Amazon ECS - Load Balancer Integrations
- 유저들은 로드밸런서에 직접 접근하고, 로드밸런서는 ECS 서비스를 이용하는 구조이다.
원하는 로드밸런서를 사용할 수 있다.
- ALB (애플리케이션 로드밸런서): 대부분의 유즈케이스를 지원한다.
- NLB (네트워크 로드밸런서): high throuhput/high performance 유즈케이스에만 추천
- 혹은 AWS Private Link와 페어로 사용하는 것을 추천
- Classic Load balancer: 지원은 되지만 추천하지 않음 (no advanced features - no Fargate)
Amazon ECS - Data Volumes (EFS)
ECS에서의 데이터 영속화는 어떻게 이뤄질까? 마찬가지로 기존 서비스를 활용할 수 있다. 여러 서비스가 활용 가능한데, 그중 하나가 EFS이다.
- EFS 파일시스템을 ECS 테스크에 마운팅할 수 있다.
- EC2/Fargate Launch Type 모두에 사용가능하다.
- 태스크가 어떤 AZ에 있든 EFS 파일시스템의 같은 데이터를 공유할 수 있다.
- EFS 가 서버리스 시스템이라서, 만약 ECS 로 Fargate를 사용하면 데이터 볼륨까지 모두 서버리스로 이용하게 되는 것이다.
- Fargate + EFS = Serverless
- Use cases: persistent multi-AZ shared storage for your containers
- 노트: S3는 파일시스템으로 마운팅할 수 없다.
3. Hands on!
ECS 클러스터 생성 핸즈온
-
ECS 콘솔에 들어간다.
-
클러스터 생성을 클릭.
-
인프라의 옵션은 Fargate와 EC2 그리고, 외부 데이터센터의 머신을 사용하는 것이 있다. (복수 선택 가능)
EC2 Launch Type을 추가하면 다음과 같이 마법사가 늘어난다. 인스턴스 설정을 해주면 된다.
- 이렇게 설정해주면 AutoScaling Group 콘솔에서 생성된 ASG를 확인할 수 있다.
특이한 것은 서비스 생성 시 fargate와 ec2 lauch type 이렇게 두 가지를 골랐는데, 서비스 인프라의 사용가능한 프로바이더를 보면 세 가지가 있는 것을 확인할 수 있다.
FARGATE
: 이 ECS 클러스터에서 인스턴스 시작을 Fargate로 할 수 있다는 뜻이다.- 'FARGATE_SPOT': 이 클러스터에서 Fargate task를 spot 모드로 실행할 수 있다는 뜻이다.
- ASGProvider 타입: EC2 인스턴스를 ASG를 통해 직접적으로 생성할 수 있다는 뜻이다.
- Group Size는 ASG 리소스>그룹세부정보>편집 에서 정해줄 수 있다.
ECS 애플리케이션 실행 핸즈온
- ECS 콘솔 사이드바에서 Task Definition (태스크 정의) 에 들어가서 Create new task Definition을 누른다.
- 콘솔 GUI로 기본적인 것들을 설정하는 방법과 json 파일을 이용하는 방법이 있는데, 지금은 간단한 실습이니 콘솔로 진행한다.
- 인프라 요구사항 설정하기 (Infrastructure Requirements)
- 태스크에서 실행될 애플리케이션에 필요한 만큼 CPU와 메모리 크기를 설정해줄 수 있다.
- Task 의 IAM Role 도 여기서 설정해줄 수 있는데 (태스크 역할 부분)
- 태스크 역할(Task Role)은 태스크 내에서 AWS 의 다른 서비스 접근 권한이 필요한경우 추가,
- 태스크 실행 역할(Task Execution Role)은 태스크에서 ECS API를 요청하는데 필요한 것이다. (따로 만들지 않아도 기본적으로 만들어준다.)
- 컨테이너 설정하기
- 컨테이너 이름 설정
- 우리는
nginxdemos/hello
이미지를 사용할 것이다. Dockerhub에서 확인 가능 - 포트 바인딩 설정
- 환경변수, 로깅 등 조절 가능
원하는대로 설정하고 나서 생성해두면된다. 이제 만들어둔 task definition으로 task를 생성하자.
-
클러스터에 태스크 생성하기 - 클러스터에 들어가서 Create(태스크 생성)에 들어간다.
-
배포 구성 입력하기
- 애플리케이션 타입에 서비스와 태스크 두가지가 있는데,
- 서비스는 계속 실행하고 있어야 하는 경우 사용하고 태스크는 한 번 실행하고 종료시킬 경우 사용한다.
- 이 외에는 알맞게 입력하자 :D
-
네트워킹을 설정하고 로드밸런서도 추가해주었다.
-
이렇게 생성한 task definition은 서비스 생성시 지정해서 사용할 수 있다.
서비스 생성시 구성은 다음과 같이 했다. (ALB, target group, security group 생성)
왕 됐당. 처음에 Computing options 를 기본설정인 Capacity provider strategy 의 ASG를 선택해서 프로비저닝이 실패했었는데, 그 이유인즉슨 내가 task definition에 앱 환경을 Fargate 로 해놓아서 그랬던 것 같다. (내 추측이다.) 내 예상대로 시작유형을 Fargate로 정해서 제대로 실행할 수 있었다.
Capacity Provider strategy 설명을 콘솔에서 읽었을 땐 바로 이해하기 힘들었는데 좋은 글을 찾아서 공유 -> velog: AWS ECS - Capacity Provider를 이용하여 오토스케일링을 쉽게 관리하자
- 실행이 되고 나면 ASG 엔드포인트에 브라우저로 접속했을 때 다음화면을 볼 수 있었다.
- 콘솔에서 로그도 확인해볼 수 있었다.
오늘은 여기까지 다음 내용은 ECS의 오토스케일링과 권장 아키텍처다.