1. 글을 작성하게 된 계기
ECS를 사용해 롤링(Rolling) 배포를 하는 과정에서 겪은 이슈를 정리하기 위해 글을 작성하게 되었습니다.
기본적인 배포 전략에 대해서는 해당 포스팅을 참조해주세요.
2. 이슈
배포 과정에서 겪은 이슈는 메모리, CPU 부족, 새로운 태스크 할당 불가, ENI 할당 제한, 인스턴스 부재 입니다. 이에 대해 하나씩 살펴보겠습니다.
- 메모리, CPU 부족
- 새로운 태스크 할당 불가
- ENI 할당 제한
- 인스턴스 부재
2-1. 메모리, CPU 부족
메모리, CPU 성능 등 서버 리소스 부족 으로 발생한 이슈입니다. 이 경우, 태스크를 실행할 수 없어 배포에 실패 하게 됩니다. 서버 비용 절감을 위해 스펙이 낮은 인스턴스를 사용해 발생한 문제로, 인스턴스 스펙을 업한 후 이를 해결할 수 있었습니다.
2-2. 새로운 태스크 할당 불가
두 번째 겪은 이슈는 새로운 태스크 할당 불가 이슈입니다. 이는 배포 설정을 잘못해 발생한 문제입니다. 오토스케일링 그룹 에 다음과 같이 min_size, max_size, desired_capacity 값을 모두 2로 설정했다고 가정해 보겠습니다.
1
2
3
min_size = 2
max_size = 2
desired_capacity = 2
max_size를 조금 더 크게 설정하고 사용해야 하지만, 서버 비용 이슈로 평상시는 모든 값들을 같게 설정하고 있었습니다.
그리고 deployment_maximum_percent 값을 200으로 설정합니다. 이는 배포 중 최대 증가할 수 있는 인스턴스 를 2배까지 허용하겠다는 것인데, 현재 설정은 문제가 있습니다. 롤링 배포 시, 태스크를 최대 2배까지 증가할 수 있도록 설정했지만, 최대 확장 가능한 인스턴스 값은 제한되어 있기 때문입니다. 이렇게 되면 추가 인스턴스를 확보할 수 없어 문제가 발생하게 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
resource "aws_ecs_service" "dailyge_prod_service" {
......
// 최소 몇 % 이상의 인스턴스가 건강할 때 배포를 진행하는 지
deployment_minimum_healthy_percent = 50
// 배포 시 최대 증가할 수 있는 인스턴스 비율
deployment_maximum_percent = 200
......
}
해결책은 간단한데, 최대 확장 가능한 태스크 또는 인스턴스를 증가시키면 됩니다. 물론 이 경우도 자원이 충분하지 않은 경우 문제가 발생할 수 있습니다.
1
2
3
min_size = 2
max_size = 4
desired_capacity = 2
2-3. ENI 할당 제한
세 번째는 ENI(Elastic Network Interface)가 부족해 발생한 이슈입니다. ENI는 가상 네트워크 인터페이스 인데, 이는 AWS EC2 인스턴스 또는 기타 서비스에 연결해 네트워크 기능을 제공할 때 사용합니다. ECS를 사용하며, 특정 네트워크 모드를 설정하면 ECS 태스크는 ENI를 할당받을 수 있습니다.
ECS를 사용하면 태스크 정의(Task Definition)에
네트워크 모드(network_mode)를 지정할 수 있습니다.awsvpc를 선택하면 각 태스크에 독립된 네트워크 인터페이스(ENI)를 할당하며, 이를 통해 각 태스크는 자신만의 IP 주소, 보안 그룹, 그 외 네트워크 설정을 갖춘 독립된 서버처럼 동작합니다. 프로젝트에서 이를 선택했습니다.
ENI는 인스턴스 유형에 따라 지원할 수 있는 최대 ENI 수 와 각 ENI 당 할당할 수 있는 IP 주소의 수 가 정해져 있습니다. 이를 고려하지 않고 태스크를 할당해 이슈가 발생했던 것이죠. 처음 보는 용어가 많이 등장해서 이해하기 어려울 수 있는데, 정리하면 하면 다음과 같습니다.
- ECS를 사용하면 컨테이너의 네트워크 모드를 지정할 수 있다.
- ECS의 컨테이너는 EC2 기반으로 동작한다.
- EC2는 유형에 따라 할당할 수 있는 최대 ENI가 정해져 있다.
- EC2 스펙을 고려하지 않고, 너무 많은 태스크를 할당해, ENI 이슈가 발생했다.
해결책은 간단한데요, 인스턴스의 스펙을 올리거나, 적절한 태스크 수를 할당하면 됩니다. 이에 대해 참조한 글들이 몇 개 있는데, 이를 읽어보면 좋을 것 같습니다.
- T3 instances and max ENIs
- How do I troubleshoot issues with my Elastic IP address on my EC2 instances?
2-4. 인스턴스 부재
마지막으로 배포 전, 인스턴스가 존재하지 않아 발생한 이슈입니다. 이는 태스크를 실행해야 하는데, 컨테이너를 배포할 인스턴스가 존재하지 않아 발생한 문제입니다.
태스크를 실행하기 위한 인스턴스가 생성되면 이 문제는 자연스레 해결되기에, 간단히 해결할 수 있습니다. 해결책은 [AWS 공식문서](https://repost.aws/knowledge-center/ecs-con 나와 있고요. 테라폼으로 프로비저닝 하면서, 각 자원의 연관관계를 지정하지 않아 발생했던 그런 이슈였습니다.
If there are no container instances registered in your cluster, then add container instances to your cluster.
3. 정리
정리하고 돌아보니 재미있는데, 배포 과정에서는 꽤 고생했네요. AWS는 너무 광범위해서 어떤 설정이 존재하는지 정확히 알기 힘들고, 이를 알더라도 다른 자원들과의 연관관계를 모르면 너무 많은 시간을 허비하게 되는 것 같습니다. 자신이 사용할 자원에 대해 먼저 학습한 후, 이를 사용하면 이런 시행착오가 조금은 줄어들지 않을까 싶네요.