前回は、下記のイメージ図のように、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つ目のターゲットグループを作成してください。
次に、ALBが特定のパスパターンで特定のコンテナのターゲットグループにディスパッチするよう、ALBの設定を行います。「ロードバランサー」メニューから上記で作成したALBを選択し、「リスナー」タブにある、「ルールの表示/編集」を選択します。
ここで、アプリケーションで実装したcontainerGroupパラメータのパターンに応じて、異なるターゲットグループへディスパッチするように設定を追加します。
パスパターンが「/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選出。