クラウドの普及に伴い、ビッグデータやキーバリュー型データの格納など、ますます活用の機会が広がりつつあるNoSQLデータベース。 第3回は代表的なNoSQLプロダクトであるAmazon DynamoDBやApache Cassandra、Amazon ElastiCacheへアクセスするSpringアプリケーションを開発する方法について、わかりやすく解説します。
本連載では、以下の様なステップで進めていきます。
前回 【第23回】NoSQL(13)-セッション共有するECSアプリケーションの構築(1) では、アプリケーション及びRedisクライアントのDockerイメージを作成し、アプリケーションロードバランサーを構築しました。 下記のイメージ通りに、今回はECSクラスタを作成し、ECSタスク定義を行って、コンテナをデプロイしてアプリケーションを実行しましょう。
ECSコンテナを実行するためのECSクラスタ及びセキュリティグループを設定します。設定要領は、第2回 (5)ECSクラスタの作成 ほぼ同一となりますので、入力項目の詳細はリンク先を参考にしてください。
なお、ECSクラスタに設定するセキュリティグループは、Redisクライアントを実行するためにSSH接続してクラスタにログインするのと、ALBからのリクエスト転送を動的ポートで接続するので、以下の通り、任意の場所からの22番と、ロードバランサーのセキュリティグループからの32768-61000番のアクセスを許可するものを作成しておきます。
上記で作成したセキュリティグループを指定して、ECSクラスタを作成します。VPCはElastiCache構築時に作成したVPCを指定してください。
前回 アプリケーション・RedisクライアントのDockerイメージの作成 で実行した、DockerHubレポジトリへプッシュしたアプリケーションのコンテナイメージのURLを設定し、ECSタスク定義を行います。こちらも、設定作業の要領は、第2回 (6)ECSタスクの定義 とほぼ同様になりますので、入力項目の詳細はこちらも参照してください。
上記のリンクの設定要領との差分の中で特筆すべき点として、アプリケーションではElastiCacheのエンドポイントを環境変数REDIS_CLUSTER_ENDPOINTで取得する実装になっているため( Spring SessionとSpring Data Redisを使ったアプリケーション実装(1) を参照)、ElastiCacheのエンドポイントを下記の通り環境変数に設定してください。
警告
メモリサイズは1024MB、CPUタスクは512以上を最低指定するようにしてください。ヘルスチェックの実行までにアプリケーションの起動が完了せず、強制停止・再起動となり、コンテナが永久起動ループになる可能性があります。
ターゲットグループを指定して、コンテナをECSサービスとして起動します。作業の要領は、(7)ECSサービスの実行 とほぼ同様になりますので、入力項目の詳細はこちらも参照してください。 今回、ロードバランサーからは2つのパスパターンごとに、ターゲットグループを指定していますので、ECSサービスを2つ起動するよう実行します。
サービスが問題なく起動したら、ブラウザで、ALBのDNSを指定して、以下の例のようなURLでアクセスします。
アプリケーションの画面が表示されたら、実行コンテナ番号を1もしくは2で指定して「sharedSession」ボタンを押下すると、それぞれ実行したコンテナのホスト名が切り替わって表示されます。
ECSクラスタにSSHでログインし、前回 アプリケーション・RedisクライアントのDockerイメージの作成 でプッシュした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)
某システムインテグレータにて、金融機関システム業務アプリケーション開発・システム基盤担当を経て、現在はソフトウェア開発自動化関連の研究開発・推進に従事。
Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professional等の資格を持ち、アプリケーション基盤・クラウドなど様々な開発プロジェクト支援にも携わる。
2019 APN AWS Top Engineers & Ambassadors 選出。
本連載記事の内容に対するご意見・ご質問は Facebook まで。