Usa autenticación con destinos HTTP

Cloud Scheduler puede llamar a destinos HTTP que requieren autenticación si configuraste una cuenta de servicio asociada con las credenciales adecuadas.

Configura la cuenta de servicio

  1. Si aún no tienes una cuenta de servicio que quieras usar para los trabajos de Cloud Scheduler con destinos HTTP, crea una cuenta de servicio nueva. Ten en cuenta lo siguiente:

    • La cuenta de servicio debe pertenecer al proyecto en el que se crea el trabajo de Cloud Scheduler.

    • No uses la cuenta de servicio predeterminada de Cloud Scheduler (service-YOUR_PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com). Esta cuenta de servicio administrada por Google, también conocida como agente de servicio, no se puede usar para este propósito.

    • No quites la cuenta de servicio predeterminada de Cloud Scheduler de tu proyecto ni su función Cloud Scheduler Service Agent (roles/cloudscheduler.serviceAgent). Esto da como resultado respuestas 403 a los extremos que requieren autenticación, incluso si la cuenta de servicio de tu trabajo tiene la función adecuada.

  2. Si tu destino está dentro de Google Cloud, otorga las funciones de IAM necesarias a la cuenta de servicio. Cada servicio dentro de Google Cloud requiere una función específica, y el servicio receptor verifica de forma automática el token generado. Por ejemplo, para Cloud Run y las funciones de Cloud Functions de segunda generación, debes agregar el rol Cloud Run Invoker.

    Ten en cuenta que, para implementar un recurso con una cuenta de servicio administrada por el usuario, el implementador debe tener el permiso iam.serviceAccounts.actAs en esa cuenta de servicio. Si creaste la cuenta de servicio, se te otorga este permiso de forma automática. De lo contrario, alguien que tenga los permisos correctos debe otorgarte este permiso en la cuenta de servicio.

    Práctica recomendada: En el paso anterior, si creaste una cuenta de servicio específica para invocar el servicio al que se orienta tu trabajo de Cloud Scheduler, considera seguir el principio de privilegio mínimo (práctica recomendada de seguridad) mediante la vinculación de la cuenta y su permiso de invocador a tu servicio de destino. Puedes hacerlo con la consola de Google Cloud o la gcloud CLI:

    Console

    1. Abre la consola de Google Cloud.

    Ir a la consola

    2. Elige tu proyecto.

    3. Navega a la página del tipo de recurso que estás invocando. Por ejemplo, si invocas un servicio de Cloud Run, navega a la página que enumera los servicios de Cloud Run.

    4. Selecciona la casilla de verificación a la izquierda del servicio que deseas invocar. (No hagas clic en el servicio).

    5. Haz clic en la pestaña Permisos. Si no ves el panel de información, es posible que debas hacer clic en Mostrar panel de información y, luego, en Permisos.

    6. Haz clic en Agregar principal.

    7. En Agregar principales, ingresa la dirección de correo electrónico de la cuenta de servicio que creaste.

    8. En Asigna roles, selecciona un rol para otorgar de la lista desplegable. Sigue el principio de privilegio mínimo y elige la función que incluya solo los permisos que necesita la principal.

    9. Haz clic en Guardar.

    gcloud

    Ejecuta el comando add-iam-policy-binding:

    gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \
    --member=PRINCIPAL --role=ROLE
    

    Reemplaza lo siguiente:

    • RESOURCE_TYPE: Es el tipo de recurso de tu objetivo. Por ejemplo, run para un destino de Cloud Run.
    • RESOURCE_ID: Es el identificador de tu objetivo. Por ejemplo, el nombre del servicio para un destino de Cloud Run.
    • PRINCIPAL: Es el identificador de tu cuenta de servicio. Esto tiene el siguiente formato: serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS. Por ejemplo, serviceAccount:my-service-account@my-project.iam.gserviceaccount.com.
    • ROLE: Es el nombre de la función que requiere tu servicio de destino para la invocación. Por ejemplo, roles/run.invoker para un destino de Cloud Run o de Cloud Functions de segunda generación.

    Ejemplos:

    • Destino de Cloud Run: El siguiente comando otorga la función de Invocador de Cloud Run a la cuenta de servicio my-service-account@my-project.iam.gserviceaccount.com para el servicio de Cloud Run my-service:

      gcloud run add-iam-policy-binding my-service \
      --member=my-service-account@my-project.iam.gserviceaccount.com \
      --role=roles/run.invoker
      
    • Destino de Cloud Functions: El siguiente comando otorga la función de Invocador de Cloud Run que requieren las funciones de Cloud Functions de segunda generación a la cuenta de servicio my-service-account@my-project.iam.gserviceaccount.com para la función de Cloud Functions de segunda generación my-gen2-function:

      gcloud functions add-iam-policy-binding my-gen2-function \
      --member=my-service-account@my-project.iam.gserviceaccount.com \
      --role=roles/run.invoker --gen2
      
  3. Si tu destino está fuera de Google Cloud, el servicio receptor debe verificar el token de forma manual.

  4. La cuenta de servicio predeterminada de Cloud Scheduler se configura automáticamente cuando habilitas la API de Cloud Scheduler, a menos que la hayas habilitado antes del 19 de marzo de 2019, en cuyo caso debes agregar el rol Cloud Scheduler Service Agent de forma manual. Esto es para que pueda generar tokens de encabezado en nombre de tu cuenta de servicio de cliente a fin de autenticarse en tu objetivo.

    Puedes verificar que la cuenta de servicio predeterminada de Cloud Scheduler esté configurada en tu proyecto y que tenga la función Cloud Scheduler Service Agent otorgada. Para ello, visualiza el acceso actual de tu proyecto. Ten en cuenta que, si usas la consola de Google Cloud para ver el acceso de tu proyecto, asegúrate de seleccionar la casilla de verificación Incluir asignaciones de roles proporcionadas por Google.

