固定IPでALBのStickySessionを実現する

固定IPかつStickySessionなロードバランサーの構成を考える機会がありました。ALB,NLB単体では固定IPかつStickySessionに対応した構成ができず、これを解決するため、Global Acceleratorを使用する構成を考えたのでご紹介いたします。
2019.05.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

固定IPかつStickySessionなロードバランサーの構成を考える機会があったので、ご紹介いたします。

はじめに

ALBにはクライアントとバインド先を固定するStickySessionという機能があります。
HTTPレスポンスにELBでCookieを埋め込んで、 そのクッキーを基にバインド先のインスタンスを固定するというものです。

詳しくは弊社ブログで解説しています。こちらをご参照ください。

ELBのスティッキーセッションについて調べてみた | DevelopersIO

一方、ALBは動的IPであり、同じIPであることが保証されません。
環境の制約上どうしても固定IPを使用したい場合、NLBを使用するという選択肢がでてきます。

[新機能]静的なIPを持つロードバランサーNetwork Load Balancer(NLB)が発表されました! | DevelopersIO

一方、NLBはL4のロードバランサーであり、StickySessionに対応していません。

ALB,NLB単体では固定IPかつStickySessionに対応した構成ができず、これを解決するため、Global Acceleratorを使用する構成を考えたのでご紹介いたします。

Global Acceleratorとは?

Global Acceleratorは、静的IPアドレスを持つグローバルなロードバランサーです。

弊社ブログでGlobal Acceleratorを使ったALBの固定IP化の方法を紹介しています。詳しくはこちらを御覧ください。

Global Acceleratorを使ってALBを固定IP化する #reinvent | DevelopersIO

AWS構成図

こういった構成の環境を作ります。

ALB + EC2の構築

あらかじめ、ALB + EC2の環境を構築しました。
バランスされていることがわかりやすいように、EC2が存在しているAvailabilityZoneとインスタンスIDを表示するようにしています。

Global Acceleratorの作成

弊社ブログを参考にささっとGlobal Acceleratorも構築してしまいます。

固定IPでブラウザからアクセスしてみる

ブラウザから固定IPでアクセスしてみると、問題なくアクセスできました。

StickySession OFF

まずデフォルトのStickySessionがOFFの状態でCookie、動作を確認します。

EC2のターゲットグループの設定を表示します。
属性の維持設定を確認します。
「無効」となっていれば、StickySessionがOFFの状態です。

この状態で確認すると、特にCookieは使用されていません。

何回かアクセスすると、異なるインスタンスに接続されてバランシングされていることがわかります。

StickySession ON

次にStickySessionを有効にします。

EC2のターゲットグループの設定を表示します。 属性の編集をします。

維持設定の「有効化」にチェックをいれます。今回は維持設定の時間を60秒にします。

設定が反映されます。

それでは確認しましょう。

AWSALBのCookieを使用していることがわかります。
curlコマンドを使ってもっと細かく見ていきます。

$ GlobalIP=13.XX.XX.XX

$ date; curl -c cookie.txt http://$GlobalIP/; cat cookie.txt 
2019年 5月30日 木曜日 14時24分36秒 JST
<!DOCTYPE html>
<title>AZ: us-west-2b</title>
<h1>AZ: us-west-2b</h1>
<p>ID: i-0213xxxxxxxxxxxxx</p>
# Netscape HTTP Cookie File
# https://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

13.XX.XX.XX   FALSE   /       FALSE   1559798676      AWSALB  dsCcvmmn9gr+VVn1Imr6/vIgHzgvdvzcmSXgOSrS2MzEOkJdYqWu4433CnwgwMoTq2NGCo0dtW0ESfVFO8upv1L8ranU2IE8IaG1BKPDhOFvXSufzvkENOEo+6I3

$ date;curl -b cookie.txt http://$GlobalIP/
2019年 5月30日 木曜日 14時24分43秒 JST
<!DOCTYPE html>
<title>AZ: us-west-2b</title>
<h1>AZ: us-west-2b</h1>
<p>ID: i-0213xxxxxxxxxxxxx</p>

$ date;curl -b cookie.txt http://$GlobalIP/
2019年 5月30日 木曜日 14時25分02秒 JST
<!DOCTYPE html>
<title>AZ: us-west-2b</title>
<h1>AZ: us-west-2b</h1>
<p>ID: i-0213xxxxxxxxxxxxx</p>

$ date;curl -b cookie.txt http://$GlobalIP/
2019年 5月30日 木曜日 14時25分29秒 JST
<!DOCTYPE html>
<title>AZ: us-west-2b</title>
<h1>AZ: us-west-2b</h1>
<p>ID: i-0213xxxxxxxxxxxxx</p>

$ date;curl -b cookie.txt http://$GlobalIP/
2019年 5月30日 木曜日 14時25分35秒 JST
<!DOCTYPE html>
<title>AZ: us-west-2b</title>
<h1>AZ: us-west-2b</h1>
<p>ID: i-0213xxxxxxxxxxxxx</p>

$ date;curl -b cookie.txt http://$GlobalIP/
2019年 5月30日 木曜日 14時25分37秒 JST
<!DOCTYPE html>
<title>AZ: us-west-2a</title>
<h1>AZ: us-west-2a</h1>
<p>ID: i-0813xxxxxxxxxxxxx</p>

cookie取得後、最初の一分間は同じインスタンスにアクセスしていることが確認できました。

更に1分間の有効期限が切れた後は別のインスタンスへアクセスされることが確認できました。

気になること

先程ご紹介した弊社ブログでも言及されていますが、 ALB側に出力するアクセスログのIPが変わってしまうようなので、アクセスログ解析などを行いたい場合に注意が必要そうです。
また、料金もそれなりにかかるので固定IPのためだけにGlobal Acceleratorを採用するかは予算にあわせて検討が必要そうです。

料金 - AWS Global Accelerator | AWS

また、StickySessionを採用しているため、Global Acceleratorで複数リージョンにまたがって複数のALBにバランシングするといったことはできません。
その際には、StickySessionを諦めてセッション情報の共有を検討する必要があります。

おわりに

AWSのロードバランサーサービスは、CLB,ALB,NLBに加え、Global Acceleratorというサービスも出てきて様々な構成が取れるようになりました。

今後も状況にあわせて最適な構成を考えられるように、キャッチアップしていきたいと思います。