前回は、アプリケーションとRedisクライアントのDockerイメージを作成し、アプリケーションロードバランサーを構築しました。続く今回は、下図のようにECSクラスタを作成し、ECSタスク定義を行って、コンテナをデプロイしてアプリケーションを実行しましょう。

前回までに構築した環境にECSクラスタを作成する

ECSクラスタ及びセキュリティグループの設定

まず、ECSコンテナを実行するためのECSクラスタとセキュリティグループを設定します。設定方法は、本連載の第8回で解説しているので、入力項目の詳細はそちらをご覧ください。

なお、ECSクラスタに設定するセキュリティグループで許可する設定は2種類あり、、Redisクライアントを実行するためにSSH接続してクラスタにログインするのと、ALBからのリクエスト転送を動的ポートで接続します。したがって、以下のように、任意の場所からの22番へのアクセスと、ロードバランサーのセキュリティグループからの32768-61000番へのアクセスを許可するものを作成しておきます。

「セキュリティグループの作成」画面

次に、上記で作成したセキュリティグループを指定して、ECSクラスタを作成します。VPCはElastiCache構築時に作成したVPCを指定してください。

ECSクラスタの作成

ECSタスクの定義

前回DockerHubレポジトリへプッシュしたアプリケーションのコンテナイメージのURLを設定し、ECSタスク定義を行います。設定作業は、連載第9回とほぼ同様になるので、入力項目の詳細はそちらを参照してください。

ECSタスクの定義

ECSタスクの定義(タスクサイズ、コンテナ、ボリューム)

ECSタスクの定義(スタンダード)

上記のリンクの設定要領との差分の中で特筆すべき点として、アプリケーションではElastiCacheのエンドポイントを環境変数REDISCLUSTERENDPOINTで取得する実装になっているため(詳細は連載第20回を参照してください)、ElastiCacheのエンドポイントを以下のように環境変数に設定してください。

ElastiCacheのエンドポイントを環境変数に設定

なお、ECSクラスタのスペックにもよりますが、r4.largeインスタンスと同程度のスペックのものをクラスタとして用いる場合、メモリサイズは最低1024MB、CPUタスクは最低512以上を指定するようにしてください。それ以下だと、ヘルスチェックの実行までにアプリケーションの起動が完了せず、強制停止/再起動となり、コンテナが永久起動ループする可能性があります。

ECSサービスの実行・アプリケーション起動の確認

ターゲットグループを指定して、コンテナをECSサービスとして起動します。作業は連載第10回とほぼ同様なので、入力項目の詳細などはそちらを参照してください。今回、ロードバランサーからは2つのパスパターンごとにターゲットグループを指定しているので、ECSサービスを2つ起動するよう実行します。

サービスの設定

サービスが問題なく起動したら、ブラウザでALBのDNSを指定して、以下の例のようなURLでアクセスします。

●アプリケーションのURLの例:http://xxxxxxxx.ap-northeast-1.elb.amazonaws.com/index.html

アプリケーションの画面が表示されたら、実行コンテナ番号を「1」もしくは「2」で指定して「sharedSession」ボタンを押下すると、それぞれ実行したコンテナのホスト名が切り替わって表示されます。

実行コンテナ番号を指定してボタンを押下

都度、実行したコンテナのホスト名が表示される

ECSクラスタにSSHでログインし、前回プッシュしたRedis-ClientのDockerイメージをpullして、Redis-Clientを構築し、実際にElastiCacheに格納されているデータを確認します。

[ec2-user@ip-172-0-0-xxx ~]$  docker pull debugroom/mynavi-sample-redis-client:latest
 latest: Pulling from debugroom/mynavi-sample-redis-client
 // omit
 [ec2-user@ip-172-0-0-xxx ~]$ docker run -it --name redis-client debugroom/mynavi-sample-redis-client /bin/bash
 [root@2952f1af394a /]# redis-cli -h mynavi-elasticache.xxxxxx.ng.0001.apne1.cache.amazonaws.com
 mynavi-elasticache.xxxxxx.ng.0001.apne1.cache.amazonaws.com:6379>

コンテナ番号を指定し、「Shared Session」ボタンを押下します。

mynavi-elasticache.xxxxx.ng.0001.apne1.cache.amazonaws.com:6379> keys *
1) "spring:session:expirations:1552130880000"
2) "spring:session:sessions:expires:e1237df7-5646-4382-aa12-41435ed09dc7"
3) "spring:session:sessions:e1237df7-5646-4382-aa12-41435ed09dc7"
mynavi-elasticache.z95fpp.ng.0001.apne1.cache.amazonaws.com:6379> hgetall "spring:session:sessions:e1237df7-5646-4382-aa12-41435ed09dc7"
1) "creationTime"
2) "1552128921707"
3) "sessionAttr:scopedTarget.sampleSession"
4) "{\"@class\":\"org.debugroom.mynavi.sample.aws.elasticache.app.web.model.SampleSession\",\"host\":\"c95883d5424d\",\"lastUpdatedAt\":[\"java.util.Date\",1552129074569]}"
5) "lastAccessedTime"
6) "1552129074379"
7) "maxInactiveInterval"
8) "1800"

別のコンテナ番号を指定し、再び「Shared Session」ボタンを押下します。SampleSession内のhostが切り替わっていることがわかるはずです。

mynavi-elasticache.xxxxxx.ng.0001.apne1.cache.amazonaws.com:6379> hgetall "spring:session:sessions:e1237df7-5646-4382-aa12-41435ed09dc7"
1) "creationTime"
2) "1552128921707"
3) "sessionAttr:scopedTarget.sampleSession"
4) "{\"@class\":\"org.debugroom.mynavi.sample.aws.elasticache.app.web.model.SampleSession\",\"host\":\"f449a9d00143\",\"lastUpdatedAt\":[\"java.util.Date\",1552129676177]}"
5) "lastAccessedTime"
6) "1552129676176"
7) "maxInactiveInterval"
8) "1800"

このように、Spring SessionとSpring Data Redisを使うと、マルチサーバで簡単にセッション共有するアプリケーションを簡単に実装することができます。また、Amazon ElastiCacheを併用して用いることで可用性が高く、スケーラビリティを備えたアプリケーション環境を構築することが可能です。連載を参考に、皆さんもぜひ一度、お手元で試してみてください。

著者紹介


川畑 光平(KAWABATA Kohei) - NTTデータ 課長代理

金融機関システム業務アプリケーション開発・システム基盤担当を経て、現在はソフトウェア開発自動化関連の研究開発・推進に従事。

Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professional等の資格を持ち、アプリケーション基盤・クラウドなどさまざまな開発プロジェクト支援にも携わる。2019 APN AWS Top Engineers & Ambassadors選出。