ECS(Elastic container Service)는 AWS에서 도커 컨테이너를 시작하도록 도와주는 서비스이다. EC2 인스턴스 같은 인프라는 프로비전하고 관리해 주어야 하고, ALB에 통합될 수 있다.
우리는 먼저 EC2를 생성하고 그 안에 ECS Agent를 설치한다. 혹은 설치되어 있는 AMI를 가져와도 된다.
그러면 ECS에서 자동으로 ECS Tasks(컨테이너)를 할당해 준다.
Fargate
ECS와 비슷하지만 서버리스라서 EC2 인스턴스를 관리할 필요가 없다. ECS나 EKS 위에서 돌아간다. 우리가 필요한 CPU / RAM 위에서 컨테이너를 돌린다.
권한 할당
EC2 Instance Profile
EC2 자체의 정책이다.
ECS Agent에서 ECS 서비스 API를 호출할 수 있게 한다.
CloudWatch에 로그를 쓸 수 있게 한다.
ECR 서비스에서 도커 이미지를 가져온다.
민감한 데이터를 참조한다.
ECS Task Role
인스턴스 내의 각 Task에게 다른 AWS 서비에 접근할 수 있도록 권한을 준다.
각 Task별로 할당되며 태스크 정의에서 정의된다.
ECS Data Volumes + EFS File Systems
Task끼리 같은 데이터를 참조하고 쓰려면 어떻게 해야 할까?
EFS는 원래 AZ 상관없이 여러 인스턴스에 마운트되어 사용될 수 있으므로 이것을 쓰는 게 가장 좋아 보인다.
또 Fargate는 서버리스라서 데이터를 저장하기가 마땅찮은데, EFS에 저장해 놓고 쓰면 편하다!
ECS Tasks + Application Load Balancer
EC2를 묶어 ALB에 등록하는 것처럼, Tasks들을 묶어 ALB에 등록할 수도 있다.
같은 인스턴스의 Task와 다른 인스턴스의 Task도 자유롭게 묶을 수 있다.
Task들은 생성될 때 랜덤하게 포트를 할당 받는데, ALB는 해당 포트를 어떻게 알아서 잘 찾아서 연결한다. (Dynamic Port Mapping)
단 EC2 보안 정책에서 막아버리면 답이 없기 때문에, 꼭 ALB에서 오는 모든 Inbound 트래픽을 허용해주자.
ECS Fargate Tasks + Application Load Balancer
Fargate에서는 각각의 Task는 각각의 ENI와 연결되고, 따라서 모두 각자의 IP를 가지게 된다.
이때는 포트를 우리가 정할 수 있기 때문에 보안 그룹에서 모두 허용할 필요가 없다.
Event Bridge로 Task 실행하기
Event Bridge는 AWS 서비스에 특정 이벤트가 발생했을 때 어떤 행동을 취할 지 매개해 주는 서비스이다.
이 예시는 S3에 객체가 업로드되었을 때, Task는 자동으로 S3 버킷의 객체를 가져와 Dynamo DB에 저장한다.
이 작업을 위해서는 사전에 ECS Task Role을 설정해 "S3에서 객체를 읽는 것"과 "Dynamo DB에 쓰는 것"에 대한 권한을 받아와야 한다.
ECS 스케일링
ECS 확장에는 2가지가 있다.
Task의 수를 늘린다.
Task를 담고 있는 리소스를 늘린다.
기본적으로는 Task의 수를 늘려 확장한다. ASG와 비슷하게 AWS에서는 Application Auto Scale을 지원한다. 하지만 Task만 늘리면 EC2 리소스가 가득 찰 수도 있기 때문에, 어느 정도 가득 차면 ECS Capacity Provider(EC2 등)를 확장한다.
ECS Rolling Updates
도커 이미지를 수정해서 다시 배포하려고 한다. 어떻게 해야 제일 좋을까? 간단하다. 점진적으로 바꾸면 된다.
ECS를 보면 두 가지 변수를 정의한다; Minimum Healthy percent,Maximum percent.
그러면 ECS는 두 조건을 만족하면서 차츰 업데이트를 한다.
2. ECR
도커 이미지를 저장, 관리하는 AWS 자체 서비스이다.
ECS와 완전히 연동되고, IAM으로 권한을 관리하며, S3에 백업을 한다.
또한, 취약점 탐색, 태그, 이미지 수명수기 관리 기능을 지원한다.
3. EKS
EC2와 Fargate를 기본 리소스로, 컨테이너를 쿠버네티스로 관리하고 제어할 수 있게 도와주는 서비스이다.
쿠버네티스는 Cloud-Agnostic(클라우드에 종속되지 않음)하기 때문에 어떤 클라우드 서비스와도 연동이 가능하다.