Activa funciones de Cloud Run con Cloud Tasks

En este instructivo, se muestra cómo usar Cloud Tasks dentro de una aplicación de App Engine para activar una función de Cloud Run y enviar un correo electrónico programado.

Objetivos

  • Comprender el código en cada uno de los componentes
  • Crear una cuenta de SendGrid
  • Descargue el código fuente
  • Implementar una función de Cloud Run para recibir solicitudes de Cloud Tasks y enviar un correo electrónico a través de la API de SendGrid
  • Crear una cola de Cloud Tasks
  • Crea una cuenta de servicio para autenticar tus solicitudes de Cloud Tasks.
  • Implementar el código del cliente que permite que un usuario envíe un correo electrónico

Costos

Cloud Tasks, Cloud Run Functions y App Engine tienen un nivel gratuito, por lo que, siempre que ejecutes el instructivo dentro del nivel gratuito de los productos determinados, no deberías generar costos adicionales. Para obtener más información, consulta Precios.

Antes de comenzar

  1. Selecciona o crea un Google Cloud proyecto de.

    Ir a la página App Engine

  2. Inicializa una aplicación de App Engine en tu proyecto:

    1. En la página Bienvenido a App Engine, haz clic en Crear aplicación.

    2. Selecciona una región para tu aplicación. Esta ubicación servirá como parámetro LOCATION_ID para tus solicitudes de Cloud Tasks, así que anótala. Ten en cuenta que hay dos ubicaciones, llamadas europe-west y us-central en los comandos de App Engine, que se llaman europe-west1 y us-central1 en los comandos de Cloud Tasks.

    3. Selecciona Node.js para el lenguaje y Estándar para el entorno.

    4. Si aparece la ventana emergente Habilitar facturación, selecciona tu cuenta de facturación. Si no tienes una cuenta de facturación, haz clic en Crear cuenta de facturación y sigue el asistente.

    5. En la página Comenzar, haz clic en Siguiente. Te ocuparás de esto más adelante.

  3. Habilita las APIs de Cloud Run Functions y Cloud Tasks.

    Habilita las API

  4. Instala e inicializa la gcloud CLI.

Comprende el código

En esta sección, se explica el código de la app y su funcionamiento.

Crea la tarea

La página de índice se entrega con controladores en app.yaml. Las variables necesarias para la creación de tareas se pasan como variables de entorno.

runtime: nodejs16

env_variables:
  QUEUE_NAME: "my-queue"
  QUEUE_LOCATION: "us-central1"
  FUNCTION_URL: "https://<region>-<project_id>.cloudfunctions.net/sendEmail"
  SERVICE_ACCOUNT_EMAIL: "<member>@<project_id>.iam.gserviceaccount.com"

# Handlers for serving the index page.
handlers:
  - url: /static
    static_dir: static
  - url: /
    static_files: index.html
    upload: index.html

Este código crea el extremo /send-email. Este extremo controla los envíos de formularios desde la página de índice y pasa esos datos al código de creación de tareas.

app.post('/send-email', (req, res) => {
  // Set the task payload to the form submission.
  const {to_name, from_name, to_email, date} = req.body;
  const payload = {to_name, from_name, to_email};

  createHttpTaskWithToken(
    process.env.GOOGLE_CLOUD_PROJECT,
    QUEUE_NAME,
    QUEUE_LOCATION,
    FUNCTION_URL,
    SERVICE_ACCOUNT_EMAIL,
    payload,
    date
  );

  res.status(202).send('📫 Your postcard is in the mail! 💌');
});

Este código crea la tarea y la envía a la cola de Cloud Tasks. El código compila la tarea de la siguiente manera:

  • Especifica el tipo de destino como HTTP Request.

  • Especifica el HTTP method que se usará y el URL del destino.

  • Establece el encabezado Content-Type en application/json para que las aplicaciones descendentes puedan analizar la carga útil estructurada.

  • Agrega un correo electrónico de la cuenta de servicio para que Cloud Tasks pueda proporcionar credenciales al destino de la solicitud, que requiere autenticación. La cuenta de servicio se crea por separado.

  • Verifica que la entrada del usuario para la fecha esté dentro del máximo de 30 días y agrega a la solicitud como campo scheduleTime.

const MAX_SCHEDULE_LIMIT = 30 * 60 * 60 * 24; // Represents 30 days in seconds.

const createHttpTaskWithToken = async function (
  project = 'my-project-id', // Your GCP Project id
  queue = 'my-queue', // Name of your Queue
  location = 'us-central1', // The GCP region of your queue
  url = 'https://example.com/taskhandler', // The full url path that the request will be sent to