Ejecuta servicios de manera programada

Puedes usar Cloud Scheduler para activar de forma segura y programada un servicio de Cloud Run. Esto es muy similar a usar trabajos cron.

Entre los casos prácticos se incluyen los siguientes:

  • Realizar copias de seguridad de forma programada
  • Realizar tareas de administración recurrentes, como las siguientes:
    • Volver a generar un mapa del sitio
    • Borrar opciones de configuración, revisiones o datos antiguos
    • Sincronizar contenido entre sistemas de datos
    • Procesar notificaciones diarias por correo electrónico
    • Verificar y hacer informes sobre el acceso a servicios posteriores
  • Generar documentos, como facturas

En esta página, se muestra cómo usar Cloud Scheduler de forma segura con Cloud Run en el mismo proyecto de Google Cloud.

Antes de comenzar

Habilita la API de Cloud Scheduler en el proyecto que estás usando.

Crea e implementa tu servicio

Para crear y, luego, implementar el servicio, sigue estos pasos:

  1. En el servicio, implementa el trabajo que deseas ejecutar de manera programada.

  2. Ten en cuenta qué tipo de solicitud de trabajo espera recibir el servicio, por ejemplo, GET o POST. Cuando crees el trabajo programado que invoca el servicio, deberás especificar el método HTTP que coincida con esto.

  3. Cuando implementes el servicio que usas con Cloud Scheduler, asegúrate de NO permitir invocaciones no autenticadas.

En el siguiente ejemplo, se muestra cómo implementar un servicio de Cloud Run mediante Terraform:

resource "google_cloud_run_v2_service" "default" {
  name     = "my-scheduled-service"
  location = "us-central1"

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
  }

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.run_api
  ]
}

Reemplaza us-docker.pkg.dev/cloudrun/container/hello por una referencia a tu propia imagen de contenedor.

Crea una cuenta de servicio para Cloud Scheduler

Debes crear una cuenta de servicio a fin de asociarla con Cloud Scheduler y darle permiso para invocar el servicio de Cloud Run. Puedes usar una cuenta de servicio existente para representar a Cloud Scheduler o crear una nueva.

A fin de crear una cuenta de servicio y darle permiso para invocar el servicio de Cloud Run, sigue estos pasos:

Console

  1. En la consola de Google Cloud, ve a la página Cuentas de servicio.

    Ir a Cuentas de servicio

  2. Selecciona un proyecto

  3. Ingresa un nombre de cuenta de servicio para mostrar en la consola de Google Cloud.

    La consola de Google Cloud genera un ID de cuenta de servicio a partir de este nombre. Si es necesario, edita el ID. No podrás cambiar el ID más adelante.

  4. Opcional: Ingresa una descripción de la cuenta de servicio.

  5. Haz clic en Crear y continuar.

  6. Opcional: Haz clic en el campo Seleccionar una función.

  7. Selecciona Cloud Run > Invocador de Cloud Run.

  8. Haz clic en Listo.

Línea de comandos

  1. Crea la cuenta de servicio:

    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
       --display-name "DISPLAYED_SERVICE_ACCOUNT_NAME"

    Reemplaza los siguientes elementos:

    • SERVICE_ACCOUNT_NAME por un nombre único en minúscula dentro del proyecto de Google Cloud, por ejemplo, my-invoker-service-account-name
    • DISPLAYED_SERVICE_ACCOUNT_NAME por el nombre que deseas mostrar para esta cuenta de servicio, por ejemplo, en la consola, My Invoker Service Account
  2. En Cloud Run, debes otorgar permiso a la cuenta de servicio para invocar el servicio:

    gcloud run services add-iam-policy-binding SERVICE \
       --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --role=roles/run.invoker

    Reemplaza los siguientes elementos:

    • SERVICE por el nombre del servicio que deseas que Cloud Scheduler invoque
    • SERVICE_ACCOUNT_NAME por el nombre de la cuenta de servicio
    • PROJECT_ID por el ID del proyecto de Google Cloud.
  3. Otórgale a tu cuenta de servicio acceso al proyecto para que tenga el permiso de completar acciones específicas en los recursos de tu proyecto.

    gcloud projects add-iam-policy-binding RESOURCE_ID \
       --member=PRINCIPAL --role=roles/run.invoker

    Reemplaza los siguientes elementos:

    • RESOURCE_ID es el ID del proyecto de Google Cloud.

    • PRINCIPAL: Un identificador para la principal o el miembro, que suele tener el siguiente formato: PRINCIPAL_TYPE:ID. Por ejemplo, user:my-user@example.com Si deseas obtener una lista completa de los valores que PRINCIPAL puede tener, consulta la referencia sobre la vinculación de políticas.

