さくらのクラウドのエンハンスドロードバランサでセッション維持を確認する方法

ネットワーク # エンハンスドロードバランサ # ロードバランサ

こんにちは、UOZUです!

今日はエンハンスドロードバランサの「セッション維持機能」を確認してみます。

今回の検証では、セッション維持機能を有効にすると、エンハンスドロードバランサから sac-elb-session というCookieが発行されることを確認します。

そのCookieを次回以降のリクエストで送信すると、同じ実サーバーへ振り分けられるようになります。

セッション維持機能とは

セッション維持機能が無効な場合の動作

まずはエンハンスドロードバランサを作成し、「セッション維持機能」が無い状態で実サーバーを設定します。

セッション維持機能は無効な状態

また振り分けの際には、どのサーバーに振り分けがされているか分かり易いよう、サーバーの/index.htmlでサーバー名が返る様にします。

[root@uozu-lb1 ~]# echo uozu-lb1 > /var/www/html/index.html
[root@uozu-lb1 ~]# cat /var/www/html/index.html
uozu-lb1

[root@uozu-lb1 ~]# curl http://localhost/
uozu-lb1
[root@uozu-lb2 ~]# echo uozu-lb2 > /var/www/html/index.html
[root@uozu-lb2 ~]# cat /var/www/html/index.html
uozu-lb2

[root@uozu-lb2 ~]# curl http://localhost/
uozu-lb2

Least Connectionsによる振り分けを確認する

まずは「セッション維持機能」は無効化したエンハンスドロードバランサのVIPあてに、curlでアクセスを行ってみます。

$ curl http://203.0.113.130/
uozu-lb2

$ curl http://203.0.113.130/
uozu-lb2

$ curl http://203.0.113.130/
uozu-lb1

$ curl http://203.0.113.130/
uozu-lb1

何度かアクセスを行うと、各サーバに自動で切り替わることが確認できますね。

-v でも詳細を確認すると、接続先は同じIPでもlast-modifiedやetagも異なっており、別サーバーからレスポンスが返って来ていることが分かります。

