以下のように読みやすく整形しました。Qiitaや社内ナレッジ用としてそのまま使える形です。
🐘 Laravel + Redis Serverless で接続エラーになった話(Predis)
導入
Supervisorのプロセスの再接続回数(startretries
)を増やした影響確認のため、テスト用のRedis Serverless(ElastiCache) を作成しました。
ところが…
作成したRedisに接続できず、永遠にECSタスクのデプロイが終わらない自体に。
VPC設定もセキュリティグループも正しく設定したはずなのに、なぜ…?
発生したエラー(CloudWatch Logs)
Predis\Connection\ConnectionException
Error while reading line from the server.
[tcp://host:port]
原因
Redis Serverless では 転送中の暗号化(in-transit encryption) が常に有効になっており、
TLS接続が必須 です。
にもかかわらず、Predisが平文(非TLS)で接続しようとしていたため、接続失敗。
📎 公式ドキュメント
https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/dg/in-transit-encryption.html
これまで動いていた理由
従来使っていたのは「クラスターモードのElastiCache Redis(暗号化なし)」であり、
非TLS(平文)でも問題なく接続できていたため、Serverlessの仕様で初めてTLS制限に引っかかったという流れです。
解消方法(Predis)
Laravelの config/database.php
にて、Predisの接続方式を明示的にTLSに変更する必要があります。
'redis' => [
'client' => 'predis',
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'parameters' => [
'scheme' => 'tls', // 👈 ここが重要
],
],
'default' => [
'host' => env('REDIS_HOST'),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
],
],
.env
に定義してもscheme
はPredisでは効かないため、必ずoptions.parameters
に書くこと!
まとめ
-
Redis Serverless は 常にTLS接続が必須
-
Laravel + Predis を使う場合は、以下のように設定しないと接続エラーになる:
'parameters' => [ 'scheme' => 'tls' ]
-
クラシックなRedisでは平文でもつながるため、Serverlessに切り替えたとき初めて気づく落とし穴でした。