Redis

異なるドメインをもつ複数のAzure App Service間でデータ共有してみた

セッションデータをAzure Cache for Redisに格納するJavaアプリケーションを、複数のAzure App Serviceそれぞれに配置し、複数のAzure App Serviceが異なるドメインをもつ場合、セッションデータを互いに共有することはできない。

今回は、Spring Bootを利用したJavaアプリケーションを、異なるドメインをもつ複数のAzure App Serviceに配置し、互いにデータ共有してみたので、そのサンプルプログラムを共有する。

前提条件

以下の記事のAzure Cache for Redisの作成が完了していること。

Azure Cache for Redisを作成してみたRedisとは、Key-Value型の非リレーショナルデータベース(NoSQL)で、そのRedisをAzure上で利用できるのがAzur...

また、以下の記事の手順で、Azure App Serviceを2つ作成し、Spring Bootを利用したJavaアプリケーションのデプロイが完了していること。

Azure Potal上でApp Serviceを作成してみたAzureとは、Microsoft社が提供するクラウドサービスで、サーバーやネットワーク・ストレージなどのITインフラや、いろいろなアプ...
Azure App Service上でSpring Bootを利用したJavaアプリケーションを作成してみた前回は、Azure Potal上でApp Serviceを作成してみたが、今回は、前回作成したApp ServiceにSpring Bo...

作成したサンプルプログラムの内容

作成したサンプルプログラム(呼び出し元のApp Service)の構成は、以下の通り。なお、下記の赤枠のプログラムについては、後述する。
サンプルプログラムの構成_1

また、作成したサンプルプログラム(呼び出し先のApp Service)の構成は、以下の通り。なお、下記の赤枠のプログラムについては、後述する。
サンプルプログラムの構成_2

呼出元・呼出先のpom.xmlの内容は以下の通りで、Azure Cache for Redisを利用するためのライブラリを追加している。

また、呼出元・呼出先のapplication.propertiesの内容は以下の通りで、ローカル環境で動かす際のポート番号・呼出先画面のURL・Azure Cache for Redisの接続先設定を追加している。

なお、Azure環境上での呼出先画面のURLは、以下のAzure Portal上の既定のドメインから確認できる。
呼出先のAppService

また、Azure Cache for Redisの接続先は、以下のAzure Portal上のプライマリ接続文字列から確認できる。
AzureCacheForRedis設定

さらに、呼出元・呼出先のセッション設定を行うクラスは以下の通りで、Azure Cache for Redisを利用するための設定を行っている。

また、呼出元のコントローラクラス・HTMLファイルの内容は以下の通りで、呼出元画面の表示処理と、呼出元画面から呼出先画面を開く処理を追加している。

さらに、呼出先のコントローラクラス・HTMLファイルの内容は以下の通りで、呼出先画面を表示する処理を追加している。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/azure/tree/master/azure-multi-app-service/demoAzureApp1

https://github.com/purin-it/azure/tree/master/azure-multi-app-service/demoAzureApp2



「Envader」はLinuxコマンドやDatabase SQL等のスキルを、環境構築不要で習得できる学習サイトだった「Envader」は、ITエンジニアとしてよく使うLinuxコマンドやDatabase SQL等のスキルを、解説を読んだ上で、問題を解き...

サンプルプログラムの実行結果(ローカル環境)

ローカル環境でサンプルプログラムの実行した結果は、以下の通り。

1) 呼出元・呼出先のapplication.propertiesの設定を、ローカル環境用に変更する。

2) 呼出元・呼出先のSpring Bootアプリケーションをそれぞれ起動する。
サンプルプログラムの実行結果(ローカル)_2_1

サンプルプログラムの実行結果(ローカル)_2_2

3)「http://localhost:(呼出元画面のポート番号)/」とアクセスすると、以下のように、呼出元画面が表示されることが確認できる。
サンプルプログラムの実行結果(ローカル)_3

4) 呼出先画面に渡す値を指定し「呼出先画面を表示」ボタンを押下すると、以下のように、呼出先画面が表示され、呼出先画面に渡す値が表示されることが確認できる。
サンプルプログラムの実行結果(ローカル)_4_1

サンプルプログラムの実行結果(ローカル)_4_2

5) このときのセッションの値をAzure Cache for Redisで確認した結果は以下の通りで、呼出先画面に渡す値がセッションに格納されていることが確認できる。
サンプルプログラムの実行結果(ローカル)_5_1

ちなみに、上記赤枠部分には、「これはテスト」をURLエンコードした結果が設定されていることが確認できる。なお、URLエンコードした結果の確認は、例えば以下のサイトで確認できる。
https://tech-unlimited.com/urlencode.html

サンプルプログラムの実行結果(ローカル)_5_2 サンプルプログラムの実行結果(ローカル)_5_3



「FlexClip」はテンプレートとして利用できる動画・画像・音楽などが充実した動画編集ツールだったテンプレートとして利用できるテキスト・動画・画像・音楽など(いずれも著作権フリー)が充実している動画編集ツールの一つに、「FlexCli...

サンプルプログラムの実行結果(Azure環境)

Azure環境でサンプルプログラムの実行した結果は、以下の通り。

1) 呼出元・呼出先のapplication.propertiesの設定を、Azure環境用に変更する。

2) 以下のサイトの「App ServiceへのSpring Bootを利用したJavaアプリケーションのデプロイ」に記載した手順に従って、Azure App Service(2つ)それぞれに、呼出元・呼出先のJavaアプリケーションを配置する。

Azure App Service上でSpring Bootを利用したJavaアプリケーションを作成してみた前回は、Azure Potal上でApp Serviceを作成してみたが、今回は、前回作成したApp ServiceにSpring Bo...

3) 呼出元のApp Service概要の「既定のドメイン」のURLにアクセスすると、以下のように、呼出元画面が表示されることが確認できる。
サンプルプログラムの実行結果(Azure)_3_1

サンプルプログラムの実行結果(Azure)_3_2

4) 呼出先画面に渡す値を指定し「呼出先画面を表示」ボタンを押下すると、以下のように、呼出先画面が表示されるが、表示される値が「リクエストパラメータから取得した値」のみとなる。
サンプルプログラムの実行結果(Azure)_4_1

サンプルプログラムの実行結果(Azure)_4_2

5) このときのセッションの値をAzure Cache for Redisで確認した結果は以下の通りで、セッション情報が、下記赤枠2つに分かれて格納されていることが確認できる。
サンプルプログラムの実行結果(Azure)_5

この実行結果で、セッション情報が2つに分かれて格納されるのは、呼出元・呼出先でドメインが違うためである。このサンプルプログラムの場合、呼出元のドメインは「azureappdemoservice.azurewebsites.net」、呼出先のドメインは「azureappdemoservice2.azurewebsites.net」となっている。

なお、異なるドメイン間でセッション情報を共有できないことの詳細は、以下のサイトを参照のこと。
https://teratail.com/questions/48496


2024/1/7 追記
以下の記事に記載の通り、複数のAzure App Serviceに、(メインドメインが同一の)サブドメインをもつカスタムドメインを設定すれば、セッションデータを互いに共有することができる。

(メインドメインが同一の)サブドメインをもつ複数のAzure App Service間でデータ共有してみた下記記事で、セッションデータをAzure Cache for Redisに格納するJavaアプリケーションを、複数のAzure App ...

要点まとめ

  • セッションデータをAzure Cache for Redisに格納するJavaアプリケーションを、複数のAzure App Serviceそれぞれに配置し、複数のAzure App Serviceが異なるドメインをもつ場合は、それぞれ別ドメインになるため、セッションデータを互いに共有することはできない。