今まではプレビュー版でしかリリースされていなかった Cloud Run のセッションアフィニティが、先日 GA されましたので、その機能について改めて纏めました。

セッションアフィニティとは

セッションアフィニティは、特定のリクエストが同じインスタンスで処理されるように制御する機能です。
例えば、ログインセッションを維持したり、キャッシュされたデータを利用したりといった、ステートフルなアプリケーションやセッションベースの処理を行うユースケースで使用されます。

仕組み

デフォルトでは無効のため、以下の図のように同じクライアントからのリクエストでも異なるインスタンスによって処理されます。

有効にすると、Cloud Run が TTL を30日に設定した Cookie をヘッダーへ付与し、その値を識別することで、同一クライアントからのリクエストを同じインスタンスに転送します。
これにより、同じセッションまたはユーザーに関連する複数のリクエストが同じインスタンスで処理され、セッションの状態を維持することができます。

注意するべきこと

特定のクライアント専用インスタンスではない

Cookie の値によって識別するため、インスタンスが1つのクライアントに専有されるわけではありません。
異なるクライアントからのリクエストも受信可能です。

負荷分散が偏る可能性がある

同じインスタンスへリクエストが転送されるため、負荷分散が均等にならない可能性があります。
そのため、セッションアフィニティを利用する際は、アプリケーションの要件やパフォーマンスのバランスを考慮する必要があります。

ベストエフォートで有効

前提として、Cloud Run は自動スケーリングするため、セッションアフィニティはベストエフォートで動作する仕組みとなっています。
例えば、インスタンスが再起動や過負荷によって使用不能になった場合、セッションアフィニティは中断され、それ以降のリクエストは別のインスタンスに転送されます。
その場合は、クライアントが同じインスタンスに再接続できない可能性があります。

他の機能やサービスとの併用

トラフィック分割との併用

セッションアフィニティが有効になっているリビジョンでトラフィック分割も使用する場合、本機能はトラフィック分割よりも優先されます。
また、一部のリビジョンのみセッションアフィニティが有効で、無効になっているリビジョンとトラフィック分割を行うと、トラフィック分割の構成に関わらずセッションアフィニティが有効なリビジョンにリクエストが段階的にシフトされます。

Cloud Load Balancing との併用

本機能で付与された Cookie 名を、グローバル LB や内部 LB のセッションアフィニティに関連付けることで併用することができます。
これらを組み合わせることで、LB を使っている場合でもセッションの一貫性が確保できるだけでなく、負荷分散の偏りを改善したり、パフォーマンスを向上させるための、より柔軟な設計が可能です。

設定方法

今回は Cloud Run のサービスは既に起動している前提で、セッションアフィニティの有効化および、その確認に焦点を当てて説明します。
設定自体は非常に簡単で、以下のステップで有効化できます。

  1. Cloud Run の編集画面から下記画像の[ネットワーク]タブを選択
  2. [セッションアフィニティ]にチェックを入れる
  3. デプロイする

設定が反映されたことを確認するために、Cookie が付与されているか確認します。

$ curl -I https://xxxx.a.run.app/
HTTP/2 200
content-type: text/html; charset=utf-8
set-cookie: GAESA=CoQBM~中略~mEMQ; expires=Wed, 21-Jun-2023 11:05:01 GMT; path=/
date: Mon, 22 May 2023 11:05:01 GMT
server: Google Frontend
expires: Mon, 22 May 2023 11:05:01 GMT
cache-control: private
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000

「GAESA」という名前で付与されていることが確認できました。
(Cloud Run の一部機能は App Engine から派生しており、同様の Cookie 名が使われているため、「Google App Engine Session Affinity」などの略かなと個人的に解釈しています)

また、TTL も30日後になっており、セッションアフィニティが有効になっていることが確認できました。

終わりに

Cloud Run のセッションアフィニティの特徴および設定方法について解説しました。
セッションアフィニティは今まではプレビュー版でしかリリースされていなかったので、本番ワークロードでの利用は推奨されておりませんでした。
セッション維持など活用できる場面は少なくないと思うので、GA されたことにより利用機会が増えていくだろうと思っています。

参考
セッション アフィニティの設定
Cloud Run のセッション アフィニティで応答性を向上