開発室ブログ

AWS ElastiCache Laravel Redis

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 for Redisコンソール上でも、バージョンについて言われたり。

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こんなんできるんだーさすがだねーって何気なく使ってる機能が、実は最近リリースされたばかり…ということが何度もありました。しばらく設定変えてないサービスのコンソールを久々に開いたら…あ! 画面が今っぽくなってる!ってのも多い。お知らせメール見ても溜息出る。どんどん便利に楽しくなっていく感じがいいですねー。

一方、これ追い続けられるのか…という不安を覚えるのも正直なところです。
まぁクラウドですから、サービス終了、更新、移行…などなどに伴う組み直しもそのうち発生するでしょう。他社サービスや基礎技術も含めて、できる範囲でちょこちょこ眺めておこうと思う次第です。

RecentPost