AWS ALB 의 Idle timeout 에 관하여

Namhoon Kim
3 min readSep 2, 2020

ALB 옵션 중에는 idle timeout[1] 값이 있습니다. ALB 는 등록된 target EC2 에 대해 connection 을 맺어 놓고 HTTP 통신을 하게 되는데, client 에서 아무런 데이터를 보내지 않을 경우 idle timeout 이 지난 후 connection 을 close 합니다.

AWS document 혹은 console 설명을 읽어보면 그리 이해하기 어려운 내용은 아닙니다. 몇 가지 설정을 가정해 놓고 다시 한번 정확히 이해해 봅시다.

ALB 의 idle timeout 이 60s 로 설정되어 있고, api 에 대해 등록된 EC2 의 서버(nginx 등) 응답이 100s 걸린다고 가정합니다. 이 때 client 가 api 요청을 보낸 경우에는 무슨 일이 일어날까요?

클라이언트에서 데이터를 보낸 이후 100s 동안 ELB 는 EC2 로 부터 아무런 응답을 받지 못합니다. 응답에 100s 가 걸리기 때문이죠. idle timeout 은 60s 로 설정 되었기 때문에 60s 후 ALB 는 client 에게 504 timeout response 를 전달하게 됩니다.

상황을 바꿔서 다시 한번 살펴 보겠습니다. ALB 의 idle timeout 은 그대로 60s 인데 EC2 에 설정된 timeout 값이 30s 이며, api 응답에 100s 가 걸린다고 가정합니다. 이 경우에는 무슨 일이 일어날까요?

클라이언트가 api 요청을 보냈을때 30s 후에는 EC2 서버로 부터 504 timeout 응답을 받게 됩니다. 그 후에 클라이언트가 다시 요청을 보낼 경우 ALB 는 idle timeout 까지 connection 을 close 하지 않으므로 사용할 수 없는 connection 으로 다시 요청을 보내게 되어 EC2 는 해당 응답을 처리 하지 않게 되고, idle timeout 인 60s 후 ALB 는 504 timeout 응답값을 주게 됩니다.

위 시나리오 예시를 통해 idle timeout 설정을 좀 더 잘 이해하게 되셨을 겁니다. 그렇다면 어떻게 설정하는게 가장 좋은 방법일까요?

AWS 가이드[1] 에서는 EC2 서버의 timeout 값을 ALB idle timeout 보다 크게 잡도록 권장합니다. 추가로 keep-alive 옵션을 사용해서 ALB 와 EC2 의 connection 이 끊어지지 않도록 설정하라고 말합니다.

아래 블로그 내용도 읽어보시면 좋을 것 같습니다.
- https://dzone.com/articles/aws-elastic-beanstalk-timeouts-a-detective-story
- https://sigopt.com/blog/the-case-of-the-mysterious-aws-elb-504-errors/

(혹시 틀린 내용이 있다면 댓글로 알려주세요!)

Appendix
[1] https://docs.aws.amazon.com/elasticloadbalancing/latest/application/application-load-balancers.html#connection-idle-timeout

--

--