Activar funciones de Cloud Run con Cloud Tasks

En este tutorial se muestra cómo usar Cloud Tasks en una aplicación de App Engine para activar una función de Cloud Run y enviar un correo programado.

Objetivos

  • Entender el código de cada uno de los componentes.
  • Crea una cuenta de SendGrid.
  • Descarga el código fuente.
  • Despliega una función de Cloud Run para recibir solicitudes de Cloud Tasks y enviar un correo a través de la API de SendGrid.
  • Crea una cola de Cloud Tasks.
  • Crea una cuenta de servicio para autenticar tus solicitudes de Cloud Tasks.
  • Implementa el código de cliente que permite a un usuario enviar un correo.

Costes

Cloud Tasks, las funciones de Cloud Run y App Engine tienen un nivel gratuito, por lo que, si sigues el tutorial dentro del nivel gratuito de los productos en cuestión, no deberías incurrir en costes adicionales. Para obtener más información, consulta los precios.

Antes de empezar

  1. Selecciona o crea un Google Cloud proyecto.

    Ir a la página de 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 se usará como parámetro LOCATION_ID en tus solicitudes de Cloud Tasks, así que anótala. Ten en cuenta que dos ubicaciones, llamadas "europe-west" y "us-central" en los comandos de App Engine, se denominan "europe-west1" y "us-central1", respectivamente, en los comandos de Cloud Tasks.

    3. Selecciona Node.js como idioma y Standard como entorno.

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

    5. En la página Empezar, haga clic en Siguiente. Ya te encargarás de esto más adelante.

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

    Habilita las APIs

  4. Instala e inicializa gcloud CLI.

Información sobre el código

En esta sección se explica el código de la aplicación y cómo funciona.

Crear la tarea

La página de índice se publica mediante controladores en app.yaml. Las variables necesarias para crear tareas se transfieren 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 endpoint /send-email. Este endpoint gestiona los envíos de formularios de la página de índice y transfiere 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 crea la tarea de la siguiente manera:

  • Especificar el tipo de segmentación como HTTP Request.

  • Especificar el HTTP method que se va a usar y el URL del objetivo.

  • Asigna el valor application/json al encabezado Content-Type para que las aplicaciones posteriores puedan analizar la carga útil estructurada.

  • Añadir un correo de 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.

  • Comprobando que la fecha introducida por el usuario no supere el máximo de 30 días y añadiéndola a la solicitud como campo scheduleTime.

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

const createHttpTaskWithToken