12 Días de DigitalOcean (Día 5) – Automatización de Recordatorios de Cumpleaños con Disparadores Diarios

¡Bienvenido al Día 5 de 12 Días de DigitalOcean! Ayer, configuraste tu Servicio de Recordatorio de Cumpleaños para que se ejecute en DigitalOcean Functions, lo que significa que ahora es sin servidor y listo para la nube. 🎉 Hoy, darás un paso más al automatizarlo para que funcione según su propio horario—sin necesidad de intervención manual.

Al final de esta guía, tu servicio (o cualquier otra función en la que estés trabajando) se ejecutará automáticamente a una hora establecida todos los días. Eso significa que no tendrás que recordar activarlo tú mismo—simplemente funcionará.

¿Por qué Automatizar?

Implementar tu función en la nube fue un gran logro ayer, pero tener que ejecutarla manualmente anula el propósito de la automatización. El enfoque de hoy es programar el servicio para que se ejecute automáticamente—como un reloj—para que puedas configurarlo y olvidarte de ello. DigitalOcean Functions tiene programación integrada utilizando Disparadores para este propósito exacto, y tienes dos formas de configurarlo.

🚀 Lo que aprenderás

Al final del día de hoy, sabrás cómo:

  1. Configurar un disparador diario para ejecutar tu función automáticamente.
  2. Aprender dos formas de hacer esto: a través del Panel de Control de DigitalOcean o con la CLI doctl y project.yml.
  3. Probar la configuración para asegurarte de que funcione.

🛠 Lo que necesitarás

Antes de comenzar, asegúrate de tener lo siguiente:

  1. Una función ya desplegada en DigitalOcean (por ejemplo, el Servicio de Recordatorio de Cumpleaños de Día 4: Construyendo un Servicio de Recordatorio de Cumpleaños) para automatizar con disparadores.
  2. Si estás utilizando la CLI doctl, necesitarás el archivo project.yml para tu función. Puedes consultar Día 4 para obtener instrucciones sobre cómo instalar y configurar la CLI doctl, y cómo crear el archivo project.yml.

🧑‍🍳 Receta para el Día 5: Automatización de Funciones con Disparadores

Paso 1: Configura un Disparador para Tu Función

DigitalOcean te da dos opciones para configurar disparadores:

  1. Opción 1: Usa el Panel de Control para una configuración rápida y sencilla.
  2. Opción 2: Usa la CLI doctl para un control más robusto y programático.

Advertencia: Recuerda que los disparadores creados en el Panel de Control se pierden si vuelves a implementar la función utilizando la CLI. Si vas a volver a implementar a menudo, utiliza Opción 2 para añadir disparadores directamente al archivo project.yml.

Opción 1: Usar el Panel de Control para Crear un Disparador

La forma más sencilla de configurar un disparador es a través del Panel de Control de DigitalOcean. Es rápido, no requiere configuración, y es ideal para configuraciones simples y únicas.

  • Navega a la página principal de Funciones en el panel de control de DigitalOcean.
  • Busca tu función (por ejemplo, reminders/birthdays) y haz clic en la pestaña Disparadores.

  • Haz clic en Crear Disparador, añade un Nombre para tu disparador. Esto puede ser cualquier cosa descriptiva, como daily-birthday-trigger. El nombre debe contener solo caracteres alfanuméricos, guiones y puntos.
  • Añade una expresión cron para establecer el horario. Por ejemplo, 0 9 * * * significa que la función se ejecutará todos los días a las 9:00 AM.

Nota: ¿No estás seguro de cómo funciona cron? Consulta crontab.guru para una guía útil.

  • Guarda el disparador.

Una vez que hayas creado tu disparador, es una buena idea probarlo para asegurarte de que todo funcione como se espera. Salta a la sección Prueba la Automatización a continuación para aprender cómo.

