今回のゴール
WEBアプリのセッション情報を保管する方法として、スケーラビリティーとレスポンス性を考慮してElastiCache for Redisを使用していきます。
下記のAWSサイトを参考にしました。
Amazon ElastiCache for Redis を使い、オンラインアプリケーション用の高速セッションストアを構築する
下準備
WEBサーバー用のEC2インスタンスの作成
詳細は省略しますが、Flaskアプリケーションがポート5000番で起動しますので、セキュリティーグループでインバウンドのTCP 5000番の許可します
セキュリティーグループの作成
ElastiCacheにアタッチするセキュリティーグループを作成します。
[セキュリティグループ名]:任意
[説明]:任意
【インバウンドルール】
[タイプ]:TCP
[VPC]:ElastiCacheを配置するVPC
[ポート番号]:6379
[ソース]:カスタム 上記で作成したEC2のセキュリティーグループを選択
設定
ElastiCacheサービスで「今すぐ始める」をクリック
[クラスタエンジン]:Redis
【Redisの設定】
[名前]:任意
[ノードのタイプ]:今回はテストなのでt2.microを選択
[レプリケーション数]:1
【Readisの詳細設定】
[名前]:任意
[VPC ID]:任意のVPCを選択
[サブネット]:キャッシュクラスターを構成するサブネットを指定
【セキュリティー】
[セキュリティーグループ]:下準備で作成したセキュリティーグループを選択
[保管時の暗号化]:チェック
【バックアップ】
[自動バックアップの有効化]:今回はテストなのでチェックを外しました。
【メンテナンス】
[メンテナンスウィンドウ]:今回はテストなので”指定なし”を選択しました。
作成までに少し時間がかかります。
作成後、後で使用しますので、”プライマリエンドポイント”をコピーします。
確認
確認の下準備
EC2インスタンスにサンプル動作環境を構築してきます。
sudo yum install git
sudo yum install python3
sudo pip3 install virtualenv
git clone https://github.com/aws-samples/amazon-elasticache-samples/
cd amazon-elasticache-samples/session-store
続いてvirtualenvで仮想環境を作成してFlaskを実行します。
virtualenv venv
source ./venv/bin/activate
pip3 install -r requirements.txt
export REDIS_URL="redis://[プライマリエンドポイント]:6379"
export FLASK_APP=example-1.py
export SECRET_KEY=[任意の文字列]
flask run -h 0.0.0.0 -p 5000 --reload
ブラウザからEC2のFlaskにアクセスします。
http://[EC2のパブリック IPv4 DNS]:5000
“You are not logged in”の画面がでれば成功です。
サンプルについて
このサンプルでは、「/」、「/login」、「/logout」の 3 つのルートを使用できます。
各ルートの動作をブラウザで確認してください。
また、サンプルソースは
example-1.py~example-4.pyまであります。
- example-1.py:radis不使用
- example-2.py:訪問回数の保存(以下全てradis使用)
- example-3.py:上記にTTLを追加(10秒)
- example-4.py:上記をSessionStoreClassを使用して書き換えたもの
ソースは下記URLを参照
https://github.com/aws-samples/amazon-elasticache-samples/tree/master/session-store
サンプル3の動作確認
サンプル3を動作させてみましょう。
Ctrl+CでFlaskを停止して、下記コマンドを実行してブラウザでアクセスします。
export FLASK_APP=example-2.py
flask run -h 0.0.0.0 -p 5000 --reload
すると、リロードするたびにVisits回数がインクリメントされることが確認できます。
また、10秒以上アクセスがないと、キーが削除されますのでVisits回数が1になります。
Redisの中身を確認
Radisの実際の中身を確認するために、EC2にredis-cliをインストールして接続します。
sudo amazon-linux-extras install redis4.0
redis-cli -h [プライマリエンドポイント]
接続できたら次のコマンドを実行して中身を確認します。
#キーを全て取得(全てにロックが掛かるので本番では使用しない)
>keys *
2) "aaa"
#キーの値の型を取得
>type aaa
hash
#Hashのキーを取得
>hkeys aaa
1) "visits"
#Hashの値を取得
>hget aaa visits
"4"
駆け足でしたが、一通りのサンプル検証ができました。