.. include:: ../module.txt
.. _section-cloud-native-nosql-4th-1-label:
【第19回】NoSQL(6)-AmazonElasiCacheの概要及びローカル環境でのRedisServer構築
----------------------------------------------------------------------------------------
|br|
クラウドの普及に伴い、ビッグデータやキーバリュー型データの格納など、ますます活用の機会が広がりつつあるNoSQLデータベース。
第3回は代表的なNoSQLプロダクトであるAmazon DynamoDBやApache Cassandra、Amazon ElastiCacheへアクセスするSpringアプリケーションを開発する方法について、わかりやすく解説します。
本連載では、以下の様なステップで進めています。
|br|
#. NoSQLデータベースの特徴とデータ特性
* CAP定理を元にしたデータベースの分類とデータ特性
* AP型データベースAmazon DynamoDBとApache Cassandraの特徴
#. Amazon DynamoDBへアクセスするSpringアプリケーション
* Amazon DynamoDBの概要及び構築と認証情報の作成
* Spring Data DynamoDBを用いたアプリケーション(1)
* Spring Data DynamoDBを用いたアプリケーション(2)
#. Apache CassandraへアクセスするSpringアプリケーション
* Apache Cassandraの概要及びローカル環境構築
* Spring Data Cassandraを用いたアプリケーション(1)
* Spring Data Cassandraを用いたアプリケーション(2)
#. Amazon ElastiCacheへアクセスするSpringアプリケーション
* **AmazonElasiCacheの概要及びローカル環境でのRedisServer構築**
* Spring SessionとSpring Data Redisを用いたアプリケーション(1)
* Spring SessionとSpring Data Redisを用いたアプリケーション(2)
* Amazon ElastiCacheの設定
* セッション共有するECSアプリケーションの構築(1)
* セッション共有するECSアプリケーションの構築(2)
|br|
前回 :ref:`section-cloud-native-nosql-3rd-2-label` では、AP型データベースである、Apache CassandraデータベースへアクセスするSpringアプリケーションを構築しました。
今回からはCP型データベースであるRedis及びAWSのマネージドサービスであるAmazon ElastiCache(Redis)の概要を説明し、実際にアプリケーションを構築していきます。
|br|
.. _section-cloud-native-elasticache-overview-label:
Amazon ElastiCacheの概要
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|br|
Amazon ElastiCacheは、スケールアウト時のセッション状態や共通業務データなどを共有キャッシュすることにフォーカスしたサービスです。
種類としてMemcachedとRedisをオプションとして選択でき、以下のような観点で使い分けを行います。
.. list-table:: ElastiCache(MemcachedとRedis)の共有キャッシュとして違い
:widths: 2, 2, 4
* -
- Memcached
- Redis
* - アクセス
- マルチスレッド
- シングルスレッド
* - データ構造・タイプ
- シンプル
- 文字列からリスト・ハッシュ等複雑なデータ型をサポート
* - 永続性
- なし
- あり
* - マルチAZとフェイルオーバー
- なし
- あり
* - その他の特徴
- 水平スケール可能
- スケールアウトは更新がマスターノードに集中するため不可(リードレプリカは可) |br|
特にRedisは前回 :ref:`section-cloud-native-nosql-category-by-cap-label` でも紹介した通り、CP型の特徴を持つキーバリュー型データストアであり、
シャーディングなどの高速化目的のキャッシュやスケールアウトしたアプリケーションでのセッションデータ共有で利用されます。今回は以下の図のように、Amazon ElastiCache(Redis)およびSpring Session、Spring Data Resisを使って、
ECSコンテナ上の複数のアプリケーション間でセッション情報を共有し、スケールアウト可能なステートフルアプリケーションを作成してみましょう。
|br|
.. figure:: img/aws-nosql/architecture-elasticache.png
|br|
.. _section-cloud-native-create-local-redis-label:
ローカル環境におけるRedisの構築
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|br|
ElastiCacheはエンドポイントを持ち、任意の場所からアクセスできますが、通常セキュリティグループによりアクセス制御されます。
そのため、相応のメモリが必要になるのですが、ローカル環境でシングルノードのRedisを構築すると開発時は便利なので、ここでは、
Dockerを用いてゲストOSとして、CentOS7上にRedisを実行してみます。ホストOSとなる端末はMacOS、Windowsどちらでもかまいませんが、
Dockerを事前にインストールしてください。以降はDockerがインストールされた環境を前提に進めていきます。
|br|
適当な任意のフォルダにDockerfileと言う名前で以下のファイルを作成してください。
.. sourcecode:: bash
# 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
|br|
.. list-table:: ローカル環境にあるCentOS7Dockerコンテナ上で、シングルノードRedisを構築するDockerfileの実行コマンド
:widths: 1, 19
* - 項番
- コマンド
* -
- 説明
* - (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/bind\ 127\.0\.0\.1/\#bind\ 127\.0\.0\.1/g /etc/redis.conf
* -
- コンテナ外からのアクセスを許可するために、ループバックアドレス以外も許可するよう/etc/redis.conf設定ファイルを変更します。
* - (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ポートを解放します。
|br|
上記のファイルを作成後、コマンドラインからDockerイメージを作成するコマンドを実行します。docker buildコマンドでイメージ名やタグを指定して、元になるDockerfileがあるディレクトリを指定してください。
ここでは、DockerHub上でのxxxxxxレポジトリにsample-redis-localというイメージをlatestタグをつけて実行しています。最後にDockerfileがあるカレントディレクトリを指定しています。
.. sourcecode:: bash
docker build -t xxxxxx/sample-redis-local:latest .
|br|
Dockerイメージが作成されたら、コマンドラインからDockerコンテナをdocker runコマンドで実行してください。なお、実行するコンテナ内でsystemctlサービスを実行するために、--privilegedオプションを付与する必要があります。
実行コンテナ名称(redis-serverとします)と、コンテナイメージ名、コンテナの起動時は/sbin/initを実行し、systemdを起動する形でコンテナを実行します。
.. sourcecode:: bash
docker run -d --privileged -p 6379:6379 --name redis-server xxxxxxx/sample-redis-local /sbin/init
|br|
これで、Redisの環境が構築できました。次回はこのローカル環境のRedisにアクセスするSpringアプリケーションを実装してみます。
|br|
著者紹介
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
川畑 光平(KAWABATA Kohei)
.. figure:: img/aws-lambda-and-api-gateway/pic_image01.jpg
某システムインテグレータにて、金融機関システム業務アプリケーション開発・システム基盤担当を経て、現在はソフトウェア開発自動化関連の研究開発・推進に従事。
Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professional等の資格を持ち、アプリケーション基盤・クラウドなど様々な開発プロジェクト支援にも携わる。
`2019 APN AWS Top Engineers & Ambassadors `_ 選出。
本連載記事の内容に対するご意見・ご質問は `Facebook `_ まで。