Advertencia: Aunque el panel de control es simple y efectivo, cualquier desencadenador que crees aquí será sustituido o eliminado si vuelves a implementar la función utilizando la CLI. Para actualizaciones frecuentes o implementaciones programáticas, salta a Opción 2.

Opción 2: Usando la doctl CLI con project.yml

También puedes crear desencadenadores añadiéndolos directamente a tu archivo project.yml. Este método es más confiable para reimplementaciones frecuentes porque asegura que tus desencadenadores siempre estén incluidos en la configuración de la función. A diferencia de la opción del Panel de Control descrita anteriormente, este enfoque evita que los desencadenadores sean sustituidos o perdidos durante las reimplementaciones.

A continuación se muestra cómo puedes configurarlo:

  • Abre tu archivo project.yml de Día 4: Despliegue de Notificaciones de Cumpleaños con DigitalOcean Functions. Puede verse algo así:

    packages:
      - name: reminders
        shared: false
        environment:
          DO_DB_NAME: "${DB_NAME}"
          DO_DB_USER: "${DB_USER}"
          DO_DB_PASSWORD: "${DB_PASSWORD}"
          DO_DB_HOST: "${DB_HOST}"
          DO_DB_PORT: "${DB_PORT}"
          TWILIO_ACCOUNT_SID: "${TWILIO_ACCOUNT_SID}"
          TWILIO_AUTH_TOKEN: "${TWILIO_AUTH_TOKEN}"
          TWILIO_PHONE_FROM: "${TWILIO_PHONE_FROM}"
          TWILIO_PHONE_TO: "${TWILIO_PHONE_TO}"
        functions:
          - name: birthdays
            runtime: python:default
    
  • Agrega una sección triggers a la configuración de tu función para definir el horario:

    triggers:
      - name: daily-birthday-trigger
        sourceType: scheduler
        sourceDetails:
        cron: "0 9 * * *"
    
  • Archivo project.yml final actualizado:

    packages:
      - name: recordatorios
        shared: false
        environment:
          DO_DB_NAME: "${DB_NAME}"
          DO_DB_USER: "${DB_USER}"
          DO_DB_PASSWORD: "${DB_PASSWORD}"
          DO_DB_HOST: "${DB_HOST}"
          DO_DB_PORT: "${DB_PORT}"
          TWILIO_ACCOUNT_SID: "${TWILIO_ACCOUNT_SID}"
          TWILIO_AUTH_TOKEN: "${TWILIO_AUTH_TOKEN}"
          TWILIO_PHONE_FROM: "${TWILIO_PHONE_FROM}"
          TWILIO_PHONE_TO: "${TWILIO_PHONE_TO}"
        functions:
          - name: cumpleaños
            runtime: python:default
            triggers:
              - name: diario-cumpleaños-disparador
                sourceType: programador
                sourceDetails:
                  cron: "0 9 * * *"
    

    Esto indica a DigitalOcean que ejecute la función cumpleaños todos los días a las 9:00 AM.

    1. triggers sección: Define el nombre, tipo y horario para el disparador. Puedes nombrar tu disparador con cualquier cosa descriptiva, como diario-cumpleaños-disparador.

    2. cron: Especifica la hora a la que la función se ejecutará diariamente en UTC. La expresión cron 0 9 * * *, por ejemplo, programa la función para que se ejecute todos los días a las 9:00 AM.

  • Guarda el archivo y despliega ejecutando el siguiente comando desde el directorio que contiene la carpeta my-birthday-reminder-service:

    doctl serverless deploy my-birthday-reminder-service
    

    Importante: Asegúrate de ejecutar el comando desde el directorio padre, no dentro de la carpeta my-birthday-reminder-service. Ejecutarlo desde la ubicación incorrecta puede resultar en un error como este:

    ❯ doctl serverless deploy my-birthday-reminder-service
    Error: ENOENT: no such file or directory, lstat
    
  • Una vez que el despliegue sea exitoso, verás un mensaje de confirmación similar a este:

    Funciones desplegadas
      - recordatorios/cumpleaños
    Desencadenadores desplegados:
      - desencadenador-diario-cumpleaños
    

  • Ve a tu panel de control para verificar que el disparador ha sido creado en la sección de Funciones.