$ curl -v http://203.0.113.130/
*   Trying 203.0.113.130...
* TCP_NODELAY set
* Connected to 203.0.113.130 (203.0.113.130) port 80 (#0)
> GET / HTTP/1.1
> Host: 203.0.113.130
> User-Agent: curl/7.61.1
> Accept: */*
>
< HTTP/1.1 200 OK
< date: Sun, 09 Aug 2026 08:32:58 GMT
< server: Apache/2.4.63 (AlmaLinux)
< last-modified: Sun, 09 Aug 2026 08:12:00 GMT
< etag: "9-65898cac78b13"
< accept-ranges: bytes
< content-length: 9
< content-type: text/html; charset=UTF-8
< via: 1.1 sac-elb
<
uozu-lb1
* Connection #0 to host 203.0.113.130 left intact
$ curl -v http://203.0.113.130/
*   Trying 203.0.113.130...
* TCP_NODELAY set
* Connected to 203.0.113.130 (203.0.113.130) port 80 (#0)
> GET / HTTP/1.1
> Host: 203.0.113.130
> User-Agent: curl/7.61.1
> Accept: */*
>
< HTTP/1.1 200 OK
< date: Sun, 09 Aug 2026 08:32:57 GMT
< server: Apache/2.4.63 (AlmaLinux)
< last-modified: Sun, 09 Aug 2026 08:11:54 GMT
< etag: "9-65898ca639aa2"
< accept-ranges: bytes
< content-length: 9
< content-type: text/html; charset=UTF-8
< via: 1.1 sac-elb
<
uozu-lb2
* Connection #0 to host 203.0.113.130 left intact

これはエンハンスドロードバランサの振り分けアルゴリズムとしてLeast Connections、「その時点でアクセス数が少ないサーバに対して接続する」という仕組みを取っているためです。

特定のサーバーだけにアクセスが偏り、負荷があがることを防ぐためのロードバランサの動きになります。

セッション維持機能を有効にする

ではエンハンスドロードバランサの「設定変更」から「セッション維持機能」を有効に設定してみます。

セッション維持機能は有効な状態

改めてcurlでアクセスをしてみますが・・・動きが変わらない様に見えます。

$ curl http://203.0.113.130/
uozu-lb2

$ curl http://203.0.113.130/
uozu-lb1

$ curl http://203.0.113.130/
uozu-lb2

$ curl http://203.0.113.130/
uozu-lb1

curlに-vをつけ、詳細を確認してみると、sac-elb-sessionから始まるCookieがレスポンスとして返ってくることが分かります。

$ curl -v http://203.0.113.130/
*   Trying 203.0.113.130...
* TCP_NODELAY set
* Connected to 203.0.113.130 (203.0.113.130) port 80 (#0)
> GET / HTTP/1.1
> Host: 203.0.113.130
> User-Agent: curl/7.61.1
> Accept: */*
>
< HTTP/1.1 200 OK
< date: Sun, 09 Aug 2026 08:48:11 GMT
< server: Apache/2.4.63 (AlmaLinux)
< last-modified: Sun, 09 Aug 2026 08:11:54 GMT
< etag: "9-65898ca639aa2"
< accept-ranges: bytes
< content-length: 9
< content-type: text/html; charset=UTF-8
< via: 1.1 sac-elb
< set-cookie: sac-elb-session=0199c331aa14be90; path=/
< cache-control: private
<
uozu-lb2
* Connection #0 to host 203.0.113.130 left intact

curlでCookieを保存・送信して同一サーバーへ振り分けられるか確認する

通常の curl コマンドでは、レスポンスで受け取ったCookieを次回リクエストに自動では利用しません。そのため、セッション維持機能を確認する場合は、-c でCookieを保存し、-b で保存したCookieを送信して確認します。

$ curl -c cookie.txt -v http://203.0.113.130/
*   Trying 203.0.113.130...
* TCP_NODELAY set
* Connected to 203.0.113.130 (203.0.113.130) port 80 (#0)
> GET / HTTP/1.1
> Host: 203.0.113.130
> User-Agent: curl/7.61.1
> Accept: */*
>
< HTTP/1.1 200 OK
< date: Sun, 09 Aug 2026 08:56:59 GMT
< server: Apache/2.4.63 (AlmaLinux)
< last-modified: Sun, 09 Aug 2026 08:12:00 GMT
< etag: "9-65898cac78b13"
< accept-ranges: bytes
< content-length: 9
< content-type: text/html; charset=UTF-8
< via: 1.1 sac-elb
* Added cookie sac-elb-session="1761a660f978d535" for domain 203.0.113.130, path /, expire 0
< set-cookie: sac-elb-session=1761a660f978d535; path=/
< cache-control: private
<
uozu-lb1
* Connection #0 to host 203.0.113.130 left intact
$ cat cookie.txt
# Netscape HTTP Cookie File
# https://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

203.0.113.130  FALSE   /       FALSE   0       sac-elb-session 1761a660f978d535
$ curl -b cookie.txt -v http://203.0.113.130/
*   Trying 203.0.113.130...
* TCP_NODELAY set
* Connected to 203.0.113.130 (203.0.113.130) port 80 (#0)
> GET / HTTP/1.1
> Host: 203.0.113.130
> User-Agent: curl/7.61.1
> Accept: */*
> Cookie: sac-elb-session=1761a660f978d535
>
< HTTP/1.1 200 OK
< date: Sun, 09 Aug 2026 08:57:56 GMT
< server: Apache/2.4.63 (AlmaLinux)
< last-modified: Sun, 09 Aug 2026 08:12:00 GMT
< etag: "9-65898cac78b13"
< accept-ranges: bytes
< content-length: 9
< content-type: text/html; charset=UTF-8
< via: 1.1 sac-elb
<
uozu-lb1
* Connection #0 to host 203.0.113.130 left intact
$ curl -b cookie.txt  http://203.0.113.130/
uozu-lb1
$ curl -b cookie.txt  http://203.0.113.130/
uozu-lb1
$ curl -b cookie.txt  http://203.0.113.130/
uozu-lb1
$ curl -b cookie.txt  http://203.0.113.130/
uozu-lb1
$ curl -b cookie.txt  http://203.0.113.130/
uozu-lb1

保存したCookieをリクエストに含めると、その後は同一サーバーへアクセスが流れることが分かります。

状態確認方法結果
セッション維持 無効通常の curluozu-lb1 / uozu-lb2 に振り分けられる
セッション維持 有効通常の curlCookieを保持しないため、動きが変わらないように見える
セッション維持 有効curl -c でCookie保存sac-elb-session Cookieが保存される
セッション維持 有効curl -b でCookie送信同一サーバーへ振り分けられる

さいごに

今回は、さくらのクラウドのエンハンスドロードバランサで、セッション維持機能の動作を確認しました。

セッション維持機能を無効にしている場合は、ロードバランサの振り分けアルゴリズムに従って、複数の実サーバーへリクエストが振り分けられます。一方で、セッション維持機能を有効にすると、sac-elb-session というCookieが返され、そのCookieをリクエストに含めることで同じ実サーバーへアクセスが流れることを確認できました。

ブラウザではCookieが自動的に保存・送信されますが、curl で確認する場合は -c-b オプションを使う必要があります。セッション維持機能を検証する際は、Cookieの有無もあわせて確認すると分かりやすいです。

ログイン状態を持つWebアプリケーションや、同一ユーザーのリクエストを同じサーバーへ寄せたい場合は、エンハンスドロードバランサのセッション維持機能を活用してみてはいかがでしょうか。

最後までお読みいただき、ありがとうございます!

この記事を書いた人

UOZU

ネットアシスト運用チーム10年目の運用エンジニア

さくらのクラウド検定 ベーシック

さくらのクラウド検定 アドバンスド

AWS Certified Solutions Architect - Associate