Utiliser l'authentification avec des cibles HTTP

Cloud Scheduler peut appeler des cibles HTTP nécessitant une authentification si vous avez configuré un compte de service associé disposant des identifiants appropriés.

Configurer le compte de service

  1. Si vous ne possédez pas encore de compte de service à utiliser pour les tâches Cloud Scheduler avec des cibles HTTP, créez un compte de service. Veuillez noter les points suivants :

    • Le compte de service doit appartenir au projet dans lequel la tâche Cloud Scheduler est créée.

    • N'utilisez pas l'agent de service Cloud Scheduler (service-YOUR_PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com). Il ne peut pas être utilisé à cette fin.

    • Ne révoquez pas le rôle Agent de service Cloud Scheduler (roles/cloudscheduler.serviceAgent) de l'agent de service Cloud Scheduler sur votre projet. Cela entraîne des réponses 403 aux points de terminaison nécessitant une authentification, même si le compte de service de votre tâche dispose du rôle approprié.

  2. Si votre cible se trouve dans Google Cloud, attribuez les rôles IAM nécessaires à votre compte de service. Chaque service de Google Cloud nécessite un rôle spécifique, et le service destinataire vérifie automatiquement le jeton généré. Par exemple, pour Cloud Run et les fonctions Cloud Functions de deuxième génération, vous devez ajouter le rôle Cloud Run Invoker.

    Notez que pour déployer une ressource avec un compte de service géré par l'utilisateur, le déployeur doit disposer de l'autorisation iam.serviceAccounts.actAs pour ce compte de service. Si vous avez créé le compte de service, cette autorisation vous est automatiquement accordée. Si ce n'est pas le cas, une personne disposant des autorisations appropriées doit vous l'accorder sur le compte de service.

    Bonne pratique:À l'étape précédente, si vous avez créé un compte de service spécifiquement pour appeler le service ciblé par votre tâche Cloud Scheduler, envisagez de suivre le principe du moindre privilège (bonne pratique de sécurité) en liant le compte et son autorisation de demandeur à votre service cible. Vous pouvez le faire à l'aide de la console Google Cloud ou de gcloud CLI:

    Console

    1. Ouvrez la console Google Cloud.

    Accéder à la console

    2. Sélectionnez votre projet.

    3. Accédez à la page correspondant au type de ressource que vous appelez. Par exemple, si vous appelez un service Cloud Run, accédez à la page qui répertorie les services Cloud Run.

    4. Cochez la case à gauche du service que vous souhaitez appeler. (Ne cliquez pas sur le service lui-même.)

    5. Cliquez sur l'onglet Autorisations. Si le volet d'informations n'est pas visible, vous devrez peut-être cliquer sur Afficher le panneau d'informations, puis sur Autorisations.

    6. Cliquez sur Ajouter un compte principal.

    7. Sous Ajouter des comptes principaux, saisissez l'adresse e-mail du compte de service que vous avez créé.

    8. Sous Attribuer des rôles, sélectionnez un rôle dans la liste déroulante. Suivez le principe du moindre privilège en choisissant le rôle qui n'inclut que les autorisations dont votre compte principal a besoin.

    9. Cliquez sur Enregistrer.

    gcloud

    Exécutez la commande add-iam-policy-binding :

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

    Remplacez :

    • RESOURCE_TYPE: type de ressource de votre cible. Par exemple, run pour une cible Cloud Run.
    • RESOURCE_ID: identifiant de votre cible. Par exemple, le nom du service pour une cible Cloud Run.
    • PRINCIPAL: identifiant de votre compte de service. Il se présente sous la forme suivante : serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS. Par exemple, serviceAccount:my-service-account@my-project.iam.gserviceaccount.com.
    • ROLE: nom du rôle requis par votre service cible pour l'appel. Par exemple, roles/run.invoker pour une cible Cloud Run ou une cible Cloud Functions de deuxième génération.

    Exemples :

    • Cible Cloud Run:la commande suivante accorde le rôle Demandeur Cloud Run au compte de service my-service-account@my-project.iam.gserviceaccount.com pour le service Cloud Run my-service:

      gcloud run add-iam-policy-binding my-service \
       --member=serviceAccount:my-service-account@my-project.iam.gserviceaccount.com \
       --role=roles/run.invoker
      
    • Cible Cloud Functions:la commande suivante attribue le rôle Demandeur Cloud Run requis par les fonctions Cloud Functions de deuxième génération au compte de service my-service-account@my-project.iam.gserviceaccount.com pour la fonction Cloud Functions my-gen2-function de deuxième génération:

      gcloud functions add-iam-policy-binding my-gen2-function \
       --member=serviceAccount:my-service-account@my-project.iam.gserviceaccount.com \
       --role=roles/run.invoker --gen2
      
  3. Si votre cible se trouve en dehors de Google Cloud, le service destinataire doit vérifier manuellement le jeton.

  4. Le compte de service Cloud Scheduler par défaut est automatiquement configuré lorsque vous activez l'API Cloud Scheduler, sauf si vous l'avez activée avant le 19 mars 2019, auquel cas vous devez ajouter le rôle Cloud Scheduler Service Agent manuellement. Cela lui permet de générer des jetons d'en-tête au nom de votre compte de service client afin de s'authentifier auprès de votre cible.

    Vous pouvez vérifier que le compte de service Cloud Scheduler par défaut est configuré dans votre projet et qu'il dispose du rôle Cloud Scheduler Service Agent en affichant l'accès actuel de votre projet. Notez que si vous utilisez la console Google Cloud pour afficher l'accès à votre projet, veillez à cocher la case Inclure les attributions de rôles fournies par Google.

