Prácticas recomendadas: Ejecuta tareas programadas en un perímetro de Controles del servicio de VPC

En esta página, se describen las prácticas recomendadas para ejecutar trabajos programados de Cloud Run para proyectos de Google Cloud cuando se usa un perímetro de Controles del servicio de VPC.

Cloud Scheduler no puede activar trabajos dentro de un perímetro de Controles del servicio de VPC. Debes realizar pasos adicionales para configurar trabajos programados. En particular, debes delegar la solicitud a través de otro componente. Te recomendamos que uses un servicio de Cloud Run como proxy.

En el siguiente diagrama, se muestra la arquitectura:

Perímetro de SC de VPC de Cloud Run

Antes de comenzar

Configura Cloud Run para los Controles del servicio de VPC. Esta es una configuración única que usan todos los trabajos programados posteriores. También debes realizar una configuración por servicio más adelante, que se describe en las instrucciones que siguen.

Configura un trabajo programado

Para configurar una tarea programada dentro de un perímetro de Controles del servicio de VPC, haz lo siguiente:

  1. Crea un trabajo y anota su nombre.

  2. Completa la configuración de los Controles del servicio de VPC específica de Cloud Run por trabajo. Debes conectar tu trabajo a una red de VPC y enrutar todo el tráfico a través de esa red.

    Si no tienes un trabajo de Cloud Run existente que quieras activar, implementa el contenedor de trabajos de Cloud Run de muestra us-docker.pkg.dev/cloudrun/container/job:latest en Cloud Run para probar la función.

  3. Implementa el servicio de Cloud Run que actúa como proxy. Consulta Servicio de proxy de ejemplo para ver un servicio de ejemplo que activa un trabajo de Cloud Run en respuesta a una solicitud. Después de la implementación, la consola muestra la URL del servicio junto al texto URL:.

  4. Completa la configuración de los Controles del servicio de VPC específicos de Cloud Run por servicio. Debes conectar el servicio a una red de VPC y enrutar todo el tráfico a través de esa red. Asegúrate de configurar el acceso como Interno.

  5. Crea un trabajo cron de Cloud Scheduler que active tu servicio de proxy de Cloud Run:

    1. Ir a la página de la consola de trabajos de Cloud Scheduler

    2. Haz clic en Crear trabajo.

    3. Ingresa los valores que desees para los campos Nombre, Región, Frecuencia y Zona horaria. Para obtener más información, consulta Crea un trabajo cron con Cloud Scheduler.

    4. Haz clic en Configurar la ejecución.

    5. Selecciona el tipo de destino HTTP.

    6. En URL, ingresa la URL del servicio de proxy de Cloud Run que anotaste en el paso anterior.

    7. En el método HTTP, selecciona Get.

    8. En el encabezado de autenticación, selecciona Agregar token de OIDC.

    9. En Cuenta de servicio, selecciona Cuenta de servicio predeterminada de Compute Engine o una cuenta de servicio personalizada que tenga el permiso run.routes.invoke o el rol Cloud Run Invoker.

    10. En Público, ingresa la misma URL del servicio de proxy de Cloud Run que anotaste en el paso anterior.

    11. Deja todos los otros campos en blanco.

    12. Haz clic en Crear para crear el trabajo cron de Cloud Scheduler.

Ejemplo de servicio de proxy

En la siguiente sección, se muestra un servicio de Python de ejemplo que usa un proxy para las solicitudes y activa el trabajo de Cloud Run.

  1. Crea un archivo llamado main.py y pega el siguiente código en él. Actualiza el nombre del trabajo, la región y el ID del proyecto a los valores que necesites.

    import os
    from flask import Flask
    app = Flask(__name__)
    
    # pip install google-cloud-run
    from google.cloud import run_v2
    
    @app.route('/')
    def hello():
    
      client = run_v2.JobsClient()
    
      # UPDATE TO YOUR JOB NAME, REGION, AND PROJECT ID
      job_name = 'projects/YOUR_PROJECT_ID/locations/YOUR_JOB_REGION/jobs/YOUR_JOB_NAME'
    
      print("Triggering job...")
      request = run_v2.RunJobRequest(name=job_name)
      operation = client.run_job(request=request)
      response = operation.result()
      print(response)
      return "Done!"
    
    if __name__ == '__main__':
      app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
  2. Crea un archivo llamado requirements.txt y pega el código siguiente en él:

    google-cloud-run
    flask
  3. Crea un Dockerfile con el siguiente contenido:

    FROM python:3.9-slim-buster
    
    WORKDIR /app
    
    COPY requirements.txt requirements.txt
    RUN pip install --no-cache-dir -r requirements.txt
    
    COPY . .
    
    CMD ["python3", "main.py"]
  4. Compila y, luego, implementa el contenedor. Las implementaciones basadas en fuentes pueden ser difíciles de configurar en un entorno de Controles del servicio de VPC, debido a la necesidad de configurar trabajadores personalizados de Cloud Build. Si tienes una canalización de compilación y, también, de implementación existente, úsala para compilar el código fuente en un contenedor y, luego, implementarlo como un servicio de Cloud Run.

    Si no tienes una configuración de compilación e implementación existente, compila el contenedor de forma local y envíalo a Artifact Registry, por ejemplo:

    PROJECT_ID=YOUR_PROJECT_ID
    REGION=YOUR_REGION
    AR_REPO=YOUR_AR_REPO
    CLOUD_RUN_SERVICE=job-runner-service
    
    docker build -t $CLOUD_RUN_SERVICE .
    
    docker tag $CLOUD_RUN_SERVICE $REGION_ID-docker.pkg.dev/$PROJECT_ID/AR_REPO/$CLOUD_RUN_SERVICE
    
    docker push $REGION_ID-docker.pkg.dev/$PROJECT_ID/AR_REPO/$CLOUD_RUN_SERVICE

    Anota la URL del servicio que muestra el comando de implementación.

¿Qué sigue?

Después de usar esta función, lee lo siguiente para obtener más información: