【第23回】NoSQL(13)-セッション共有するECSアプリケーションの構築(1)


クラウドの普及に伴い、ビッグデータやキーバリュー型データの格納など、ますます活用の機会が広がりつつあるNoSQLデータベース。 第3回は代表的なNoSQLプロダクトであるAmazon DynamoDBやApache Cassandra、Amazon ElastiCacheへアクセスするSpringアプリケーションを開発する方法について、わかりやすく解説します。

本連載では、以下の様なステップで進めていきます。


  1. NoSQLデータベースの特徴とデータ特性
    • CAP定理を元にしたデータベースの分類とデータ特性
    • AP型データベースAmazon DynamoDBとApache Cassandraの特徴
  2. Amazon DynamoDBへアクセスするSpringアプリケーション
    • Amazon DynamoDBの概要及び構築と認証情報の設定
    • Spring Data DynamoDBを用いたアプリケーション(1)
    • Spring Data DynamoDBを用いたアプリケーション(2)
  3. Apache CassandraへアクセスするSpringアプリケーション
    • Apache Cassandraの概要及びローカル環境構築
    • Spring Data Cassandraを用いたアプリケーション(1)
    • Spring Data Cassandraを用いたアプリケーション(2)
  4. Amazon ElastiCacheへアクセスするSpringアプリケーション
    • AmazonElasiCacheの概要及びローカル環境でのRedisServer構築
    • Spring SessionとSpring Data Redisを用いたアプリケーション(1)
    • Spring SessionとSpring Data Redisを用いたアプリケーション(2)
    • Amazon ElastiCacheの設定
    • セッション共有するECSアプリケーションの構築(1)
    • セッション共有するECSアプリケーションの構築(2)


前回 Amazon ElastiCache(Redis)の設定 では、下記のイメージ図のように、VPC及びAmazon ElastiCacheを構築しました。 今回からは、ElastiCacheでセッション共有するアプリケーションを構築していきましょう。


../_images/architecture-elasticache.png


アプリケーション・RedisクライアントのDockerイメージの作成


既に Spring SessionとSpring Data Redisを使ったアプリケーション実装(2) でアプリケーションの実装は完了していますが、 ECSコンテナとして実行するためにDockerイメージを作成して、DockerHubなどのレジストリにプッシュしておく必要があります。加えて、ElastiCacheに追加されたセッションデータを確認するために、 ECSクラスタ上で実行するRedisクライアントをインストールしたDockerイメージも作成しておきましょう。


まず、アプリケーションのプロジェクトに以下のようなDockerfileを作成します。記述する内容は第2回で解説した (4)Dockerコンテナの作成・DockerHubへのプッシュ とほぼ同一ですので、解説はこちらを参照してください。

FROM centos:centos7
MAINTAINER debugroom

RUN yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget tar iproute git

RUN wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
RUN sed -i s/\$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo
RUN yum install -y apache-maven
ENV JAVA_HOME /etc/alternatives/jre
RUN git clone https://github.com/debugroom/mynavi-sample-aws-elasticache.git /var/local/mynavi-sample-aws-elasticache
RUN mvn install -f /var/local/mynavi-sample-aws-elasticache/pom.xml

RUN cp /etc/localtime /etc/localtime.org
RUN ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

EXPOSE 8080

CMD java -jar -Dspring.profiles.active=production /var/local/mynavi-sample-aws-elasticache/target/mynavi-sample-aws-elasticache-0.0.1-SNAPSHOT.jar


また、RedisクライアントとなるDockerfileを、以下の要領に沿って作成します。こちらも、記述内容は ローカル環境におけるRedisの構築 とほぼ重複していますので、解説を改めて参考にしたい場合はこちらを参照してください。


# Dockerfile for redis client

FROM            docker.io/centos:latest
MAINTAINER      debugroom

RUN yum -y install epel-release
RUN yum install -y redis


上記のファイルを作成後、コマンドラインからDockerイメージを作成するコマンドを実行します。ただし、コマンド実行前にgit cloneするアプリケーションは事前にGitHubなどへプッシュしておく必要がありますので注意してください。docker buildコマンドを実行する際は、イメージ名やタグ元になるDockerfileがあるディレクトリを指定してください。下記の例ではDockerHub上でのxxxxxxレポジトリにmynavi-sample-aws-elastiache-appというイメージをlatestタグをつけてコンテナイメージを作成しています。イメージがビルドされた後は、コンテナイメージをレジストリ(ここではDockerHub)にプッシュしておきましょう。


