안녕하세요.
오늘은 Amazon ECS의 Graceful Shutdown에 대해서 공부하려고 합니다.
- 다음 AWS 블로그 글을 참고했으니 내용이 부족하다고 느껴지신다면 원문을 참고해보세요!
- https://aws.amazon.com/ko/blogs/containers/graceful-shutdowns-with-ecs/
Graceful Shutdown이란
Graceful Shutdown을 번역하면 "정상적인 종료"입니다.
처음 Graceful Shutdown이라는 용어를 접했을 때는 "프로그램이 정상적으로 종료되지 비정상적으로 종료되겠어?"라고 생각했습니다.
하지만 제가 자주 사용하던 Ctrl + C 혹은 작업관리자를 이용한 강제 종료 등이 모두 프로그램을 비정상적으로 종료시키는 방법이었습니다. 아주 흔하게 접할 수 있는 경우인 것이죠;;;
프로그램이 이러한 비정상 종료를 제대로 처리하지 못하면 어떻게 될까요?
힘겹게 깬 스테이지, 밤샘 작업한 리포트가 날아가는 아주 슬픈 일이 발생하게 됩니다 ㅜㅠ
ECS랑 Graceful Shutdown은 무슨 상관이죠?
ECS와 Graceful Shutdown의 관계를 짚고 넘어가기 전에 ECS에서 실행되는 컨테이너들의 생명 주기를 아주 간단하게 알아보도록 하겠습니다.
- ECS에서 작업을 실행시키면 ECS agent가 작업을 컨테이너들을 실행하기 위해 ENI 연결과 같은 필요한 사전 작업을 수행합니다.
- 사전 작업이 완료되면 작업 정의에 명시된 컨테이너들을 실행합니다.
- 작업 중지 명령을 받으면 작업의 내부 컨테이너들로 SIGTERM 시그널이 전달됩니다.
- 작업의 내부 컨테이너들이 종료되면 작업의 메인 프로세스가 종료됩니다.
- 만약 내부 컨테이너가 종료되지 않는다면 일정 시간(ECS_CONTAINER_STOP_TIMEOUT, 최대 120초) 후에 작업의 내부 컨테이너들로 SIGKILL을 보냅니다.
- 작업이 종료됩니다.
참고: https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/task-lifecycle.html
작업을 중지할 때, SIGTERM 혹은 SIGKILL 시그널을 보내는 것이 바로 비정상종료인 것입니다.
만약 SIGTERM 시그널을 처리하지 않으면 어떻게 될까요? 사용자에게 4xx 혹은 5xx 에러가 반환될 수 있습니다!
그리고 수행 중인 트랜잭션이 정상적으로 완료되지 않아서 사용자의 경험을 해칠 수 있죠 ㅜ
좋은 사용자 경험을 제공하기 위해서는 SIGTERM 시그널을 적절히 처리해줘야 합니다.
SIGTERM 시그널 처리 방법
AWS 블로그에서는 컨테이너가 SIGTERM 시그널을 받으면 1) 현재 수행 중인 요청을 마무리시키고, 2) 새로운 요청을 더 이상 처리하지 않아야 한다고 알려줍니다.
대체로 1)을 만족시키기는 쉬울 것 같고(수행 중인 요청들 그대로 실행하면 되기 때문에), 2) 때문에 골머리를 썩게 될 것 같습니다.
서비스 간 통신을 어떻게 구성했는지에 따라 다르겠지만 서비스가 ALB를 사용하도록 설정되어 있다면 고민하실 필요 없습니다.
작업으로 SIGTERM 시그널을 보내기 전에 이미 ALB의 대상 그룹에서 해당 작업이 해제되기 때문이죠!
만약 서비스에서 ALB를 사용하고 있지 않다면 어떻게 할 수 있을까요?
저는 Amazon ECS에서 무중단 배포 이뤄내기 과 같이 구현했는데 더 좋은 방법이 있다면 같이 공부해봐요!
그리고 SIGTERM 시그널을 처리하는 예제 코드를 보여드리려고 했는데 aws 블로그 글에 이미 친절하게 준비되어 있더라고요! 한번 aws 블로그 글 보시는 것도 추천드립니다 ㅎㅎ
Amazon ECS의 Graceful Shutdown은 어떠셨나요?
저는 이번에 ECS의 Graceful Shutdown을 공부하면서 ECS에 대해서 보다 많은 이해를 할 수 있어서 만족스러웠습니다.
어쩌다보니 ECS와 Kubernetes를 같이 사용하고 있는데 둘이 매우 흡사해서 이해하기가 훨씬 수월한 것 같더라고요.
꿀팁 아닌 꿀팁!
- 사실 둘다 제대로 이해하지 않고 막 사용하다가 발생한 문제 해결하려고 엎치닥 뒤치닥 하고 있습니다 ㅜ
'aws' 카테고리의 다른 글
AWS 고정 IP 할당 방법 - egress 네트워크 트래픽편(EIP, NAT Gateway) (4) | 2023.08.24 |
---|---|
Amazon ECS에서 무중단 배포 이뤄내기 - 제발 장기 실행 태스크(long running tasks)는 만들지 마세요... (0) | 2023.07.09 |
AWS 고정 IP 할당 방법 - ingress 네트워크 트래픽편(EIP, NLB, ALB[Global Accelerator]) (2) | 2023.05.28 |
Amazon Dynamodb global secondary index - 기간별 검색 최적화 (0) | 2022.10.22 |
AWS RDS 기본적인 보안 설정 - 혹시 퍼블릭 액세스를 허용하신 건 아니겠죠...? (0) | 2022.10.09 |