今回から数回にわたり、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選出。