Prácticas recomendadas: ejecutar trabajos programados en un perímetro de Controles de 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 de Servicio de VPC.

Cloud Scheduler no puede activar tareas dentro de un perímetro de Controles de Servicio de VPC. Debes seguir pasos adicionales para configurar los trabajos programados. En concreto, debes proxy 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 los controles de servicio de VPC de Cloud Run

Antes de empezar

Configura Cloud Run para Controles de Servicio de VPC. Esta configuración se realiza una sola vez y se usa en todas las tareas programadas posteriores. También debes realizar una configuración por servicio más adelante, que se describe en las instrucciones que se indican a continuación.

Configurar una tarea programada

Para configurar una tarea programada dentro de un perímetro de Controles de Servicio de VPC, sigue estos pasos:

  1. Crea un trabajo y anota su nombre.

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

    Si no tienes ningún trabajo de Cloud Run que quieras activar, prueba la función desplegando el contenedor de trabajos de Cloud Run de ejemplo us-docker.pkg.dev/cloudrun/container/job:latest en Cloud Run.

  3. Despliega el servicio de Cloud Run que actúa como proxy. Consulta el 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 del despliegue, la consola muestra la URL del servicio junto al texto URL:.

  4. Completa la configuración de Controles de Servicio de VPC específicos de Cloud Run por servicio. Debes conectar el servicio a una red de VPC y dirigir todo el tráfico a través de esa red. Asegúrate de definir el objeto Ingress como Internal (Interno).

  5. Crea una tarea cron de Cloud Scheduler que active tu servicio proxy de Cloud Run:

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

    2. Haz clic en Crear trabajo.

    3. Introduce los valores que quieras en los campos Nombre, Región, Frecuencia y Zona horaria. Para obtener más información, consulta Crear un trabajo cron con Cloud Scheduler.

    4. Haz clic en Configurar la ejecución.

    5. Selecciona Tipo de segmentación HTTP.

    6. En URL, introduce la URL del servicio proxy de Cloud Run que has anotado en el paso anterior.

    7. En Método HTTP, selecciona Get.

    8. En Encabezado de autorización, selecciona Añadir 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 Audiencia, introduce la misma URL del servicio proxy de Cloud Run que has anotado en el paso anterior.

    11. Deja el resto de los campos en blanco.

    12. Haz clic en Crear para crear la tarea cron de Cloud Scheduler.

Servicio proxy de ejemplo

En la siguiente sección se muestra un servicio de Python de ejemplo que proxyiza 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 con 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 siguiente código 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. Crea y despliega el contenedor. Las implementaciones basadas en fuentes pueden ser difíciles de configurar en un entorno de Controles de Servicio de VPC, ya que es necesario configurar trabajadores personalizados de Cloud Build. Si ya tienes una canalización de compilación y despliegue, úsala para compilar el código fuente en un contenedor y desplegar el contenedor como un servicio de Cloud Run.

    Si no tienes una configuración de compilación e implementación, 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 devuelve el comando de implementación.

Siguientes pasos

Después de usar esta función, consulta más información en los siguientes artículos: