¡Bienvenido al Día 4 de 12 Días de DigitalOcean! Ayer, agregamos notificaciones SMS de Twilio a nuestro Servicio de Recordatorio de Cumpleaños, haciéndolo capaz de enviar mensajes de texto para los cumpleaños de hoy. 🎂
Hoy, llevaremos las cosas al siguiente nivel desplegando nuestro script en DigitalOcean Functions. Esto permite que nuestro servicio se ejecute en la nube sin la necesidad de un servidor dedicado, haciendo que nuestra aplicación sea ligera, escalable y lista para la automatización.
Con esta configuración, recibirás recordatorios de cumpleaños incluso cuando tu computadora esté apagada o no esté conectada a internet; ya no es necesario ejecutar el script manualmente en tu máquina. 🎉
✨ ¿Por qué DigitalOcean Functions?
A veces, todo lo que necesitas es un script simple que se ejecute ocasionalmente. Administrar la infraestructura para algo así puede ser excesivo. Ahí es donde entran Funciones. Es una plataforma sin servidor, lo que significa que puedes implementar código que se ejecuta solo cuando es necesario, y solo pagas por lo que usas. Perfecto para nuestro caso de uso: verificar cumpleaños y enviar recordatorios diariamente.
🚀 Lo que Aprenderás
Al final de hoy, sabrás cómo:
- Configurar la herramienta
doctl
CLI de DigitalOcean. - Crear y conectarte a un espacio de nombres sin servidor (la forma de DigitalOcean de mantener organizadas las funciones).
- Empaquetar e implementar tu Servicio de Recordatorio de Cumpleaños en Funciones de DigitalOcean.
- Probar tu función implementada en la nube.
🛠 Lo que Necesitarás
Antes de comenzar, asegúrate de tener:
- Una cuenta de DigitalOcean.
- Un archivo
.env
con tus credenciales de base de datos PostgreSQL y credenciales de Twilio
🧑🍳 Receta para el Día 4: Desplegando en DigitalOcean Functions
Paso 1: Configurar la CLI doctl
Si ya has configurado doctl en tu máquina, puedes omitir este paso. Para aquellos que necesitan configurarlo, sigue estas instrucciones:
Antes de empezar, hablemos brevemente sobre doctl
. Es la herramienta de interfaz de línea de comandos oficial de DigitalOcean que te permite gestionar tus recursos en la nube directamente desde tu terminal. La utilizaremos para crear un espacio de nombres (una carpeta para nuestras funciones serverless), desplegar nuestro script de Python y probar la función.
Configurarlo es sencillo:
-
Instala
doctl
: Sigue la guía de instalación para tu sistema operativo. -
Autentica
doctl
: Conéctalo a tu cuenta de DigitalOcean ejecutando: -
Verifica la instalación: Asegúrate de que todo funcione correctamente ejecutando:
Si tienes éxito, este comando devolverá detalles sobre tu cuenta de DigitalOcean, como tu correo electrónico y ID de cuenta.
Paso 2: Instalar el software Serverless
Las Funciones de DigitalOcean requieren soporte de software serverless, que necesitarás instalar. Esto es una configuración única, por lo que una vez instalado, no necesitarás hacerlo nuevamente para proyectos futuros.
Ejecuta el siguiente comando:
Puedes verificar el estado de la instalación con:
Si ves un error como:
No te preocupes, eso solo significa que aún no hemos creado o conectado a un espacio de nombres. Nos encargaremos de eso en el siguiente paso.
Paso 3: Crear y Conectar a un Espacio de Nombres
Los espacios de nombres son como carpetas para organizar funciones sin servidor. Vamos a crear uno para nuestro Servicio de Recordatorio de Cumpleaños:
-
Crea un nuevo espacio de nombres:
-
Conéctate al espacio de nombres:
-
Verifica la conexión:
Ahora deberías ver una confirmación de que estás conectado al espacio de nombres.
Consejo Profesional: Para ver una lista de todos los espacios de nombres disponibles, utiliza el siguiente comando:
Esto puede ser útil si estás gestionando múltiples proyectos o si deseas verificar el espacio de nombres que acabas de crear.
Paso 4: Inicializa y Configura la Estructura del Proyecto
DigitalOcean Functions espera una estructura de proyecto específica para implementaciones sin servidor. Puedes iniciar esta estructura usando doctl serverless init
, crearla manualmente, o incluso clonar un repositorio de inicio. Para mantener las cosas simples, lo configuraremos usando doctl serverless init
:
-
Ejecuta el siguiente comando para inicializar el proyecto:
Esto crea un directorio de proyecto local llamado
my-birthday-reminder-service
con la siguiente estructura predeterminada: -
Navegar al directorio del proyecto:
-
Renombrar las carpetas para que coincidan con nuestro caso de uso:
-
Crea los archivos necesarios:
- Crea un archivo .env vacío en la raíz del proyecto:
Este archivo contendrá tus credenciales de base de datos y Twilio. El archivo estará ubicado en la raíz de la carpeta
my-birthday-reminder-service
.- Crea un archivo
requirements.txt
en la carpetabirthdays
:
Este archivo enumerará las dependencias de Python necesarias para tu función. Estará ubicado bajo
packages/reminders/birthdays
.- Crea un archivo build.sh en la carpeta birthdays:
El script
build.sh
es necesario para desplegar funciones con dependencias externas. El comandochmod
asegura que el script sea ejecutable en sistemas Mac/Linux.
Estructura Actualizada: Después de completar estos pasos, la estructura de tu proyecto debería verse así:
Consejo Profesional: Si accidentalmente cambias el nombre de una carpeta, puedes ejecutar el comando nuevamente o renombrarla manualmente en tu explorador de archivos.
Paso 5: Actualiza Archivos
Ahora que la estructura está en su lugar, vamos a poblarla con los archivos necesarios. Abre el directorio my-birthday-reminder-service en tu editor de código favorito.
1. Actualizar project.yml
El archivo project.yml
es un archivo de configuración que define la estructura de su proyecto sin servidor, las variables de entorno y las funciones. Reemplace su contenido con:
Este archivo configura el paquete de recordatorios y mapea las variables de entorno a las Funciones de DigitalOcean. Cada variable corresponde a las credenciales necesarias para su base de datos y la integración con Twilio.
2. Actualizar su archivo .env
Consulte Día 1: Configuración de una base de datos PostgreSQL para recordatorios de cumpleaños para las credenciales de la base de datos y Día 3: Comprobación de cumpleaños y envío de notificaciones SMS para las credenciales de Twilio para completar los siguientes valores:
Nota: El archivo .env
se utiliza para almacenar de forma segura credenciales sensibles. Estos valores serán leídos por tu archivo project.yml
y mapeados al entorno sin servidor durante la implementación, haciéndolos accesibles para tu función en la nube.
3. Agregar Dependencias
Actualiza el archivo requirements.txt
con las siguientes dependencias:
pg8000
: Una biblioteca de cliente PostgreSQL pura en Python.
python-dotenv
: Utilizada para cargar variables de entorno desde el archivo .env
.
twilio
: La biblioteca de Twilio para Python para enviar mensajes SMS.
4. Actualizar build.sh
Agrega el siguiente script al archivo build.sh
:
Este script asegura que todas las dependencias estén empaquetadas correctamente con tu función. El comando chmod +x
del Paso 4 asegura que sea ejecutable.
5. Actualizar __main__.py
Este es el script principal para tu Servicio de Recordatorio de Cumpleaños. Esencialmente estamos utilizando el script que construimos en el Día 3 para enviar notificaciones de cumpleaños. Sin embargo, para hacerlo compatible con las Funciones de DigitalOcean, necesitamos hacer algunos pequeños ajustes.
Actualiza el archivo __main__.py
con el siguiente contenido:
Aquí están los cambios que hemos realizado:
-
Se agregó una función
main(params)
: DigitalOcean Functions espera una función de punto de entrada llamadamain
, que toma un argumentoparams
. Aquí es donde comienza la ejecución de la función. -
Se movió la lógica del script dentro de la función
main
:
El código del Día 3 se ha envuelto dentro de la funciónmain
para cumplir con este requisito. -
Todo lo demás permanece igual:
La lógica de conexión a la base de datos, las verificaciones de cumpleaños y la lógica de notificación por SMS no han cambiado.
Paso 5: Empaquetar y Desplegar
Con todo en su lugar, despliega tu proyecto en DigitalOcean Functions:
- Desplegar el proyecto:
Para verificar que tu función se ha desplegado correctamente en el espacio de nombres:
- Visita el Panel de Control de DigitalOcean y navega a Functions en la barra lateral izquierda.
- Ubica tu espacio de nombres (por ejemplo, my-birthday-reminder-namespace).
- Verifica que tu función aparezca bajo el espacio de nombres, típicamente listada como
reminders/birthdays
. - Haz clic en el nombre de la función para ver detalles, incluyendo registros, configuración e historial de invocaciones.
Paso 6: Prueba tu Función Desplegada
Una vez que tu función esté desplegada, es hora de probarla. Puedes invocar la función manualmente para asegurarte de que funciona como se espera. Hay dos formas de hacerlo:
Opción 1: Usando la CLI de DigitalOcean
Si todo está configurado correctamente, tu función se ejecutará en la nube, verificando los cumpleaños de hoy y enviando notificaciones por SMS.
Opción 2: Usando el Panel de Control de DigitalOcean
- Ve al Panel de Control de DigitalOcean.
- Navega a Funciones y localiza tu función de recordatorios/cumpleaños.
- Haz clic en Ejecutar para ejecutarla manualmente.
- Visualiza la salida y los registros directamente en la consola.
Este método es especialmente útil si prefieres una interfaz visual o quieres verificar los registros en un formato limpio y fácil de leer.
Consejos de Pruebas
Cuando invoques la función, comprobará si hay cumpleaños que coincidan con la fecha de hoy. Si hay una coincidencia, recibirás un mensaje de texto con los detalles. Para probar la función de manera efectiva:
- Agrega uno o más cumpleaños en tu base de datos que coincidan con la fecha actual.
- Verifica la consola o los registros de CLI para confirmar que la función se ejecutó correctamente.
🎁 Resumen
Aquí está lo que logramos hoy:
✅ Configuramos doctl
y creamos un espacio de nombres para nuestro proyecto.
✅ Refactorizamos el script de Python para su implementación.
✅ Empaquetamos e implementamos el Servicio de Recordatorio de Cumpleaños en DigitalOcean Functions.
✅ Probamos la función en la nube utilizando tanto la CLI como el Panel de Control de DigitalOcean.
Próximamente: Aunque este es un gran paso adelante, todavía estamos ejecutando la función manualmente. En la próxima publicación, automatizaremos este proceso para que el Servicio de Recordatorio de Cumpleaños se ejecute automáticamente todos los días a una hora específica. Imagina despertarte con un recordatorio por mensaje de texto sin mover un dedo—¡hagamos que eso suceda mañana! 🚀