Ejecutar servicios según una programación

Puedes usar Cloud Scheduler para activar de forma segura un servicio de Cloud Run según una programación. Es algo similar a utilizar tareas cron.

Estos son algunos de los posibles casos prácticos:

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

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

Antes de empezar

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

Crear y desplegar un servicio

Para crear y desplegar:

  1. En tu servicio, implementa el trabajo que quieras ejecutar según una programación.

  2. Anota el tipo de solicitud que tu servicio espera recibir de las solicitudes de trabajo, por ejemplo, GET o POST. Cuando crees el trabajo programado que invoca tu servicio, tendrás que especificar el método HTTP que coincida con este.

  3. Cuando despliegues el servicio que vas a usar con Cloud Scheduler, asegúrate de seleccionar ** Require authentication** (Requerir autenticación). No permitas el acceso público.

En el siguiente ejemplo se muestra cómo desplegar un servicio de Cloud Run con Terraform:

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

  deletion_protection = false # set to "true" in production

  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
  ]
}

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

Crear una cuenta de servicio para Cloud Scheduler

Debes crear una cuenta de servicio para asociarla a Cloud Scheduler y darle permiso para invocar tu servicio de Cloud Run. Puedes usar una cuenta de servicio que ya tengas para representar a Cloud Scheduler o crear una.

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

Consola

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

    Ir a Cuentas de servicio

  2. Selecciona un proyecto.

  3. Escribe el nombre de la cuenta de servicio, que será el que se muestre en la Google Cloud consola.

    La consola genera un ID de cuenta de servicio basado en este nombre. Google Cloud Edita el ID si es necesario. No podrás cambiarlo más adelante.

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

  5. Haz clic en Crear y continuar.

  6. Opcional: Haz clic en el campo Selecciona un rol.

  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"

    Sustituir

    • SERVICE_ACCOUNT_NAME con un nombre en minúsculas único en tu proyecto Google Cloud , por ejemplo, my-invoker-service-account-name.
    • DISPLAYED_SERVICE_ACCOUNT_NAME con el nombre que quieras que se muestre en esta cuenta de servicio, por ejemplo, en la consola, My Invoker Service Account.
  2. En Cloud Run, concede permiso a tu cuenta de servicio para invocar tu servicio:

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

    Sustituir

    • SERVICE con el nombre del servicio que quieres que invoque Cloud Scheduler.
    • SERVICE_ACCOUNT_NAME con el nombre de la cuenta de servicio.
    • PROJECT_ID por el ID de tu proyecto. Google Cloud
  3. Concede acceso al proyecto a tu cuenta de servicio para que pueda realizar acciones concretas con los recursos del proyecto:

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

    Sustituir

    • RESOURCE_ID: tu ID de proyecto Google Cloud .

    • PRINCIPAL: identificador de la entidad de seguridad o del miembro, que suele tener el siguiente formato: PRINCIPAL_TYPE:ID. Por ejemplo, user:my-user@example.com. Para ver una lista completa de los valores que puede tener PRINCIPAL, consulta la referencia de Policy Binding.

Terraform

Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.

Para crear una cuenta de servicio con Terraform, sigue estos pasos:

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}"
}

Crear una tarea de Cloud Scheduler

Deberás crear un trabajo que invoque tu servicio a las horas especificadas. Puedes usar la consola o la línea de comandos:

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

Consola

  1. Ve a la página de la consola de Cloud Scheduler.

    Ir a Cloud Scheduler

  2. Haz clic en Crear trabajo.

    captura de pantalla

  3. Asigne un nombre al trabajo.

  4. Especifica la frecuencia o el intervalo de la tarea mediante una cadena de configuración. Por ejemplo, la cadena 0 */3 * * * ejecuta el trabajo cada 3 horas. La cadena que proporciones aquí puede ser cualquier cadena compatible con crontab.

    Para obtener más información, consulta Configurar programaciones de trabajos.

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

  6. Especifica HTTP como objetivo:

    1. Especifica la URL completa de tu 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 el que espera el servicio de Cloud Run que has implementado anteriormente. El valor predeterminado es POST.

    3. Si quiere, especifique 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 ver los ajustes de autenticación.

    5. En el menú desplegable, selecciona Añadir token OIDC.

    6. En el campo Cuenta de servicio, copia el correo de la cuenta de servicio que has creado anteriormente.

    7. En el campo Audiencia, copie la URL completa de su servicio.

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

Línea de comandos

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

Para crear la tarea de Cloud Scheduler, sigue estos pasos:

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

Sustituir

  • HTTP-METHOD con el método HTTP (es decir, GET, POST, PUT, etc.).
  • SERVICE-URL con la URL de tu servicio.
  • SERVICE-ACCOUNT-EMAIL con el correo de tu cuenta de servicio.

Terraform

Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.

Para crear una tarea de Cloud Scheduler para el servicio de Cloud Run, sigue estos pasos:

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
  ]
}

Tu servicio de Cloud Run se activará mediante una solicitud de la tarea de Cloud Scheduler con la frecuencia que hayas definido. Para confirmarlo y monitorizarlo, consulta los registros de este servicio.

Siguientes pasos