1. はじめに
IBM CloudのVPC Load Balancerでは長らくSource IPベースのセッションパーシスタンス機能しか提供されていませんでしたが、新規にCookieベースのセッションパーシスタンス機能も提供されるようになったので試してみました。
https://cloud.ibm.com/docs/vpc?topic=vpc-release-notes#june-17-2021&locale=en
Cookieベースのセッションパーシスタンス機能には2つあり、
-
HTTP cookie
persistence: VPC Load BalancerがIBMVPCALB
というprefixを付けてCookie情報を挿入する方法 -
APP cookie
(Application cookie) persistence: VPC Load Balancerが設定するIBMVPCALB
に加えて、利用者がWebサーバーなどで発行するCookie情報を元にセッションパーシスタンスを実現する方法。
の2つ存在します。以下ではその2つのセッションパーシスタンス機能を試してみました。
2. HTTP cookie persistence
Back-end poolのプール設定にて、Session stickinessとしてHTTP cookie
を選択します。
HTTP利用時
# curl -I http://<VLB-LBのFQDN>
HTTP/1.1 200 OK
Date: Fri, 18 Jun 2021 03:04:48 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Last-Modified: Fri, 18 Jun 2021 02:09:34 GMT
ETag: "11-5c500d09e56d8"
Accept-Ranges: bytes
Content-Length: 17
Content-Type: text/html; charset=UTF-8
Set-Cookie: IBMVPCALB_r022-8aaa4e0f-ad99-4d20-b17d-5aa75cd10da7=554e919fd77f334266c7b48f03cec0165a59a8fa; path=/
Cache-control: private
HTTPSの際には、Secure; SameSite=None
が追加属性として設定されます。
HTTPS利用時。
# curl -I https://<VLB-LBのFQDN>
Date: Fri, 18 Jun 2021 03:05:00 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Last-Modified: Fri, 18 Jun 2021 02:09:34 GMT
ETag: "11-5c500d09e56d8"
Accept-Ranges: bytes
Content-Length: 17
Content-Type: text/html; charset=UTF-8
Set-Cookie: IBMVPCALB_r022-901d2e7d-531d-49c3-8b5c-f2acfa2ec7f3=c3fa5c11aa1931948a4530cb2b94d0aba050fcc6; path=/; Secure; SameSite=None
Cache-control: private
連続アクセス(Cookieのセットなし。セッションパーシスタンスが効いていない。)
# while true; do curl https://<VLB-LBのFQDN>; sleep 1; done
Server2
Server1
Server2
Server1
Server2
Server2
Server1
Server1
Server2
Server2
Server1
Server1
Server2
連続アクセス(Cookieのセットあり。セッションパーシスタンスが効いている)
# while true; do curl -H "Cookie: IBMVPCALB_r022-901d2e7d-531d-49c3-8b5c-f2acfa2ec7f3=c3fa5c11aa1931948a4530cb2b94d0aba050fcc6;" https://<VLB-LBのFQDN> ; sleep 1; done
Server2
Server2
Server2
Server2
Server2
Server2
Server2
Server2
Server2
Server2
3. Application cookie persistence
IBM Cloud docsによると、Application cookie persistenceの特徴は以下の通り。
- Back Endサーバー(Webサーバー)側でCookieを発行する必要があり、そのCookie名をVPC Load Balancerに設定することで利用可能となる(今回はCookie名として
TEST1
を設定してみました)。 - VPC Load Balancerは、依然として
IBMVPCALB
というprefixを持つCookieを発行する。よって、ClientはVPC Load Balancerから発行されたIBMVPCALB
というprefixを持つCookieと、Back Endサーバー(Webサーバー)で発行されたCookieの2つを受け取る。 - Clientはこの2つのCookieをVPC LoadBalancerに送ることで、セッションパーシスタンスが有効になる。逆に、どちらか一方を送付しただけではセッションパーシスタンスは機能しない。
IBMVPCALB
に対するCookieは利用者は制御できないが、Back Endサーバー(Webサーバー)で発行されたCookieについては名前や有効期間を制御できるので、いつまでセッションパーシスタンスを持続させるかなどを操作可能となる。
Back-end poolのプール設定にて、Session stickinessとしてAPP cookie
を選択します。
バックエンドサーバーでは実はCookieを発行していないのだが、それでもVPCLoadBalancerはIBMVPCALBというprefixを持つCookieをクライアントに送ってくる。
# curl -I https://<VLB-LBのFQDN>
HTTP/1.1 200 OK
Date: Fri, 18 Jun 2021 05:46:44 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Last-Modified: Fri, 18 Jun 2021 05:29:53 GMT
ETag: "8-5c5039d058e10"
Accept-Ranges: bytes
Content-Length: 8
Content-Type: text/html; charset=UTF-8
Set-Cookie: IBMVPCALB_r022-901d2e7d-531d-49c3-8b5c-f2acfa2ec7f3=5b02d1a9bbeec0e313f1e2189550a526d6d9e7f3; path=/; Secure; SameSite=None
Cache-control: private
連続アクセス(IBMVPCALBに対するCookieは設定されているが、TEST1に対しては設定がないため、セッションパーシスタンスが効かない)
# while true; do curl -k -H "Cookie: IBMVPCALB_r022-901d2e7d-531d-49c3-8b5c-f2acfa2ec7f3=5b02d1a9bbeec0e313f1e2189550a526d6d9e7f3;" https://<VLB-LBのFQDN>; sleep 1; done
Server2
Server1
Server1
Server2
Server2
Server1
Server2
Server1
Server2
Server1
Server2
Server1
Server1
連続アクセス(IBMVPCALBおよびTEST1に対するCookieが設定されているため、セッションパーシスタンスが有効)
# while true; do curl -k -H "Cookie: IBMVPCALB_r022-901d2e7d-531d-49c3-8b5c-f2acfa2ec7f3=5b02d1a9bbeec0e313f1e2189550a526d6d9e7f3; TEST1=hogemoge" https://<VLB-LBのFQDN>; sleep 1; done
Server1
Server1
Server1
Server1
Server1
Server1
Server1
Server1
Server1
Server1