Crea un trabajo de programador con autenticación

Para crear un trabajo que use autenticación, debes agregar a tu solicitud create-job el tipo de token y la dirección de correo electrónico que identifica la cuenta de servicio del cliente:

Console

  1. Especifica la frecuencia como siempre.
  2. Especifica HTTP como el tipo de destino.
  3. Agrega la URL y el método HTTP como siempre.
  4. En la lista Encabezado de autenticación, selecciona el tipo de token. Ten en cuenta que OIDC (token de ID) suele usarse, excepto en las APIs de Google alojadas en *.googleapis.com, ya que estas APIs esperan un token de acceso de OAuth.
  5. En Cuenta de servicio, especifica el correo electrónico de la cuenta de servicio del cliente.
  6. Audience es opcional y limita los destinatarios del token de OIDC; por lo general, la URL de destino del trabajo (sin ningún parámetro de URL). Si no se especifica, de forma predeterminada, se usa toda la URL como público (incluidos los parámetros de solicitud).

gcloud

gcloud scheduler jobs create http JOB_ID \
  --schedule="FREQUENCY" --uri=URI \
  --oidc-service-account-email=CLIENT_SERVICE_ACCOUNT_EMAIL

Reemplaza lo siguiente:

  • JOB_ID: Es un nombre para el trabajo. Debe ser único en el proyecto. Ten en cuenta que no puedes volver a usar un nombre de trabajo en un proyecto, incluso si borras su trabajo asociado.
  • FREQUENCY: El intervalo del trabajo es la frecuencia con la que se ejecuta el trabajo, por ejemplo, every 3 hours o every 10 mins. La string que proporcionas puede ser cualquier string compatible con Crontab. (Aunque ya no recomendamos su uso, la sintaxis cron heredada de App Engine todavía es compatible con los trabajos existentes).
  • URI: Es la URL completamente calificada del extremo.
  • --oidc-service-account-email o --oauth-service-account-email: Definen el tipo de token. Ten en cuenta que OIDC suele usarse, excepto para las APIs de Google alojadas en *.googleapis.com, ya que estas esperan un token de OAuth.
  • CLIENT_SERVICE_ACCOUNT_EMAIL: Es el correo electrónico de la cuenta de servicio del cliente.
  • Hay otros parámetros opcionales disponibles que se describen en la referencia de línea de comandos de gcloud.

Elige los tipos de tokens

Para autenticar entre Cloud Scheduler y un destino HTTP, Cloud Scheduler crea un token de encabezado basado en tu cuenta de servicio de cliente, identificado por su correo electrónico, y lo envía mediante HTTPS al destino. Puedes usar un token de ID (OIDC) o un token de OAuth (acceso). Por lo general, OIDC se usa, excepto en las APIs de Google alojadas en *.googleapis.com, ya que estas esperan un token de OAuth.

Agrega de forma manual el rol Agente de servicio de Cloud Scheduler a tu cuenta de servicio de Cloud Scheduler

Esto es necesario solo si se cumple una de las siguientes condiciones:

  • Habilitaste la API de Cloud Scheduler antes del 19 de marzo de 2019.
  • Quitaste el rol Agente de servicio de Cloud Scheduler de tu cuenta de servicio

La cuenta de servicio de Cloud Scheduler requiere el rol de agente de servicio de Cloud Scheduler. Sin esta función, los trabajos de Cloud Scheduler fallan. Puedes agregar el rol de agente de servicio de Cloud Scheduler a tu cuenta de servicio de Cloud Scheduler desde la consola de Google Cloud o con la gcloud CLI:

Console

  1. En la consola de Google Cloud, ve a la página API de Cloud Scheduler.

    Ir a la API de Cloud Scheduler

    Si hay un campo Estado y el estado aparece como Habilitado, continúa. De lo contrario, haz clic en Habilitar.

  2. En la consola de Google Cloud, ve a la página Configuración.

    Ir a la configuración

  3. Busca y copia el número del proyecto.

  4. En la consola de Google Cloud, ve a la página IAM.

    Ir a IAM

  5. Haz clic en Grant access. Se abrirá el panel Otorgar acceso.

  6. En el campo Principales nuevas, agrega una dirección de correo electrónico con el siguiente formato:

    service-PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com
    

    Reemplaza PROJECT_NUMBER por el número de tu proyecto de Google Cloud.

  7. En la lista Selecciona un rol, busca y selecciona Agente de servicio de Cloud Scheduler.

  8. Haz clic en Guardar.

gcloud

  1. Confirma que la API de Cloud Scheduler esté habilitada para tu proyecto:

    gcloud services list --enabled \
     --filter=cloudscheduler.googleapis.com
    
    • Si ves el siguiente resultado, significa que la API está habilitada:

      NAME: cloudscheduler.googleapis.com
      TITLE: Cloud Scheduler API
      
    • De lo contrario (por ejemplo, si ves Listed 0 items.), habilita la API:

      gcloud services enable cloudscheduler.googleapis.com
      
  2. Busca el número de tu proyecto:

    gcloud projects describe PROJECT_ID --format='table(projectNumber)'
    

    Reemplaza PROJECT_ID con el ID del proyecto.

  3. Copia el número.

  4. Otorga a la cuenta de servicio de Cloud Scheduler el rol Cloud Scheduler Service Agent:

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com \
       --role roles/cloudscheduler.serviceAgent
    

    Reemplaza lo siguiente:

    • PROJECT_ID: el ID de tu proyecto
    • PROJECT_NUMBER: El número de proyecto que copiaste antes