Créer un job de planification avec authentification

Pour créer une tâche utilisant l'authentification, vous devez ajouter le type de jeton et l'adresse e-mail qui identifie le compte de service client à votre requête create-job:

Console

  1. Spécifiez la fréquence "Toujours".
  2. Spécifiez HTTP comme type de cible.
  3. Ajoutez l'URL et la méthode HTTP comme d'habitude.
  4. Dans la liste Auth header (En-tête d'authentification), sélectionnez le type de jeton. Notez qu'OIDC (jeton d'ID) est généralement utilisé sauf pour les API Google hébergées sur *.googleapis.com, car ces API attendent un jeton d'accès OAuth.
  5. Dans le champ Compte de service, spécifiez l'adresse e-mail du compte de service client.
  6. L'option Audience est facultative et limite les destinataires du jeton OIDC. Il s'agit généralement de l'URL cible de la tâche (sans paramètres d'URL). Si cette valeur n'est pas spécifiée, l'URL complète est utilisée par défaut en tant qu'audience (y compris les paramètres de requête).

gcloud

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

Remplacez les éléments suivants :

  • JOB_ID: nom de la tâche. Il doit être unique dans le projet. Notez que vous ne pouvez pas réutiliser un nom de tâche dans un projet, même si vous supprimez la tâche associée.
  • FREQUENCY: l'intervalle de la tâche correspond à la fréquence d'exécution de la tâche (par exemple, every 3 hours ou every 10 mins). La chaîne que vous fournissez ici peut être n'importe quelle chaîne compatible avec Crontab. (Bien que nous ne recommandions plus son utilisation, l'ancienne syntaxe Cron App Engine reste compatible avec les tâches existantes.)
  • URI: URL complète du point de terminaison.
  • --oidc-service-account-email ou --oauth-service-account-email : définit le type de jeton. Notez qu'OIDC est généralement utilisé sauf pour les API Google hébergées sur *.googleapis.com, car ces API attendent un jeton OAuth.
  • CLIENT_SERVICE_ACCOUNT_EMAIL: adresse e-mail du compte de service client.
  • D'autres paramètres facultatifs sont disponibles et décrits dans la documentation de référence de la ligne de commande gcloud.

Choisir des types de jetons

Pour s'authentifier entre Cloud Scheduler et une cible HTTP, Cloud Scheduler crée un jeton d'en-tête basé sur votre compte de service client, identifié par son adresse e-mail, et l'envoie, à l'aide du protocole HTTPS, à la cible. Vous pouvez utiliser un jeton d'ID (OIDC) ou un jeton OAuth (d'accès). OIDC est généralement utilisé, sauf pour les API Google hébergées sur *.googleapis.com, car ces API attendent un jeton OAuth.

Ajoutez manuellement le rôle d'agent de service Cloud Scheduler à votre compte de service Cloud Scheduler

Cela n'est nécessaire que si l'une des conditions suivantes est remplie:

  • Vous avez activé l'API Cloud Scheduler avant le 19 mars 2019.
  • Vous avez supprimé le rôle d'agent de service Cloud Scheduler de votre compte de service

Le compte de service Cloud Scheduler nécessite le rôle d'agent de service Cloud Scheduler. Sans ce rôle, les tâches Cloud Scheduler échouent. Vous pouvez ajouter le rôle Agent de service Cloud Scheduler à votre compte de service Cloud Scheduler à partir de la console Google Cloud ou à l'aide de la gcloud CLI:

Console

  1. Dans la console Google Cloud, accédez à la page API Cloud Scheduler.

    Accéder à l'API Cloud Scheduler

    Si le champ Status (État) s'affiche et que l'état indique Enabled (Activé), continuez. Si ce n'est pas le cas, cliquez sur Activer.

  2. Dans la console Google Cloud, accédez à la page Paramètres.

    Accéder aux paramètres

  3. Recherchez et copiez le numéro de votre projet.

  4. Dans la console Google Cloud, accédez à la page IAM.

    Accéder à IAM

  5. Cliquez sur Accorder l'accès. Le volet Accorder l'accès s'affiche.

  6. Dans le champ Nouveaux comptes principaux, ajoutez une adresse e-mail au format suivant:

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

    Remplacez PROJECT_NUMBER par le numéro de votre projet Google Cloud.

  7. Dans la liste Sélectionner un rôle, recherchez et sélectionnez Agent de service Cloud Scheduler.

  8. Cliquez sur Enregistrer.

gcloud

  1. Vérifiez que l'API Cloud Scheduler est activée pour votre projet:

    gcloud services list --enabled \
     --filter=cloudscheduler.googleapis.com
    
    • Si le résultat suivant s'affiche, l'API est activée:

      NAME: cloudscheduler.googleapis.com
      TITLE: Cloud Scheduler API
      
    • Si ce n'est pas le cas (par exemple, si vous voyez Listed 0 items.), activez l'API:

      gcloud services enable cloudscheduler.googleapis.com
      
  2. Recherchez le numéro de votre projet :

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

    Remplacez PROJECT_ID par l'ID du projet.

  3. Copiez le numéro.

  4. Attribuez au compte de service Cloud Scheduler le rôle 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
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet.
    • PROJECT_NUMBER: numéro de projet que vous avez précédemment copié