Microsoft Edge で AWS の ALB（ELB）にアクセスしたときにスティッキーセッションが効かない？

わたしが見つけたわけでも直接解決したわけでもないのですが、身近で表題のトラブルが発生したので、こちらに残しておきます。

※2021/03/18 現在の情報です。今後、Edge や ALB の動作が変更される可能性があります。

# Microsoft Edge のバージョン

これを書いている時点で最新の 89.0.774.54（64 ビット）で確認しています。
![01_edge_version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/20af32d4-2215-e0d2-24b5-8608a97ae603.png)

# ALB 側の設定

ターゲットグループでスティッキーセッションを有効にし、Stickiness type を「lb_cookie」にしている場合に、この事象が発生します。この設定では ALB が「AWSALB」という Cookie を発行して、それをセッションキーにしてアクセスをターゲットサーバに振り分けます。

なお、ここでは Stickiness duration を 1 日にしています。
![02_alb_targetgroup_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/93637185-4b8e-364b-2d08-eea1f71ea55f.png)
![03_alb_targetgroup_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/fe1622f8-010e-af15-df33-d7a4fd20ac94.png)

# 障害が発生する条件

 - **Cookie「AWSALB」の値が複数ある**状態で ALB にリクエストが行われる
   - 例えば、Domain 属性が無指定（＝発行 FQDN のみ有効な Cookie）のものと、Domain 属性が指定されているものが混在している状態
   - （ALB は、そｎ仕様上 Cookie「AWSALB」を Domain 属性無指定で発行するが）何らかの事情で **Domain 属性が指定された「AWSALB」が誤って発行（保存）されてしまった**、など
 - 複数値のうちの**いずれかがすでに有効期限がきれたセッションキーか、セッションキーとして無意味な値**である

つまり、Edge 以外のブラウザでも発生する可能性があるトラブルですが、実は **Edge で以下のような操作を行うことにより、この状態になる**ことがわかっています。

 - IE11 で対象の ALB に接続
 - その後、Edge で IE11 の Cookie をインポート
   - **Edge で IE11 の Cookie をインポートする際、Domain 属性無指定の Cookie が Domain 属性＝発行元の FQDN に変換されて保存されてしまう**←ここが問題

※わたしが再現テストで確認した範囲では、「AWSALB」の値（セッションキー）が複数あっても、いずれも有効期限内かつ同じターゲットサーバに振り分けられる状態で保存されたものであれば、継続して同じターゲットサーバに振り分けられていました。

# 再現テスト

## ALB とターゲットグループ・ターゲットサーバを設定・配置

まず、前掲のようなターゲットグループを持つ ALB を用意し、ターゲットグループに 2 台以上の Web サーバを登録します。

※今回は 2 台のサーバを登録し、それぞれ「Server 1」「Server 2」というレスポンスが返るように設定しました。

## Edge で初回アクセス

Cookie「AWSALB」（および「AWSALBCORS」）が発行されるのが確認できました。
![04_edge_access_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/57bfd3f1-0531-e2bd-9916-f269fec9c6d2.png)

## IE11 でアクセス

ここで一旦、ALB のターゲットグループの Stickiness duration を 1 秒に縮めます。これは、振り分けの有効期限が切れた Cookie「AWSALB」を IE11 で生成するためです。

IE11 でサイトにアクセスします。
![05_ie_access.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/d5a014ff-9c65-6826-cb41-30cee6fef200.png)

アクセス後、ALB のターゲットグループの Stickiness duration を 1 日に戻します。

## Edge で IE11 の Cookie をインポート

設定メニューから Cookie をインポートします。
![06_edge_cookie_import_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/0ddb21ef-ae3a-46e9-d82c-a63aaa03fca0.png)

対象のドメインを見ると、「AWSALB」が複数になっており、
![07_edge_cookie_import_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/1e58ceb2-e295-98a8-c354-db928200f117.png)


 - 一方が IE11 で発行したもの（ドメインが「.」で始まっている＝ Domain 属性が指定されている）

![08_edge_cookie_import_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/eb245d92-25af-5dc4-146d-a4432b572995.png)

 - もう一方が先ほど Edge でアクセスしたときに発行されたもの（ドメインが「.」で始まっていない＝ Domain 属性無指定）

![09_edge_cookie_import_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/5885ff2b-e8c4-85a9-a71d-290b13cf905a.png)

であることが分かりました。

## 再度 Edge でアクセス

再度 Edge でアクセスすると、Cookie「AWSALB」を複数含む形でリクエストが送られます。何度か繰り返しアクセスしてもこれは変わりません。
![10_edge_access_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/490cf162-b1a3-d2f7-0096-4c42fcd5cf04.png)

続けて何度かアクセスすると、**スティッキーセッションが有効、かつ先ほど Stickiness duration を 1 日に戻したにも関わらず、複数のターゲットサーバに振り分けられてしまいます。**
![11_edge_access_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/667c5c81-0a51-7916-e4ae-9499e09dcb14.png)

ALB では、通常なら Domain 属性無指定の Cookie「AWSALB」をアクセスの都度（値を）更新しながら同じターゲットサーバに結び付けてセッション管理するのですが、このケースでは Domain 属性ありの Cookie（すでに振り分けの有効期限が切れたセッションキーを値に持つもの）が邪魔をして、アクセスの都度新たにターゲットサーバの振り分けを行ってしまいます。

なお、現時点では、**ターゲットグループの Stickiness duration の指定に関わらず、Cookie 自体の有効期限は 7 日で固定的に発行されます。**つまり、IE11 から Edge にインポートした Cookie を削除せずに放置すると、最長で 7 日間トラブルが継続します。

# 対処方法

対象の Cookie「AWSALB」（Domain 属性あり）を削除すればスティッキーセッションによる振り分けが復活します。基本的にはブラウザ側で削除してもらえば良いはずですが、場合によってはサーバ側で Domain 属性と有効期限（過去の日付など）を指定して強制的に削除することも考えられるでしょう。

※「AWSALBCORS」が複数になってしまったときも同様に削除します。