이번 포스팅에서는 ALB 의 Stickiness 기능에 대해서 살펴 보도록 하겠습니다. NLB 와 마찬가지로 ALB 의 Stickiness 는 동일한 Client 가 동일한 서버에 접속할 수 있도록 하는 기능입니다. 하지만 ALB 는 NLB 와는 다른 방식으로 Sticky 기능을 구현합니다. NLB 의 경우에는 Sticky 를 Source IP 를 기반으로 사용하였던 것에 반해 ALB 는 Cookie 정보를 기반으로하여 Sticky 기능을 제공합니다.
ALB 에서 사용할 수 있는 Cookie 기반 Stickiness 는 두 가지 옵션을 사용할 수 있는데요. 첫번째는, ALB 가 스스로 생성한 Cookie 를 이용하여 Sticky 를 구성하는 것이고 두 번째 방법은 Application 에서 지정한 Cookie 의 값을 참고하여 Sticky 를 구성하도록 하는 방법입니다.
각각의 Sticky 옵션을 사용하여 어떻게 동작하는지 확인하기에 앞서 간단하게 테스트 환경을 구성하도록 하겠습니다.
웹서버는 아래와 같이 가용 영역별로 2대씩 총 4대의 웹서버를 준비하였습니다.
그리고 ALB 를 등록하였으며 ALB 의 이름과 서비스 포트(80)을 제외한 모든 설정은 기본 설정값으로 둔 후 사이트 접속 테스트를 수행하였습니다.
테스트용 웹 사이트는 아래와 같이 구성되었으며 ALB DNS Name 으로 접근을 하게 되면 Client IP, Server 정보, App 에서 생성한 Cookie 의 값, EC2 Instance ID, Availability Zone Code 와 같은 정보를 출력하도록 준비하였습니다.
참고로, Cookie Value: 의 값은 최초 접속 시에는 사용자 요청에 Cookie 가 존재하지 않기 때문에 아무런 값도 나타나지 재접속 시에는 아래와 같이 App 에서 발행한 Cookie 의 값이 요청에 함께 전달되어 화면에 표시되게 됩니다.
- Load Balancer Cookie Stickiness
첫번째로 테스트를 진행할 Stickiness 는 ALB 에서 생성한 Cookie 를 사용한 Stickiness 입니다.
Stickiness 사용을 위해 아래와 같이 Load Balancer generated Cookie 값을 선택하였습니다.
설정이 완료되면 아래와 같이 속성 화면에서 Stickiness Type 의 값이 lb_cookie 로 표시되는 것을 확인할 수 있습니다.
이렇게 구성된 상태에서 ALB 의 DNS Name 으로 접속한 후 Client 가 수신한 Cookie 값을 확인해보도록 하겠습니다.
먼저 curl 명령을 이용해서 사용자의 요청에 대해 응답으로 수신된 Cookie 를 albcookie 파일로 저장하도록 합니다.
albcookie 파일에 저장된 Cookie 의 값을 확인합니다. 웹서버에서 발행한 Cookie 이외에 ALB 에서 발행한 AWSALB, AWSALBCORS Cookie 가 기록된 것을 확인할 수 있습니다.
ALB 는 Cookie 기반의 Stickiness 를 제공하므로 albcookie 파일에 저장된 Cookie 정보를 HTTP Request 에 함께 전송하여 다수의 요청에 대해 Stickiness 가 제공되는지 확인합니다.
위 그림에 보이는 것처럼 최초 Cookie 를 수집할 때 접속되었던 Server1 로 모든 요청이 전달된 것을 확인할 수 있습니다.
2. Application based Cookie
이번에는 웹서버에서 발행한 Cookie 를 사용하는 Stickiness 를 테스트해보도록 하겠습니다.
기본값처럼 Stickiness 를 비활성화한 후 Round Robin 으로 동작하는 것을 확인하도록 하겠습니다.
아래 그림과 같이 Stickiness 에 사용되었던 albcookie 파일을 그대로 사용하였지만 이번에는 Sticky 가 보장되지 않고 부하가 분산되는 것을 확인할 수 있습니다.
그럼 이번에는 Application Based Cookie 설정을 해보도록 하겠습니다. Application Based Cookie 를 사용하기 위해서는 ALB 의 설정도 변경해야 하지만 웹서버에서 생성하는 Cookie 의 정보도 파악하여야 합니다. 제 테스트 환경에서는 “appcookie” 라는 이름의 Cookie 를 웹서버에서 생성하도록 하였고 Cookie 의 값은 “Instance ID” 값이 자동으로 선택되도록 구성하였습니다.
따라서, ALB 에서는 아래와 같이 Stickiness 옵션 값을 선택해 주어야 합니다.
설정이 정상적으로 반영되었다면 아래 그림과 같이 Stickiness Type 은 “app_cookie” 로 변경되었고 App Cookie Name 에 위에서 설정한 “appcookie” 가 적용된 것을 확인할 수 있습니다.
그럼 이제 curl 명령을 이용하여 접속테스트를 수행해보도록 하겠습니다.
최초 접속 시에 아래와 같이 웹서버에는 수신한 Cookie 의 값이 없는 것을 확인할 수 있습니다.
그리고 저장된 appcookie 파일에는 아래와 같이 Load Balancer Cookie 테스트와 다르게 AWSALBAPP- 으로 시작하는 Cookie 가 포함된 것을 확인할 수 있습니다. “appcookie” 는 웹서버에서 발행한 Cookie 로 Instance ID 를 값으로 가지고 있습니다.
Cookie 가 수신된 것을 확인하였으니 수신된 Cookie 를 이용하여 다수의 요청을 전송한 뒤 부하 분산이 이뤄지는지 확인해보도록 하겠습니다.
위 그림과 같이 관리자가 Application Based Cookie 에 설정한 Cookie 의 이름과 실제 웹서버에서 사용하는 Cookie 의 값이 동일하다면 이 Cookie 를 기반으로 해서 Stickiness 가 유지되는 것을 확인할 수 있습니다.
참고. AWS Management Console 에서 Load Balancer Cookie 를 설정할 때 제공되는 옵션을 보면 Load Balancer Cookie 의 만료 시간을 조정할 수 있는 것처럼 보이지만 실제로는 AWSALB Cookie 의 값은 7일로 고정이며 수정할 수 없습니다.
ALB 에서 제공하는 Cookie 기반 Stickiness 는 하나의 세션에 대해 동일한 서버로 부하가 분산되어야하는 경우에 유용하게 사용할 수 있는 기능입니다. 위 테스트에서 볼 수 있는 것처럼 ALB 에서는 Load Balancer 기반과 Application 기반 Cookie Stickiness 를 모두 지원하고 있으니 상황에 따라 필요한 옵션을 이용하시면 될 것 같습니다.
ALB 에서 제공하는 Stickiness 와 관련한 좀 더 자세한 사항은 아래의 AWS 공식 문서를 참고하시기 바랍니다.
감사합니다.