Saltar al contenido

AWS ElastiCache Redis no se puede conectar desde Laravel nad desde redis-cli

Esta es el arreglo más completa que encomtrarás brindar, pero estúdiala detenidamente y analiza si se puede adaptar a tu proyecto.

Solución:

Sé que esto es bastante antiguo, pero yo mismo estaba teniendo el mismo problema. Si alguien encuentra este problema, vea la solución aquí y aquí.

Parece que cuando habilitas Encryption in-transit en AWS Elasticache le impide usar redis-cli ya que no admite conexiones TLS. Cambiar a otro cliente debería funcionar. Esta respuesta tiene una lista de clientes habilitados para TLS.

Editar:

Investigué un poco más y descubrí que usar stunnel puede envolver su conexión de redis-cli con ssl. Aquí tienes una guía para hacerlo.

Relacionado: Laravel + Redis Cache a través de SSL?

A lo que he respondido aquí: https://stackoverflow.com/a/48876398/663058

Detalles relevantes a continuación:

Ya que tienes agrupamiento y TLS, entonces necesitará una configuración completamente diferente:

'redis' => [
        'client' => 'predis',
        'cluster' => env('REDIS_CLUSTER', false),

        // Note! for single redis nodes, the default is defined here.
        // keeping it here for clusters will actually prevent the cluster config
        // from being used, it'll assume single node only.
        //'default' => [
        //    ...
        //],

        // #pro-tip, you can use the Cluster config even for single instances!
        'clusters' => [
            'default' => [
                [
                    'scheme'   => env('REDIS_SCHEME', 'tcp'),
                    'host'     => env('REDIS_HOST', 'localhost'),
                    'password' => env('REDIS_PASSWORD', null),
                    'port'     => env('REDIS_PORT', 6379),
                    'database' => env('REDIS_DATABASE', 0),
                ],
            ],
            'options' => [ // Clustering specific options
                'cluster' => 'redis', // This tells Redis Client lib to follow redirects (from cluster)
            ]
        ],
        'options' => [
            'parameters' => [ // Parameters provide defaults for the Connection Factory
                'password' => env('REDIS_PASSWORD', null), // Redirects need PW for the other nodes
                'scheme'   => env('REDIS_SCHEME', 'tcp'),  // Redirects also must match scheme
            ],
            'ssl'    => ['verify_peer' => false], // Since we dont have TLS cert to verify
        ]
    ]

Explicando lo anterior:

  • 'client' => 'predis': Esto especifica el controlador PHP Library Redis que se va a usar (predis).
  • 'cluster' => 'redis': Esto le dice a Predis que asuma la agrupación en clústeres del lado del servidor. Lo que solo significa “seguir redireccionamientos” (p. ej. -MOVED respuestas). Cuando se ejecuta con un clúster, un nodo responderá con un -MOVED al nodo que debe solicitar una determinada key.
    • Si no tiene esto habilitado con Redis Clusters, Laravel lanzará un -MOVED excepción 1/norte veces, norte siendo la cantidad de nodos en el clúster de Redis (tendrá suerte y preguntará al nodo correcto de vez en cuando)
  • 'clusters' => [...]: especifica una lista de nodos, pero establecer solo un ‘predeterminado’ y apuntarlo al ‘Punto final de configuración’ de AWS le permitirá encontrar cualquier/todos los demás nodos dinámicamente (recomendado para Elasticache, porque no sabe cuándo llegarán los nodos) o yendo’).
  • 'options': para Laravel, se puede especificar en la opción de nivel superior, nivel de clúster y nodo. (se combinan en Illuminate antes de pasar a Predis)
  • 'parameters': Estos ‘anulan’ las configuraciones/suposiciones de conexión predeterminadas que Predis usa para las nuevas conexiones. Dado que los configuramos explícitamente para la conexión ‘predeterminada’, estos no se utilizan. Pero para una configuración de clúster, son fundamentales. Un nodo ‘maestro’ puede devolver una redirección (-MOVED) y a menos que los parámetros estén configurados para password y scheme asumirá los valores predeterminados y esa nueva conexión al nuevo nodo fallará.

Si está utilizando predis como cliente.

Luego puede cambiar la conexión de Redis en config/database.php

'redis' => [
        'client' => 'predis',
        'default' => [
            'scheme' => 'tls',
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
        ],
    ],

Puede agregar ‘esquema’ en eso.

Estoy usando Laravel 5.8 Y luego todo funciona muy bien dentro de Laravel.

Pero sí, como Redis no proporciona una conexión TLS, redis-cli seguirá sin funcionar.

Comentarios y puntuaciones de la guía

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *