ElastiCache(Redis) の認証機能をLaravel 5.5で
前に書いた Vagrant * Ansible で作成した環境をベースに、Laravel 5.5 で開発したり検証したりしております。
正直、プログラミングには苦手意識があるのですが…Laravelで組んでると楽しい! コイツいいですわぁー。もっと早く使っておけばよかった。
で、キリのいいところでAWSのステージング環境に突っ込むわけですが、主題の件でようわからんくなったんでメモ。
環境
-
Vagrant
- PHP7.2 / Laravel5.5
- Redis 3.2.10
-
AWS
- PHP7.2 / Laravel5.5
- ElastiCache for Redis
ふつうRedisの認証は楽
Vagrant上のCentOSに入れたRedisであれば、簡単に認証を設定できます。
(クラスタ組んでたりする場合は違うかも…)
/etc/redis.conf
requirepass PASSWORD
Laravel側もかんたん設定
※ 今回はPredisを使用
APPDIR/.env 設定例
REDIS_HOST=192.168.nnn.mmm
REDIS_PASSWORD=PASSWORD
REDIS_PORT=6379
あとは systemctl restart redis
でOKでした。
認証を有効にすると redis-cli
を使うときに authコマンド
が必要になるので気を付けて。
ElastiCacheのRedisは?
調べてみると、ふつうRedisのようにパスワード設定して終わり! とはいかないようです。
こちらを参照しながら見てみます(つか、最近できるようになったのか…)
記事内にも記載されていますが
-
エンジンバージョン 3.2.6 のみ暗号化OK
-
暗号化しないと認証自体が使えない
-
あとから暗号/認証を有効にすることはできない
ひとまず(少なくとも3月末時点では)この3点に注意します。
別バージョン絶対指定案件であれば無理ですし、すでに運用している状況であれば作り直しになります。
コンソール上でも、バージョンについて言われたり。
ElastiCache Redisクラスタ作成
先ほどのページを参考に、AWSの設定。
エンジンバージョンを合わせ、暗号化にチェックを入れればパスワード(認証トークン)が入力できるようになります。
EC2インスタンスからつないでみる
暗号化すると redis-cli でつなげなくなってしまうので openssl にて確認してみます。
つないだらまず auth PASSWORD と打つのは redis-cli と同じ。
[root@....]# openssl s_client -connect ****.cache.amazonaws.com:6379 -quiet
depth=4 C = US, O = "Starfield Technologies, Inc.", OU = Starfield Class 2 Certification Authority
verify return:1
depth=3 C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Services Root Certificate Authority - G2
verify return:1
depth=2 C = US, O = Amazon, CN = Amazon Root CA 1
verify return:1
depth=1 C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
verify return:1
depth=0 CN = ****.cache.amazonaws.com
verify return:1
auth PASSWORD
+OK
keys *
*3
$65
********_cache:72051754e6b333cc210cbdbcb1678a5c8ea46f2a:timer
$64
8569ad1e45ae8668518bc418b44091d781c0f6f8c085f32c9924f62458d6aded
$59
********_cache:72051754e6b333cc210cbdbcb1678a5c8ea46f2a
OKですね。monitorとかも使えた。よしよし。
Laravelの設定
設定周りを少しいじります。
マニュアルみてもなかった気がするので この辺 を眺めつつLaravelに展開。
APPDIR/.env
REDIS_HOST=ElastiCacheForRedisエンドポイント
# TLS接続の場合に追加
REDIS_SCHEME=tls
APPDIR/config/database.php
'redis' => [
'client' => 'predis',
'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
// TLS対応
'scheme' => env('REDIS_SCHEME', 'tcp'),
'ssl' => [
'verify_peer' => false,
],
],
],
.env の REDIS_SCHEME が設定されていないときは tcp で接続するように設定。 ひとまず接続はOKですが verify_peer = true
として cafile
の検証しないと。
ところで、AWSはやい
そろそろAWSを使い始めて半年くらい。実際に触れていると、サービスのリリーススピードに毎度驚かされます。
AWSこんなんできるんだーさすがだねーって何気なく使ってる機能が、実は最近リリースされたばかり…ということが何度もありました。しばらく設定変えてないサービスのコンソールを久々に開いたら…あ! 画面が今っぽくなってる!ってのも多い。お知らせメール見ても溜息出る。どんどん便利に楽しくなっていく感じがいいですねー。
一方、これ追い続けられるのか…という不安を覚えるのも正直なところです。
まぁクラウドですから、サービス終了、更新、移行…などなどに伴う組み直しもそのうち発生するでしょう。他社サービスや基礎技術も含めて、できる範囲でちょこちょこ眺めておこうと思う次第です。