class: title, smokescreen, shelf, no-footer # 第10回のUnix演習は無し(予備) <div class=footnote> <small> </small> </div> --- name: exercises-aws class: title, smokescreen, shelf, no-footer # 第10回 AWS演習<br><small>cookieをRedisに保存する</small> <div class=footnote> <small><small> </small></small> </div> --- class: compact,img-right # はじめに - 第09-10回でやること - ![](../../exercise/images/sysbuild-plan-minimum.png) <small> - 最終課題(必須)では、きちんとスケールできるショッピングカートを作ってもらいます - そのためにはcookieを使う必要があります - 第09-10回では次の2つをします 1. cookieをつけます(第09回) 1. <B>cookieを分散システムに保存する(第10回)</B> </small> --- class: compact # 課題(必須): cookieをRedisに保存する <div class=footnote> <small><small> (脚注) ElastiCache (redis)は月額10ドル前後かかる。 まぁ新しく作ったコースなら予算に余裕があるから大丈夫だろう </small></small> </div> - 本日の例題 1. AWS ElastiCache (redis)を作成する 1. redis-test.pyを作りredisに読み書きできることを確認する - 本日の課題 1. www.pyを改造し、cookieをキーをしてカート情報をredisに書きこむ - 動作確認 - TA/SAさんに確認してもらってください --- class: compact # 課題(自由) - セッションキーではなく、有効期限つきのクッキーを割り当てなさい - 動作確認 - 一度ブラウザを閉じて、もういちどブラウザを立ち上げ直しても、 同じクッキーを送っていることをTA/SAさんに見せてください <!-- section-begin aws.elasticache.redis --> --- class: title, smokescreen, shelf, no-footer # AWS ElastiCache (redis)の作成 <div class=footnote> <small><small> </small></small> </div> --- class: compact,img-right # AWS ElastiCacheとは? <div class=footnote> <small><small> (脚注1) Redis と Memcached の比較: <A HREF="https://aws.amazon.com/jp/elasticache/redis-vs-memcached/"> https://aws.amazon.com/jp/elasticache/redis-vs-memcached/ </A> <br> (脚注2) AWS Academyでも、redisは利用できます。 single AZのクラスタモードで動かせることは確認済 </small></small> </div> - いわゆるキャッシュシステム - サービスの総称がElastiCacheで、利用するソフトウエアが選択できます。 そのため、ElastiCache (redis)などと書いています - 選択肢はredisかmemcachedですが、演習ではredisを使います --- class: compact,img-right # AWS ElastiCache redis の作成(1) ![](/slides/service/aws/academy/images/aws-redis-01.png) <small> - AWS ConsoleでElastiCacheを検索します - ElastiCacheの画面左のメニューから「redisキャッシュ」をクリックし、 redisの管理画面(右図)へ移動してください - 右のオレンジ色の「Redisキャッシュを作成」をクリック </small> --- class: compact,img-right # AWS ElastiCache redis の作成(2) <div class=footnote> <small><small> (脚注) だれかデフォルトで動かしてみてください;-)うまくいったら教えてね。ただ高そうですけど... </small></small> </div> ![](/slides/service/aws/academy/images/aws-redis-02.png) <small> - デフォルトでは、うまくAWS Academy で動かないようなので(?)、次のように変更します - デプロイオプション - 「独自のキャッシュを設計」を選択 - 作成方法 - 「簡単な作成」を選択 - 設定 - 「デモ」を選択 - 右下のオレンジ色「作成」をクリック </small> --- class: compact,img-right # AWS ElastiCache redis の作成(3) <div class=footnote> <small><small> (脚注) 人によっては10分くらいかかることもあるみたいです。 気長に待ってみてください </small></small> </div> ![](/slides/service/aws/academy/images/aws-redis-03.png) <small> - 最初の画面にもどります - Redisが作成中(`Creating...`)のはずです - ステータスがAvailableになるまで待ちます - けっこう時間かかります (ときどき「ぐるぐるマーク」もクリックしてみる) - Availableになったら、 対象のredisをクリックし、 「クラスターの詳細」画面へ移動 </small> --- class: compact,img-right # AWS ElastiCache redis の作成(4) ![](/slides/service/aws/academy/images/aws-redis-04.png) <small> - 右下の方にある「エンドポイント」をクリップボードにコピーして、どこかにメモって下さい。 このあとwww.pyを改造する時に使います </small> <!-- section-end aws.elasticache.redis --> <!-- section-begin hack.wwwpy.redis --> --- class: title, smokescreen, shelf, no-footer # www.pyの改造 <div class=footnote> <small><small> </small></small> </div> --- class: compact # 例題: redis-test.pyを作成しredisの動作確認をします <small> - Pythonのredisライブラリをインストールしてください。 実行例: `$ sudo apt install python3-redis` - AWS console で作成したredisのエンドポイント名をredisHostにコピー&ペースト - ただし右端の`:6379`は余分なので、そこは削除 <small> ``` import os import time import redis # redisを操作するためのredis.client.Redisオブジェクト(変数c)を生成 redisHost = "なんか長ったらしいホスト名(エンドポイント名のホスト部分)" redisPort = 6379 c = redis.Redis(host=redisHost, port=redisPort, decode_responses=True) # [デバッグ] redisに書きこみ、redisから書きこんだ値を取り出してみる key = "_session" val = time.time() c.set(key, val) print(key + " = " + c.get(key)) ``` </small> </small> --- class: compact # エラー例: タイムアウトと表示されたら? <div class=footnote> <small><small> (脚注) 数十人に一人くらい、<B>ハズレ</B>がいるみたいです? </small></small> </div> <small> - Q: redis-test.pyを実行しても何も表示されず、しばらくして次のようなエラーメッセージがでる場合 ``` redis.exceptions.TimeoutError: Timeout connecting to server ``` - A: redisのセキュリティグループを確認してください <br> - 本来、自動的に次の2つのルールがあるはずです(下図) - 1行目(右端の説明欄に redis inboundとある行)がない場合、 <br> 「<B>ソース 0.0.0.0/0 からの 6379/tcp を許可</B>」(VPC内なら誰でもOK) するルールを追加してください ![](/slides/service/aws/academy/images/aws-redis-security-group.png) </small> --- class: title, smokescreen, shelf, no-footer # 課題(必須): カート情報をRedisに保存する <div class=footnote> <small><small> </small></small> </div> --- class: compact # 課題(必須) <small> - 前回(cookieの操作)と今回のコード(前頁のredis-test.py)を合体して、 <b>ショッピングカート情報をredisに保存</b>してください - cookieをキーにして、カート情報(商品と数量)を保存します - だからデータは三つ組が複数個あります - つまりRedisに保存するべきデータ構造はdictのdictのようになります - <small>ヒント: JSONで書くと`{ COOKIE: { KEY1: VALUE1, KEY2: VALUE2, KEY3, VALUE3 }}`の形式です</small> ``` [例: JSONで表現したデータ構造, このようなデータをRedisに保存する] { "1704114418.098571" : { "item01" : 1, "item02" : 0, "item03" : 2 } } ``` </small> --- class: compact # 解説: hset()とhget() - Redisのhashを操作する関数 - - <B>コンストラクタredis.Redis()が生成するクラスのメソッド</B>にhsetとhgetがあります - `hset(COOKIE, KEY, VALUE)` <small> - JSONで書くと`{ COOKIE: { KEY1: VALUE1 }}`の形と考えて下さい - COOKIEのところがcookie文字列 - KEYのところは、item01 item02 item03 のいずれか - VALUE部分には、カートの各商品(item01〜item03)の商品数を書く <br> (当然、キーitem01,item02,item03ごとに異なる) </small> - 値を取り出すときは`hget(COOKIE, KEY)` を使います <!-- section-end hack.wwwpy.redis -->