今回から数回にわたり、CP型データベース「Redis」とAWSのマネージドサービスである「Amazon ElastiCache(Redis用)」を使って実際にアプリケーションを構築していきます。

まずは、利用するRedisとAmazon ElastiCacheについて、大枠を理解しておきましょう。

Amazon ElastiCacheの概要

Amazon ElastiCacheは、スケールアウト時のセッション状態や共通業務データなどを共有キャッシュすることにフォーカスしたサービスです。オプションとして「Memcached」と「Redis」を選択でき、以下のような観点で使い分けます。

比較項目 Memcached Redis
アクセス マルチスレッド シングルスレッド
データ構造/タイプ シンプル 文字列からリスト/ハッシュなど複雑なデータ型をサポート
永続性 なし あり
マルチAZとフェイルオーバー なし あり
その他の特徴 水平スケール可能 スケールアウトは更新がマスターノードに集中するため不可(リードレプリカは可)

特にRedisは第14回でも紹介した通り、CP型の特徴を持つキーバリュー型データストアであり、シャーディングなどの高速化目的のキャッシュや、スケールアウトしたアプリケーションでのセッションデータ共有で利用されます。今回は以下の図のように、Amazon ElastiCacheとSpring Session、Spring Data Resisを使って、ECSコンテナ上の複数のアプリケーション間でセッション情報を共有し、スケールアウト可能なステートフルアプリケーションを作成してみましょう。

アプリケーションの構成

ローカル環境におけるRedisの構築

ElastiCacheはエンドポイントを持ち、VPC内からアクセスできますが、パブリックアクセスは許可されていません。そのため、相応のメモリが必要になるのですが、ローカル環境でシングルノードのRedisを構築すると開発時は便利なので、ここでは、Dockerを利用し、ゲストOSとしてCentOS7上にRedisを実行してみます。

ホストOSとなる端末はMacOS、Windowsのどちらでもかまいませんが、Dockerを事前にインストールしておいてください。以降の解説は、Dockerがインストールされた環境を前提に進めていきます。

まず、任意のフォルダに「Dockerfile」という名前で以下のファイルを作成してください。

# Dockerfile for redis server

# (A)
FROM            docker.io/centos:latest
# (B)
MAINTAINER      debugroom

# (C)
RUN yum -y install epel-release
# (D)
RUN yum install -y redis
# (E)
RUN sed -i s/bind\ 127\.0\.0\.1/\#bind\ 127\.0\.0\.1/g /etc/redis.conf
# (F)
RUN sed -i s/protected\-mode\ yes/protected\-mode\ no/g /etc/redis.conf
# (G)
RUN systemctl enable redis.service
# (H)
EXPOSE 6379

ローカル環境にあるCentOS7Dockerコンテナ上で、シングルノードRedisを構築するDockerfileの実行コマンドは以下の通りです。

項番 コマンド
説明
A FROM docker.io/centos:latest
コンテナイメージのベースとなるOSイメージを指定します
B MAINTAINER debugroom
メンテナンスしている組織や個人の名称を指定します。省略可能です
C RUN yum -y install epel-release
OSにEPEL(Extra Packages for Enterprise Linux)リポジトリを追加します
D RUN yum install -y redis
Redisをインストールします
E RUN sed -i s/bind127.0.0.1/#bind127.0.0.1/g /etc/redis.conf
コンテナ外からのアクセスを許可するために、ループバックアドレス以外も許可するよう設定ファイル(/etc/redis.conf)を変更します
F F. RUN sed -i s/protected-mode\ yes/protected-mode\ no/g /etc/redis.conf
コンテナ外からのアクセスを許可するために、プロテクトモードをオフにするよう設定ファイル(/etc/redis.conf)を変更します
G RUN systemctl enable redis.service
コンテナ実行時にRedisのサービスを起動するよう設定します
H EXPOSE 6379
Redisで使用する6379ポートを解放します

上記のファイルを作成後、コマンドラインからDockerイメージを作成するコマンドを実行します。コマンド「docker build」でイメージ名やタグを指定して、元になるDockerfileがあるディレクトリを指定してください。

ここでは、DockerHub上でのxxxxxxレポジトリに「sample-redis-local」というイメージをlatestタグをつけて実行しています。そして最後に指定しているのが、Dockerfileがあるカレントディレクトリです。

docker build -t xxxxxx/sample-redis-local:latest .

Dockerイメージが作成されたら、コマンドラインからDockerコンテナをコマンド「docker run」で実行してください。

なお、実行するコンテナ内でsystemctlサービスを実行するために、—privilegedオプションを付与する必要があります。実行コンテナ名称(ここでは「redis-server」とします)と、コンテナイメージ名、コンテナの起動時は/sbin/initを実行し、systemdを起動するかたちでコンテナを実行します。

docker run -d --privileged -p 6379:6379 --name redis-server xxxxxxx/sample-redis-local /sbin/init

これで、Redisの環境が構築できました。次回はこのローカル環境のRedisにアクセスするSpringアプリケーションを実装してみます。

著者紹介


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

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

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