docker build -t xxxxxx/mynavi-sample-aws-elasticache-app:latest .
// omit
docker push xxxxxx/mynavi-sample-aws-elasticache-app:latest


Redisクライアントのコンテナイメージ作成では、DockerHub上でのxxxxxxレポジトリにmynavi-sample-redis-clientというイメージをlatestタグをつけて実行します。同様にコンテナイメージの作成後に、プッシュします。


docker build -t xxxxxx/mynavi-sample-redis-client:latest .
// omit
docker push xxxxxx/mynavi-sample-redis-client:latest


続いて、アプリケーションロードバランサーの構築に移ります。


アプリケーションロードバランサー(ALB)の作成


アプリケーションは複数のECSコンテナで実行しますが、各コンテナのアプリケーションが共通のセッションを利用していることを確認するため、 リクエストURLのパスパターンによって異なるコンテナへ処理が振り分けられるようにアプリケーションロードバランサー(ALB)を構成しましょう。 構築作業の要領は、第2回 (2)アプリケーションロードバランサー(ALB)の作成 とほぼ同様になりますので、入力項目の詳細はこちらも参照してください。

「EC2」サービスから、「ロードバランサー」メニューを選択し、「ロードバランサーの作成」ボタンを押下して、 以下の通り、ロードバランサーの構成を設定します。VPC及びサブネットは前回 Amazon ElastiCache(Redis)の設定 で作成したものを指定してください。


../_images/management-console-ec2-create-alb-for-elasticache-1.png


セキュリティ設定の構成は今回はHTTPを利用するので必要ありませんが、セキュリティグループの設定は、任意のソースからの80番ポートのリクエストを受け付けるものを指定します。


../_images/management-console-ec2-create-alb-for-elasticache-2.png


ターゲットグループは、ALB構築後にもう1つ作成を行いますが、ここでは1つ目を作成しておきます。


../_images/management-console-ec2-create-alb-for-elasticache-3.png


ターゲットの登録はECSコンテナの実行時に指定しますので、ここでは設定をスキップします。

../_images/management-console-ec2-create-alb-for-elasticache-4.png


引き続き、ターゲットグループをもう一つ作成しておきます。「EC2」サービスから、「ターゲットグループ」メニューを選択し、「ターゲットグループの作成」ボタンを押下して、 以下の通り、2つ目のターゲットグループを作成します。


../_images/management-console-ec2-create-target-group-for-elasticache-1.png


ALBが特定のパスパターンで特定のコンテナのターゲットグループにディスパッチするよう、ALBの設定を行います。 「ロードバランサー」メニューから上記で作成したALBを選択し、「リスナー」タブにある、「ルールの表示/編集」を選択します。


../_images/management-console-ec2-setting-alb-for-elasticache-1.png


以下の通り、アプリケーションで実装したcontainerGroupパラメータのパターンに応じて、異なるターゲットグループへディスパッチするよう設定を追加します。

  • パスパターン:/1の場合、ターゲットグループ「mynavi-elasticache-ap1」へ転送するよう設定


../_images/management-console-ec2-setting-alb-for-elasticache-2.png


  • パスパターン:/2の場合、ターゲットグループ「mynavi-elasticache-ap2」へ転送するよう設定
  • パスパターン:それ以外の場合、ターゲットグループ「mynavi-elasticache-ap1」へ転送するよう設定


../_images/management-console-ec2-setting-alb-for-elasticache-3.png


引き続き、次回はECSクラスタの構築とタスク定義を行い、ECSサービスをデプロイします。


著者紹介

川畑 光平(KAWABATA Kohei)

../_images/pic_image011.jpg

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

Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professional等の資格を持ち、アプリケーション基盤・クラウドなど様々な開発プロジェクト支援にも携わる。

2019 APN AWS Top Engineers & Ambassadors 選出。

本連載記事の内容に対するご意見・ご質問は Facebook まで。