Como conectarse a un cluster ElastiCache-Redis desde la CLI, Python 3.8 y a través de una Función Lambda.

ElastiCache-Redis usando Python 3.8 (Cloud9)

Paso 1 — Crear una instancia de Cloud9

Cloud9 es un IDE en la nube que trae todas las librerías de AWS y la CLI pre instalada, para eso desplegamos uno de esos con todas las configuraciones por defecto. Se debe tener en cuenta es que se debe autorizar desde el security group del cluster una Inbound Rule desde el security group del Cloud9 por el puerto 6379.

Paso 2a — Código Python 3.8 (lib rediscluster)

Crear un archivo redislab.py y cargar el siguiente código que explicaremos paso a paso:

from rediscluster import RedisClusterstartup_nodes = [{"host": "Configuration_Endpoint", "port": "6379"}]rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True, skip_full_coverage_check=True)
  • startup_nodes: Se debe especificar el endpoint y el puerto del cluster al cual vamos a conectarnos.
  • rc: Se configura la conexión al cluster de redis.
czambrano:~/environment $ python3Python 3.6.10 (default, Feb 10 2020, 19:55:14) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from rediscluster import RedisCluster
>>> startup_nodes = [{"host": "Configuration_Endpoint", "port": "6379"}]
>>> rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True, skip_full_coverage_check=True)
>>> print (rc.dbsize())
{'172.31.3.40:6379': 1, '172.31.32.148:6379': 1, '172.31.51.11:6379': 1, '172.31.53.87:6379': 0, '172.31.91.101:6379': 0, '172.31.24.239:6379': 0, '172.31.94.73:6379': 0, '172.31.30.20:6379': 0, '172.31.37.59:6379': 0}
>>>

Paso 2b — Código Python 3.8 (lib redis)

import redisREDIS_URL = "Primary_Endpoint"
REDIS_STANDARD_VALIDATION = 0
REDIS_OBJECT = redis.StrictRedis(host=REDIS_URL, port=6379, db=REDIS_STANDARD_VALIDATION)
  • REDIS_URL: es el endpoint del cluster de ElastiCache. Cuando se crea en mode enabled el endpoint es el Primary_Endpoint.
  • REDIS_STANDARD_VALIDATION: Es el número de la base de datos, recuerden que por defecto en el parameter group la cantidad de base de datos es 16 (0 a 15). En este valor establecemos en este caso la primer base de datos disponible, la número 0.
  • REDIS_OBJECT: Acá se crea la conexión al cluster.
>>> print (REDIS_OBJECT.dbsize())
0

ElastiCache-Redis usando CLI (Cloud9)

Para conectarnos utilizando la CLI debemos ejecutarlos siguientes comandos en una terminal bash de Cloud9 (Basada en AMI Linux):

sudo yum install gcc
wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make
czambrano:~/environment/redis-stable $ src/redis-cli -c -h Configuration_Endpoint -p 6379Configuration_Endpoint>
Configuration_Endpoint> set 1 "mi primer llave"
-> Redirected to slot [9842] located at 172.31.94.73:6379
OK
Configuration_Endpoint> get 1
"mi primer llave"

ElastiCache-Redis usando Función Lambda (Python)

Para conectarnos desde una función lambda a un cluster de ElastiCache-Redis es necesario que la función se encuentre en una VPC y salga a internet. Desde el SG del ElastiCache se debe autorizar como origen el SG de la función lambda por el puerto 6379.

  • Runtime: Python 3.8
  • Rol: La lambda debe tener un role que tenga permisos sobre cloudwatch y ElastiCache.
  • VPC: La función lambda debe estar en una VPC para poderse conectar al cluster de ElastiCache.
  • Lambda Layer: Se debe crear una lambda layer con las librerías de Redis requeridas y se adiciona a la lambda. Desde el Cloud9 ejecutamos los siguientes comandos para crear la lambda layer y cargarla a AWS.
cd $HOME
mkdir -p temp/python
cd temp/python
pip install redis -t .
cd ..
zip -r9 ../utils_layer.zip .
aws lambda publish-layer-version --layer-name lambda_utils --description "added unsoported libs redis" --zip-file fileb://../utils_layer.zip --compatible-runtimes python3.6 python3.7 python3.8 --region us-east-1
import json
import redis
import os
REDIS_URL = os.environ['REDIS_URL']
REDIS_STANDARD_VALIDATION = os.environ['REDIS_STANDARD_VALIDATION']
REDIS_OBJECT = redis.StrictRedis(host=REDIS_URL, port=6379, db=REDIS_STANDARD_VALIDATION)
def lambda_handler(event, context):
value = event['key1']
set_key_value("llave", value)
def set_key_value(key, value):
REDIS_OBJECT.set(key, value)
REDIS_URL = os.environ['REDIS_URL']
REDIS_STANDARD_VALIDATION = os.environ['REDIS_STANDARD_VALIDATION']

Ejecutando nuestra Función Lambda

Para probar nuestra función Lambda, configuramos un test que mande un json de la siguiente forma:

{
"key1": "value1"
}
import json
import redis
import os
REDIS_URL = os.environ['REDIS_URL']
REDIS_STANDARD_VALIDATION = os.environ['REDIS_STANDARD_VALIDATION']
REDIS_OBJECT = redis.StrictRedis(host=REDIS_URL, port=6379, db=REDIS_STANDARD_VALIDATION)
def lambda_handler(event, context):
value = event['key1']
set_key_value("llave", value)
get_key_value("llave")
def set_key_value(key, value):
REDIS_OBJECT.set(key, value)
def get_key_value(key):
tc = REDIS_OBJECT.get(key)
print (tc)

Recomendaciones Finales

  • Siempre verificar los permisos del rol de la lambda y el rol de la instancia de cloud9.
  • Existen diferentes librerías de redis para conectarnos, las que vimos en el post son las más utilizadas.
  • AWS formalmente no da soporte sobre estas librerías de terceros, al indagar un poco más para que permitan la conexión a un cluster mode enabled con cifrado en tránsito obtuvimos esta respuesta del soporte de AWS: Since the module is being developed and maintained by third party, I don’t have any visibility on how exactly it works. At this point, I would encourage you to reach out to the respective developer or post your queries on the discussion forum to seek their assistance.
  • Tengan en cuenta en su arquitectura que la Lambda debe estar en una VPC, por lo tanto tendrá un SG asignado.
  • Verifiquen que el cluster de ElastiCache en su SG permita los SG de la Lambda y de la instancia de Cloud9 por el puerto 6379.

--

--

AWS x10, Tech Director en Globant con más de 7 años de experiencia en AWS.

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Carlos Andres Zambrano Barrera

Carlos Andres Zambrano Barrera

146 Followers

AWS x10, Tech Director en Globant con más de 7 años de experiencia en AWS.