Terraform

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

Para crear una cuenta de servicio mediante Terraform, ejecuta el siguiente comando:

resource "google_service_account" "default" {
  account_id   = "scheduler-sa"
  description  = "Cloud Scheduler service account; used to trigger scheduled Cloud Run jobs."
  display_name = "scheduler-sa"

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.iam_api
  ]
}

resource "google_cloud_run_service_iam_member" "default" {
  location = google_cloud_run_v2_service.default.location
  service  = google_cloud_run_v2_service.default.name
  role     = "roles/run.invoker"
  member   = "serviceAccount:${google_service_account.default.email}"
}

Crea un trabajo de Cloud Scheduler

Deberás crear un trabajo que invoque el servicio en momentos específicos. Puedes usar Console o la línea de comandos:

Para crear un trabajo, puedes usar Console o la línea de comandos de gcloud. Haz clic en la pestaña correspondiente:

Console

  1. Visita la página de Console de Cloud Scheduler.

    Ir a Cloud Scheduler

  2. Haz clic en Create job (Crear trabajo).

    captura de pantalla

  3. Proporciona un nombre para el trabajo.

  4. Especifica la frecuencia, o el intervalo de trabajo, en el que se ejecutará el trabajo mediante una string de configuración. Por ejemplo, la string 0 */3 * * * ejecuta el trabajo cada 3 horas. La string que proporcionas puede ser cualquier string compatible con crontab.

    Para obtener más información, consulta Configura programas de trabajo.

  5. En la lista desplegable, elige la zona horaria que se usará para la frecuencia del trabajo.

  6. Especifica HTTP como el destino:

    1. Especifica la URL completamente calificada del servicio, por ejemplo, https://myservice-abcdef-uc.a.run.app. El trabajo enviará solicitudes a esta URL.

    2. Especifica el método HTTP. El método debe coincidir con lo que espera el servicio de Cloud Run implementado antes. El valor predeterminado es POST.

    3. De manera opcional, especifica los datos que se enviarán al destino. Estos datos se envían en el cuerpo de la solicitud cuando se selecciona el método HTTP POST o PUT.

    4. Haz clic en Más para mostrar la configuración de autenticación.

    5. En el menú desplegable, selecciona Agregar token OIDC.

    6. En el campo Cuenta de servicio, copia el correo electrónico de la cuenta de servicio que creaste antes.

    7. En el campo Público, copia la URL completa del servicio.

  7. Haz clic en Crear para crear el trabajo y guardarlo.

Línea de comandos

Debes usar la autenticación de OIDC para acceder a un servicio autenticado de Cloud Run desde Cloud Scheduler. La autenticación de OIDC incluye la cuenta de servicio y las marcas de público. Para obtener más información, consulta Usa la autenticación para destinos de HTTP.

Para crear el trabajo de Cloud Scheduler, haz lo siguiente:

gcloud scheduler jobs create http test-job --schedule "5 * * * *" 
--http-method=HTTP-METHOD
--uri=SERVICE-URL
--oidc-service-account-email=SERVICE-ACCOUNT-EMAIL
--oidc-token-audience=SERVICE-URL

Reemplaza los siguientes elementos:

  • HTTP-METHOD por el método HTTP (es decir, GET, POST, PUT, etcétera).
  • SERVICE-URL por la URL de servicio
  • SERVICE-ACCOUNT-EMAIL por el correo electrónico de la cuenta de servicio

Terraform

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

Si deseas crear un trabajo de Cloud Scheduler para el servicio de Cloud Run, ejecuta el siguiente comando:

resource "google_cloud_scheduler_job" "default" {
  name             = "scheduled-cloud-run-job"
  region           = "us-central1"
  description      = "Invoke a Cloud Run container on a schedule."
  schedule         = "*/8 * * * *"
  time_zone        = "America/New_York"
  attempt_deadline = "320s"

  retry_config {
    retry_count = 1
  }

  http_target {
    http_method = "POST"
    uri         = google_cloud_run_v2_service.default.uri

    oidc_token {
      service_account_email = google_service_account.default.email
    }
  }

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.scheduler_api
  ]
}

El servicio de Cloud Run se activará a través de una solicitud del trabajo de Cloud Scheduler con la frecuencia que definiste. Para confirmar y supervisar esto, examina los registros de este servicio.

¿Qué sigue?