도커 컨테이너 관리
아마존에서 제공하는 서비스는 3가지가 있다.
- ECS
- Fargate
- 아마존의 serverless container 플랫폼이다.
- EKS
- 아마존의 관리형 쿠버네티스이다(오픈소스 컨테이너 관리 플랫폼).
ECS
- ECS = Elastic Container Serivce
- 이를 통해 도커 컨테이너를 aws에서 실행할 수 있다.
- ECS를 사용하기 위해서는 인프라를 프로비저닝 하고 관리해야 한다.
- 보통 EC2가 사용되는데 관리하고 싶지 않다면 Fargate(serverless)를 사용하는 방법도 있다.
- ALB와 결합해 서비스와 태스크를 외부로 노출 시킬 수도 있다.
만약 아래와 같이 세 가지 EC2 인스턴스에서 컨테이너를 운용 중인 경우 ECS가 새로운 container를 실행시키려 한다면 어느 인스턴스에서 실행시킬 지를 결정하게 된다.
이 때, 도커 컨테이너가 얼만큼의 CPU와 램을 필요로 하는 지에 따라 특정한 EC2 인스턴스에 배치될 것이다.
두 가지 launch types
EC2 launch type for ECS
- 아마존 ECS cluster가 여러 가용 영역에 걸쳐 존재한다.
- EC2 container instance는 하나 이상의 auto-scaling groups에 속해 있으며 ECS cluster를 이용해 이 containers를 등록할 것이다.
- 각 container instance에는 ECS agent가 속하게 된다.
- 이 때, ECS를 위해 만들어진 AMI를 이용하면 ECS는 pre-configured 될 것이다.
- 그러면 이제 ECS agent는 모든 container instance에서 운영될 것이다.
- 인스턴스들은 ECS agent 덕분에 ECS cluster에 등록될 것이고 일부 container instance들은 ECS task를 실행하는 데 사용될 수 있다.
- container instance의 vCPU가 클수록 많은 ECS 태스크를 운용할 수 있다.
Fargate
- Fargate는 EC2 instance처럼 도커 컨테이너를 실행할 수 있다는 점은 같다.
- 그러나 Fargate는 EC2 처럼 관리하지 않아도 되기 때문에 프로비저닝 할 필요가 없다.
- Fargate는 사용자가 얼마나 많은 CPU와 램을 필요로 하는 지에 근거해 container를 운영할 것이다.
- Fargate 클러스터에 실행할 새로운 Docker container와 ECS 태스크가 필요할 경우 Fargate는 사용자가 필요로 한 곳 어디에서나 작동하게 된다.
- 이 때 EC2 인스턴스가 필요하지 않으며 container 자체로 실행하게 된다.
- Fargate는 ECS의 일부이다.
- ECS를 위한 Fargate launch type에서 EC2 instance와 같이 vpc, AZ를 갖고 있지만 EC2에서와 다른 점은 Fargate 서비스가 태스크를 수행한다는 점이다.
- 이 Fargate task에 접속하기 위해서 ENI라는 Elastic Network Interfaces를 보유하게 된다.
- ENI는 vpc 내에서 네트워크 IP에 이 태스크를 바인딩 할 것이다.
- 이렇게 바인딩 함으로써 태스크에 접속할 수 있게 된다.
- task가 증가할수록 ENI 역시 증가하게 되며 ENI는 모든 task가 개별적으로 갖게 된다.
- ENI는 별개의 IP이기 때문에 vpc 안에 사용하고 있지 않은 충분한 private IP address를 보유하고 있는지 확인할 필요가 있다.
- 태스크가 많을 경우 Fargate cluster를 운영하기 위한 충분한 vpc가 필요하게 된다.
ECS tasks를 위한 IAM roles
ECS tasks는 다른 aws 서비스에서 작업을 하게 되는 경우도 생길 수 있다.
예를 들어, DynamoDB 또는 S3와 상호작용 하게 될 수도 있다.
이럴 경우 IAM roles가 필요한 것이다.
EC2 instance를 위한 IAM roles 뿐만 아니라 ECS를 위한 IAM roles도 있다!
아래의 예시는 ECS cluster 내에서 동작하는 EC2 instance에 대한 것이다.
-
EC2 instance profile: instance가 가진 role을 ECS agent가 사용할 수 있다.
- 이를 이용해 ECS 서비스에 API call을 할 수 있다.
- 또한, 이를 통해 CloudWatch에 로그를 보낼 수 있다.
- ECR로부터 도커 이미지를 pull 받을 수 있다.
- Secrets를 사용하는 경우 Secrets Manager 또는 SSM parameter store를 이용하게 될 수도 있다.
-
ECS task role
- 이 roles는 task에 부착 된다.
- 만약 새로운 EC2 instance를 생성한다면 새로운 ECS agent를 사용하게 될 것이며 그럴 경우 새로운 ECS task role을 만드는 것이 좋다.
- task role은 task definition에 의해 정의 된다.
- 만약 S3 버킷에 접속할 수 있는 role이라면 해당 ECS agent만 해당 버킷에 접속할 수 있게 된다.
- 이렇게 task role을 분리하면 보안을 더 강화(더 나은 보안의 분리)시킬 수 있다.
ECS Data Volumes - EFS File Systems
- ECS는 EFS File system과 통합해 사용 된다.
- 만약 EC2 instance에 여러 task를 가지고 있다면 EFS File system을 만들어서 EC2 instance 내에 있는 ECS task에 마운트 하는 것이 가능하다.
- 이는 EC2 instance 뿐만 아니라 Fargate에서도 마찬가지이다.
- 이를 통해 데이터를 공유할 수 있다.
- EFS는 여러 AZ에서 사용될 수 있기 때문에 task는 어떤 AZ에서도 launch할 수 있으며 EFS 볼륨에 있는 데이터를 모든 AZ에서 공유할 수 있게 된다.
- Fargate에서 사용할 경우 Fargate + EFS 조합을 통해 서버를 관리할 필요 없이 서버리스로 관리할 수 있다.
ECS services and tasks
ECS cluster 안에는 다양한 서비스를 만들 수 있다.
아래와 같이 service A, sersvice B를 만드는 것이 가능하며 아래는 EC2 isntance를 ECS cluster에서 사용했을 경우에 대한 예시이다.
EC2 launch type with ALB
EC2 launch type을 사용할 때 이를 load balancer와 연결할 수 있다.
- 이를 위해서는 할당된 port 없이 컨테이너를 시작하면 된다.
- 즉, EC2 instance 내에서 임의로 할당된 port를 받아 컨테이너를 시작한다.
- 이 때, ALB는 특정 port와 상호작용 하는데 ALB는 dynamic mapping을 하기 때문에 사용자를 위한 EC2 instance의 적합한 포트를 알아서 찾아 준다.
- 즉, ALB가 알아서 EC2 instance 내의 container 포트를 찾아 연결해 준다.
- 이를 위해서 EC2 instance는 ALB로부터 오는 모든 포트를 허용해야 한다.
Fargate with ALB
- task는 고유한 ENI를 가지며 서로 다른 ip 주소를 갖지만 port는 모두 동일할 것이다.
- 이 경우, ENI의 security group이 ALB의 security group을 허용하는지 확인해야 한다.
EventBridge로 ECS tasks 호출 자동화 하기
유저가 S3 버킷에 업로드 할 때마다 Fargate를 실행하고 싶다면
즉, object를 처리하고 DynamoDB로 medata를 삽입하기 위해 Fargate task를 실행해야 하는 상황이라 가정해 보자.
그러면 이는 EventBridge를 통해 자동화 할 수 있다.
EventBridge는 타겟으로 ECS task를 실행하라는 규칙을 갖게 된다.
그런데 이 때 실행된 ECS task가 DynamoDB와 S3에 접근하려면 ECS task role을 가져야 한다.