Consejo Profesional: Para probar tu disparador, establece temporalmente la expresión cron a unos minutos a partir de ahora (por ejemplo, 28 9 * * * si son las 9:25 AM). Después de confirmar que funciona, actualízalo de nuevo a tu horario previsto y vuelve a implementar.

Paso 2: Prueba la Automatización

Probemos tus disparadores para asegurarnos de que están funcionando. En lugar de esperar a que se activen en su horario habitual, puedes establecerlos temporalmente para que se ejecuten unos minutos a partir de ahora. Aquí te explicamos cómo hacerlo:

  • Establece la expresión cron para tu disparador a unos minutos a partir de la hora actual (en UTC). Por ejemplo, si son las 9:25 AM UTC, establece la expresión cron a 28 9 * * * para que la función se ejecute a las 9:28 AM UTC.

    Nota: ¿No estás seguro de cómo convertir tu hora local a UTC? Herramientas como Convertidor de Zona Horaria pueden ayudar.

  • Guarda el desencadenador actualizado (si usas el Panel de Control) o vuelve a desplegar tu archivo project.yml actualizado (si usas la CLI):

    doctl serverless deploy my-birthday-reminder-service
    
  • Espera a que se ejecute el desencadenador, luego verifica los registros de activación para confirmar que la función se ejecutó correctamente:

    doctl serverless activations logs --function reminders/birthdays --last
    

Nota: Los registros de activación registran detalles sobre cuándo se ejecutó tu función, incluyendo si se ejecutó correctamente o si encontró errores. Son una forma útil de verificar que tu disparador se activó a la hora programada.

Este comando devolverá los detalles de la activación más reciente de tu función. Por ejemplo, podrías ver algo como esto:

=== 59e8e4f482874d79a8e4f48287dd79ef success 12/23 07:46:33 reminders/birthdays:0.0.6
2024-12-23T07:46:33.323205805Z stdout: Message sent for Charlie Brown. Message SID: SM85f5caeb3ec09239e0d8bdaaba2b158b

¡Esto confirma que el disparador se activó y la función fue activada con éxito! 🎉

Nota: Una vez que hayas verificado que todo funciona, actualiza la expresión cron a tu horario previsto (por ejemplo, 0 9 * * * para las 9:00 AM UTC diarias) y guarda o vuelve a desplegar.

Una breve nota sobre los registros

Si bien el comando registros de activaciones es una excelente manera de verificar ejecuciones recientes, a veces necesitarás registros más detallados para depurar o investigar problemas con tu función. DigitalOcean también ofrece opciones para reenvíar estos registros a servicios de registro externos, facilitando el monitoreo y la solución de problemas de tu aplicación con el tiempo.

En el Día 6, aprenderás a ver los registros directamente, interpretarlos de manera efectiva y configurar el reenvío de registros a servicios externos como Logtail o Papertrail. Estas herramientas te ayudarán a mantenerte fácilmente al tanto del rendimiento de tu función.

🎁 Resumen

Esto es lo que lograste hoy:

  1. Automatizaste tu Servicio de Recordatorio de Cumpleaños (o cualquier otra función) para que se ejecute diariamente.
  2. Aprendiste dos formas de configurar disparadores: a través del Panel de Control y con la CLI doctl.
  3. Probaste tu configuración para asegurarte de que funcione como se espera.

Aquí están los tutoriales anteriores de esta serie:

A continuación: Ahora que tu servicio funciona de manera independiente, el siguiente paso es monitorearlo de manera efectiva. En el próximo tutorial, aprenderás cómo ver los registros de tu función y enviarlos a servicios externos para simplificar el seguimiento y la resolución de problemas. ¡Hasta entonces!

Source:
https://www.digitalocean.com/community/tutorials/automating-birthday-reminders-with-triggers