ブログ

AWS運用 ElastiCache Redis で PHP のセッション情報を保存してみよう

Amazon ElastiCache は、クラウド内の分散インメモリデータストアまたはキャッシュ環境を簡単に設定、管理、拡張できるウェブサービスです。よく使用されるケースとしてはWEBサービスでセッション情報等のキャッシュを管理する事があげられます。

今回は ElastiCache を利用するメリットと、実際に ElastiCache Redis でセッション情報を管理する一例をご紹介します。

AWS運用 ElastiCache Redis でセッション情報を管理するメリット

冒頭で述べたように、ElastiCache Redis はWEBサービスでセッション情報等のキャッシュを管理する場合に広く用いられています。今回はそのようなケースにおいて ElastiCache Redis を導入するメリットについてお話しさせていただきます。

セッション情報をWEBサーバー自身で管理する場合、以下のように ALB でスティッキーセッションの設定を行い、セッション情報を各 EC2 内部で管理する構成が多いのではないでしょうか。

このようなケースの場合、平常時は初回にアクセスした、セッション情報を保持している EC2 に振り分け続けられるため特に問題はありません。

ところが下の図のように WEBサーバー1 がダウンして、 WEBサーバー2 にアクセスを寄せる状況になった場合、ある問題が発生します。

WEBサーバー1 に保管されていたセッション情報は WEBサーバー2 では参照できないため、今まで WEBサーバー1 にアクセスしていたユーザーのセッション情報が無効になってしまいます。そのため再ログインが発生したり、ユーザーに影響を与えてしまう恐れがあります。

セッション情報を外部で保管する場合、前述のようにサーバーがダウンした場合でもセッション情報を利用し続ける事ができるため影響を最小限に留められることが期待できます。

ここから先では実際に ElastiCache Redis を構築して、 PHP のセッション情報を ElastiCache Redis で管理するまでを行ってみます。

AWS運用 ElastiCache Redis を構築する

今回は動作検証用のため最小限のインスタンスで ElastiCache Redis を構築します。

前章の構成図のようにAWS環境WEBサーバーのセッション管理用に構築する場合、主な注意点としては以下になります。

  • プライベートサブネットに構築すること(外部公開する必要がないため)
  • セキュリティグループはWEBサーバーから 6379 ポートへアクセス可能なこと。
  • サブネットグループではWEBサーバーのサブネットとプライベートで通信可能なこと。

検証用に次のキャプチャの ElastiCache Redis を用意しました。
(都合上、一部マスキングさせて頂いております)

次の章では、上記で用意した ElastiCache Redis にセッション情報を保存するための EC2 と PHP を用意します。

AWS運用 Amazon EC2 に PHP をインストール、セッション管理の設定

EC2 の立ち上げについては説明を割愛させていただきます。
OS、ミドルウェアは次の内容になります。

 OS: Amazon Linux 2
 PHP: PHP 7.4 
 Apache: Apache 2.4

今回はセッション動作確認用のため最低限にしています。
実際のWEBサーバーでは適宜設定してください。

以下は SSH 接続後の作業内容になります。
PHP インストール、 PHP の設定ファイルを変更します。

sudo su -
amazon-linux-extras enable epel
yum clean metadata
yum -y install epel-release
yum -y install httpd
amazon-linux-extras install php7.4
yum install php-pecl-redis
cp /etc/php.ini /etc/php.ini.org
vim /etc/php.ini
-----
[Session]
; Handler used to store/retrieve data.
; http://php.net/session.save-handler
;session.save_handler = files
session.save_handler = redis
~~~~
;session.save_path = "/tmp"
session.save_path = "ElastiCache redisのプライマリエンドポイント"
-----
systemctl restart httpd
 

ここまでで簡単な設定ができました。

次の章では、実際にセッション情報を ElastiCache Redis で管理できるか確かめてみます。

AWS運用 セッション情報を ElastiCache Redis に保存する動作確認

次の一連の流れでセッション情報を ElastiCache Redis に保存できるか動作確認してみます。

  1. EC2 から Redis に接続してキー一覧を取得し、何も情報がない事を確認する
  2. PHP でセッション情報を作成する
  3. EC2 から Redis に接続してキー一覧を取得し、2 で作成したセッション情報を確認する

1. EC2 から Redis に接続してキー一覧を取得し、何も情報がない事を確認する

yum install --enablerepo=epel redis
redis-cli -h ElastiCache redisのプライマリエンドポイント
ElastiCache redisのプライマリエンドポイント:6379>keys *
(empty array)
ElastiCache redisのプライマリエンドポイント:6379>quit

現在は何も情報がない事を確認できました。

2. PHP でセッション情報を作成する

phpセッションでは公式のファイルを参考にさせていただきました。
https://www.php.net/manual/ja/reserved.variables.session.php

vi session.php
----
<?php
$value = 'test';
session_start();
/*session is started if you don't write this line can't use $_Session  global variable*/
$_SESSION["newsession"]=$value;
?>
----
php session.php

3. EC2 から Redis に接続してキー一覧を取得し、2 で作成したセッション情報を確認する

redis-cli -h ElastiCache redisのプライマリエンドポイント
ElastiCache redisのプライマリエンドポイント:6379>keys *
1) "PHPREDIS_SESSION:3brifriuqv8hgoaued6tduo55k"
ElastiCache redisのプライマリエンドポイント:6379>quit

無事に ElastiCache Redis にセッション情報が保存されている事を確認できました。


いかがでしたでしょうか。

高可用性が求められるWEBシステムではセッション情報を外部に保管する事がオススメです。まだお試しでない方は是非一度ご検討下さい。

元記事発行日: 2021年04月13日、最終更新日: 2021年04月13日