初めに
以下のチュートリアルをやってみました。ElastiCache はセッションデータの保持や、DB 処理の高速化など資格勉強でよく見かけますので、実際に使ってみたいとずっと思っていました。ElastiCache の起動、キャッシュの追加・削除、TTL の設定を学ぶことができました。
1. Redis クラスターを作成する
クラスターエンジンには「Redis」を選択し、ロケーションには「Amazon クラウド」を選択します。
以下のように設定します。
サブネットグループでは「新規作成」を選択します。VPC はデフォルトを選択しました。サブネットを2つ選択します。アベイラビリティゾーンの配置では「指定なし」にチェックを入れます。
なお、ゾーンの選択にチェックを入れると、プライマリとレプリカをどのアベイラビリティゾーンに配置するか選択することができます。今回は「指定なし」にチェックを入れます。
今回は動作検証が目的であるため、「自動バックアップの有効化」のチェックを外します。
「作成」をクリックします。
作成にしばらく時間がかかるので、この間に EC2 (Linux2、t2.micro)を起動します。
EC2 から Redis を利用する
以下のコマンドを実行し、アプリケーションを構築します。REDIS_URL
は以下のプライマリエンドポイントをコピーします。
sudo yum -y update
sudo yum -y install git
sudo pip3 install virtualenv
git clone https://github.com/aws-samples/amazon-elasticache-samples/
cd amazon-elasticache-samples/
virtualenv venv
source ./venv/bin/activate
cd session-store/
pip3 install -r requirements.txt
export FLASK_APP=example-1.py
export SECRET_KEY=test
export REDIS_URL="redis://elc-tutorial.mdb3zt.ng.0001.apne1.cache.amazonaws.com:6379"
Redis に接続できるか確認します。python の対話モードを開き、以下を実行します。True が返ってくれば接続できています。
>>> import redis
>>> client = redis.Redis.from_url('redis://elc-tutorial.mdb3zt.ng.0001.apne1.cache.amazonaws.com:6379')
>>> client.ping()
True
サンプル 1
アプリケーションを開始します。
flask run -h 0.0.0.0 -p 5000 --reload
ブラウザを開き、http://public-dns:5000
または http://public-ip:5000
にアクセスします。
続いて http://public-dns:5000/login
にアクセスします。
test-user-1 というユーザーでログインしました。
http://public-dns:5000/logout
にアクセスしてログアウトします。以下のページにリダイレクトされ、ログアウトできたことが確認できました。
サンプル 2
Ctrl
+ C
でアプリケーションを停止し、2 つ目のサンプルを試してみます。以下のように環境変数を設定し直します。
export FLASK_APP=example-2.py
再度アプリケーションを開始します。
flask run -h 0.0.0.0 -p 5000 --reload
http://public-dns:5000/login
にアクセスしログインすると、カウンターが表示されます。
ページを更新するたびに Visits が増加していくのが確認できます。これは以下の visits を hincrby()
メソッドでインクリメントしているためです。
# Connect to Redis with the REDIS_URL environment variable.
store = redis.Redis.from_url(os.environ.get('REDIS_URL'))
@app.route('/')
def index():
if 'username' in session:
username = escape(session['username'])
# インクリメント
visits = store.hincrby(username, 'visits', 1)
return '''
Logged in as {0}.<br>
Visits: {1}
'''.format(username, visits)
return 'You are not logged in'
サンプル 3
次に 3 つ目のサンプルを試してみます。
export FLASK_APP=example-3.py
flask run -h 0.0.0.0 -p 5000 --reload
TTL を 10 秒に設定することで、10 秒以上経過した後で更新すると Visits が 1 に戻ることが確認できます。該当ソースは以下の通りです。
# Connect to Redis with the REDIS_URL environment variable.
store = redis.Redis.from_url(os.environ.get('REDIS_URL'))
@app.route('/')
def index():
if 'username' in session:
username = escape(session['username'])
visits = store.hincrby(username, 'visits', 1)
# TTL を 10 秒に設定
store.expire(username, 10)
return '''
Logged in as {0}.<br>
Visits: {1}
'''.format(username, visits)
return 'You are not logged in'
- 何回かページを更新する
- 10 秒以上待ってから再度更新する
参考記事