Sesion iex remota


Introducción

trickster

En caso de que te lo preguntes, la imagen está pensada para representar al trickster, ya que planeo hacer muchas publicaciones sobre tips y trucos.


En caso de que te lo preguntes, la imagen fue generada utilizando Gemini, así que básicamente, a veces necesitas ejecutar un script o validar alguna información en tu entorno productivo. Mientras que conectarse directamente a la base de datos es a veces una opción, debería desalentarse. En la mayoría de los casos, querés interactuar con tu base de datos desde código que fue probado y preparado para ciertos escenarios, pero a veces ese código no está fácilmente disponible, por lo que necesitas un terminal para poder ejecutarlo. ¿Pero cómo podemos hacer eso en el mundo de Elixir / BEAM?


Tené en cuenta que, aunque esto es una opción, siempre deberías tratar de usar migraciones o alguna forma automatizada y probada si es posible. En un artículo posterior exploraremos cómo hacer eso con cron jobs en Kubernetes.


¿Opciones?

  • Port-forward a la instancia o clúster de producción.
  • Desde una de las máquinas o pods (si usás Kubernetes).

Probablemente haya muchas más opciones, pero exploraremos estas dos.


Port-forward

En este escenario, usaremos nuestra stack local para conectarnos a las instancias o clúster remoto. ¿Cómo hacemos eso? Suponiendo que el port-forward está resuelto o tenés una lista blanca de IPs en su lugar, en Kubernetes lo podemos hacer así. Primero, validemos que podemos alcanzar las instancias remotas:

 epmd -names
epmd: up and running on port 4369 with data:
name rem-1ed8-tr at port 35229
name tr at port 44091

Luego, necesitarás el cookie para conectarte al clúster, lo podés obtener de tus variables de entorno o secretos. El cookie se usa como mecanismo de agrupación en lugar de una contraseña en un clúster BEAM. Una vez hecho esto, podés conectarte así:

ssh user@remote -L4369:localhost:4369 -L44091:localhost:44091

Tené en cuenta que necesitás usar el puerto de la app/nodo al que querés conectarte.

En Kubernetes necesitarías dos comandos de port-forward:

kubectl -n tr port-forward pod/tr-xxxx 4369:4369 &
kubectl -n tr port-forward pod/tr-xxxx 44091:44091 &

Finalmente, la shell local:

iex --name local@127.0.0.1 --cookie my_cookie --remsh tr@127.0.0.1

Nota: si no recordás tu cookie o no la encontrás en tu entorno, conectate a cualquier nodo y ejecutá Node.get_cookie().


Luego podés ejecutar la app :observer.start() con ese comando, o cualquier módulo que esté cargado en el clúster. Aunque esto es divertido y todo, es demasiado complejo y tiene muchas desventajas, por lo que mi recomendación es quedarte con el segundo método, que es más seguro, tiene menos dependencias y es mucho más simple de usar.


Importante

Tené en cuenta que hay implicaciones de seguridad al conectarse a través de port-forward, ya que tu máquina será parte del clúster (esto se puede mitigar usando un contenedor Docker, por ejemplo), pero de lo contrario, cualquier otra persona conectada al clúster podría obtener acceso completo a tu máquina, por lo que usá esto solo como último recurso.

Podés leer más en este excelente artículo.


Máquina o pod remoto

Este escenario asume que tenés acceso al entorno donde se está ejecutando la aplicación. Es realmente simple en este caso, asumiendo que podés saltar al host. Por ejemplo:

 kubectl -n tr exec -ti tr-xxxx -- /app/bin/tr remote
Erlang/OTP 26 [erts-14.2.1] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1] [jit]

Interactive Elixir (1.16.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(tr@10.42.0.17)2> Enum.count(Tr.Blog.posts)
49

Si estás usando los archivos de release que se pueden generar con los helpers de Phoenix (mix phx.gen.release --docker y mix release.init), entonces el entrypoint de tu app estará ubicado en /app/bin/app_name, en este caso tr. Luego, usando remote, podemos obtener una shell de iex y interactuar con nuestros módulos.

Si estuvieras en un entorno de máquina virtual, simplemente eliminá todo lo anterior a -- y usá ssh en su lugar.

¿Tenés alguna pregunta? Dejá un comentario 👇


Notas finales

Nunca expongas epmd a internet, ni el puerto aleatorio de tu nodo. En su lugar, usá SSH o un host en la red de destino. De esta manera, es más fácil aislar la carga de trabajo y evitar sorpresas no deseadas. Espero que te haya sido útil, como lo fue para mí.


Errata

Si encontrás algún error o tenés alguna sugerencia, mandame un mensaje para que se pueda corregir.

También podés revisar el código fuente y los cambios en los sources aquí.



No tienes cuenta? Regístrate aqui

Ya registrado? Iniciar sesión a tu cuenta ahora.

Iniciar session con GitHub
Iniciar sesion con Google
  • Comentarios

    Online: 0

Por favor inicie sesión para poder escribir comentarios.

by Gabriel Garrido