LiJell's 성장기

AWS ECS Managed Termination Protection 옵션 사용시 주의할 점 본문

Cloud

AWS ECS Managed Termination Protection 옵션 사용시 주의할 점

All_is_LiJell 2024. 3. 13. 13:25
반응형

현재 AWS ECS와 EC2 Spot Instance 조합을 이용중이고, ECS managed instance draining기능 활성화로 spot capacity rebalancing상황을 컨트롤하고 있었습니다.

따라서, 의도치 않은 rebalancing과 같은 ASG의 활동으로 EC2 인스턴스의 종료를 방지하기 위한 목적으로 ECS에서 Managed Termination Protection 옵션을 활성화 시켰는데요, instance scale-in-protection에 문제가 발생하여 이 글을 작성하게 됐습니다.

개요

Managed Termination Protection을 사용하면 AWS ECS는 실행 중인 task가 없는 EC2 instance만 종료합니다. 하지만, 배포가 실행되어 새로운 container instance에 task가 배포 완료됐고 desired capacity가 "1"인데도 기존에 떠있던 instance가 terminated되지 않았습니다. 확인해보니 instance scale-in-protection으로 기존 instance가 draining으로 빠지지 않는 상황이였습니다.

따라서, ASG의 instance scale-in-protection 옵션을 비활성화 했지만, ASG에서 보이는 모든 instance가 scale-in-protection 상태로 지속되는 문제를 해결 할 수 없었습니다. Manual로 instance에 직접 scale-in-protection을 비활성화 해야 terminate되는 모습을 확인 할 수 있었습니다.

추적

1차로 아래 커맨드로 확인 결과

aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names [asg 이름]

scale in protection이 비활성화 된 것으로 보였습니다.

하지만, 2차로 Cloud Trail 확인 결과, scale-in protection이 런칭 직후 ecs-instance-capacity-provider-provisioning에 의해 SetInstanceProtection이 개별적으로 수행된 정황을 찾을 수 있었습니다 (scale in protection 옵션은 instance가 새로 기동 될 때 적용됩니다).

"아.. 왜지 ;;;" 굉장히 난감했습니다.

개별적으로 scale in protection이 활성화 됐어도 모든 컨테이너 인스턴스가 managed termination protection(관리형 종료 보호)을 사용하는 경우, ECS는 비어 있는 컨테이너 인스턴스에 대한 scale-in protection을 제거 후 ASG가 EC2 인스턴스를 종료할 수 있다 생각했거든요...

원인

결과적으로, ASG의 instance scale-in-protection 옵션을 비활성화한게 원인이였습니다.

scale-in-proection이 비활성화 되지 않는다고 생각했던 이유는 CloudWatch 경보가 scale-in action을 발동하기 전에 CapacityProviderReservation 메트릭의 타겟 용량이 목표 용량보다 낮은 상태를 15분 동안(데이터 포인트 15개) 지속해야 하기 때문이었습니다.

이 부분을 생각하지 못하고 바로 scale in protection이 풀리지 않아 instance scale-in-protection 옵션을 비활성화 하면서 꼬여버린거죠.

Managed Termination Protection의 docs를 보면 아래와 같은 설명이 있습니다.

You must turn on Auto Scaling instance scale-in protection on the Auto Scaling group to use managed termination protection. If you don't turn on scale-in protection, then turning on managed termination protection can lead to undesirable behavior.

출처: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/managed-termination-protection.html

해결 방법

따라서 ASG의 instance scale-in-protection 옵션을 다시 활성화 했고, scale in protection 옵션은 instance가 새로 기동 될 때 적용되기 때문에 scale-in-protection 옵션이 적용된 이후에 기동된 instance로 모두 대체하였고, 정상적으로 15분이 지난 후 scale in protection이 제거되면서 instance가 정상적으로 terminated 되는 것을 확인할 수 있었습니다.

결과적으로, 전체적인 flow를 생각하지 못했던 저의 실수였습니다. 다른 분들도 조심하세요!

긴 글 읽어주셔서 감사합니다.

반응형
Comments