前回は、下記のイメージ図のように、VPCとAmazon ElastiCacheを構築しました。

前回構築したVPCとAmazon ElastiCache

これを踏まえ、今回からは、ElastiCacheでセッション共有するアプリケーションを構築していきましょう。

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

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

まず、アプリケーションのプロジェクトに以下のようなDockerfileを作成します。

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

ファイルの記述は第7回で解説したのとほぼ同じ内容なので、解説はそちらを参照してください。

また、RedisクライアントとなるDockerfileを、以下の要領に沿って作成します。こちらも、記述は第19回で紹介した内容とほぼ重複しているので、解説が必要な場合はそちらを参照してください。

# 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レポジトリに、latestタグを付けて「mynavi-sample-redis-client」というイメージを実行します。同様にコンテナイメージの作成後に、プッシュします。

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

続いて、アプリケーションロードバランサー(ALB)を構築します。

ALBの構築

アプリケーションは複数のECSコンテナで実行しますが、各コンテナのアプリケーションが共通のセッションを利用していることを確認するため、リクエストURLのパスパターンによって異なるコンテナへ処理が振り分けられるようにALBを構築していきしましょう。

構築作業は、第5回で解説したのとほぼ同様になるので、入力項目の詳細についてはそちらを参照してください。手順は以下の通りです。

まず「EC2」サービスから、「ロードバランサー」メニューを選択し、「ロードバランサーの作成」ボタンを押下して次のようにロードバランサーの構成を設定します(VPCとサブネットは、前回作成したものを指定してください)

ロードバランサーの設定

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

セキュリティグループの設定

「ルーティングの設定」メニューでは、まず1つ目のターゲットグループを作成します。

ターゲットグループを作成する

続く「ターゲットの登録」メニューですが、登録するターゲットはECSコンテナの実行時に指定するので、ここでは設定をスキップします。

ターゲットの登録

ここまで進めたら、ターゲットグループをもう1つ作成します。「EC2」サービスから、「ルーティングの設定」メニューを選択し、「ターゲットグループの作成」ボタンを押下して、2つ目のターゲットグループを作成してください。

2つ目のターゲットグループを作成する

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

「リスナー」タブで「ルールの表示/編集」を選択する

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

パスパターンが「/1」の場合、ターゲットグループ「mynavi-elasticache-ap1」へ転送するような設定は、以下の通りです。

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

同じ要領で、パスパターンが「/2」の場合、ターゲットグループ「mynavi-elasticache-ap2」へ転送し、それ以外の場合はターゲットグループ「mynavi-elasticache-ap1」へ転送するように設定すると、以下のようになります。

パスパターンに応じた転送先の設定を終えた状態

これでALBの構築は完了です。次回はECSクラスタの構築とタスク定義を行い、ECSサービスをデプロイします。

著者紹介


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

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

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