Recevoir des événements Pub/Sub à l'aide d'un service Cloud Run avec authentification


Ce tutoriel explique comment déployer une application conteneurisée à l'aide d'un service Cloud Run authentifié qui reçoit des événements à l'aide de Pub/Sub. Pub/Sub est un service de messagerie en temps réel entièrement géré qui vous permet d'envoyer et de recevoir des messages entre différentes applications.

Objectifs

Au cours de ce tutoriel, vous allez :

  1. Déployer un service récepteur d'événements sur Cloud Run qui nécessite des appels authentifiés.

  2. Créer un déclencheur Eventarc qui connecte un sujet Pub/Sub au service Cloud Run.

  3. Envoyer un message au sujet Pub/Sub pour générer un événement.

  4. Afficher l'événement dans les journaux Cloud Run.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

Les contraintes de sécurité définies par votre organisation peuvent vous empêcher d'effectuer les étapes suivantes. Pour obtenir des informations de dépannage, consultez la page Développer des applications dans un environnement Google Cloud limité.

  1. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  2. Installez Google Cloud CLI.
  3. Pour initialiser gcloudCLI, exécutez la commande suivante :

    gcloud init
  4. Créez ou sélectionnez un projet Google Cloud.

    • Créez un projet Google Cloud :

      gcloud projects create PROJECT_ID

      Remplacez PROJECT_ID par le nom du projet Google Cloud que vous créez.

    • Sélectionnez le projet Google Cloud que vous avez créé :

      gcloud config set project PROJECT_ID

      Remplacez PROJECT_ID par le nom de votre projet Google Cloud.

  5. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  6. Installez Google Cloud CLI.
  7. Pour initialiser gcloudCLI, exécutez la commande suivante :

    gcloud init
  8. Créez ou sélectionnez un projet Google Cloud.

    • Créez un projet Google Cloud :

      gcloud projects create PROJECT_ID

      Remplacez PROJECT_ID par le nom du projet Google Cloud que vous créez.

    • Sélectionnez le projet Google Cloud que vous avez créé :

      gcloud config set project PROJECT_ID

      Remplacez PROJECT_ID par le nom de votre projet Google Cloud.

  9. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  10. Mettez à jour les composants de Google Cloud CLI :
    gcloud components update
  11. Connectez-vous à votre compte :
    gcloud auth login
  12. Activer les API :
    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        eventarc.googleapis.com \
        pubsub.googleapis.com \
        run.googleapis.com
  13. Définissez les variables de configuration utilisées dans ce tutoriel :
    export REGION=us-central1
    gcloud config set run/region ${REGION}
    gcloud config set run/platform managed
    gcloud config set eventarc/location ${REGION}
    export SERVICE_NAME=trigger-pubsub
    
  14. Si vous êtes le créateur du projet, vous disposez du rôle de base Propriétaire (roles/owner). Par défaut, ce rôle Identity and Access Management (IAM) inclut les autorisations nécessaires pour accéder à la plupart des ressources Google Cloud. Vous pouvez ignorer cette étape.

    Si vous n'êtes pas le créateur du projet, les autorisations requises doivent être accordées au compte principal approprié sur le projet. Par exemple, un compte principal peut être un compte Google (pour les utilisateurs finaux) ou un compte de service (pour les applications et les charges de travail de calcul). Pour en savoir plus, consultez la page Rôles et autorisations pour la destination de votre événement.

    Notez que par défaut, les autorisations Cloud Build incluent des autorisations permettant d'importer et de télécharger des artefacts Artifact Registry.

    Autorisations requises

    Pour obtenir les autorisations nécessaires pour suivre ce tutoriel, demandez à votre administrateur de vous accorder les rôles IAM suivants sur votre projet :

    Pour en savoir plus sur l'attribution de rôles, consultez la section Gérer les accès.

    Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

  15. Le compte de service Compute Engine par défaut est créé automatiquement après l'activation ou l'utilisation d'un service Google Cloud utilisant Compute Engine.

    À des fins de test, vous pouvez associer ce compte de service à un déclencheur Eventarc pour représenter l'identité du déclencheur. Notez le format de l'adresse e-mail à utiliser lors de la création d'un déclencheur :

    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    Remplacez PROJECT_NUMBER par votre numéro de projet Google Cloud. Vous pouvez trouver le numéro de votre projet sur la page Bienvenue de la console Google Cloud ou en exécutant la commande suivante :

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

    Le compte de service Compute Engine dispose automatiquement du rôle de base Éditeur (roles/editor) sur votre projet. Toutefois, si les attributions automatiques de rôles ont été désactivées, consultez les instructions Rôles et autorisations applicables pour créer un compte de service et lui accorder les rôles requis.

  16. Par défaut, les services Cloud Run ne peuvent être appelés que par les propriétaires de projet, les éditeurs de projet, ainsi que par les administrateurs et les demandeurs Cloud Run. Vous pouvez contrôler l'accès service par service. Toutefois, à des fins de test, attribuez le rôle Demandeur Cloud Run (run.invoker) au compte de service Compute Engine sur le projet Google Cloud. Cela permet d'accorder le rôle sur tous les services et jobs Cloud Run d'un projet.
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/run.invoker

    Notez que si vous créez un déclencheur pour un service Cloud Run authentifié sans attribuer le rôle Demandeur Cloud Run, le déclencheur est bien créé et actif. Cependant, le déclencheur ne fonctionnera pas comme prévu et un message semblable au suivant s'affichera dans les journaux :

    The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header.
  17. Si vous avez activé l'agent de service Cloud Pub/Sub le 8 avril 2021 ou à une date antérieure, attribuez le rôle Créateur de jetons du compte de service (roles/iam.serviceAccountTokenCreator) au compte de service géré par Google pour accepter les requêtes push Pub/Sub authentifiées. Sinon, ce rôle est attribué par défaut :
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator

Créer un dépôt standard Artifact Registry

Créez un dépôt standard Artifact Registry pour stocker votre image de conteneur :

gcloud artifacts repositories create REPOSITORY \
    --repository-format=docker \
    --location=$REGION

Remplacez REPOSITORY par un nom unique pour le dépôt.

Déployer un récepteur d'événements sur Cloud Run

Déployez un service Cloud Run qui consigne le contenu d'un événement.

  1. Clonez le dépôt GitHub.

    Node.js

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git

    Vous pouvez également télécharger l'exemple en tant que fichier ZIP et l'extraire.

    Python

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

    Vous pouvez également télécharger l'exemple en tant que fichier ZIP et l'extraire.

    Go

    git clone https://github.com/GoogleCloudPlatform/golang-samples.git

    Vous pouvez également télécharger l'exemple en tant que fichier ZIP et l'extraire.

    Java

    git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git

    Vous pouvez également télécharger l'exemple en tant que fichier ZIP et l'extraire.

    Ruby

    git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.git

    Vous pouvez également télécharger l'exemple en tant que fichier ZIP et l'extraire.

    C#

    git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git

    Vous pouvez également télécharger l'exemple en tant que fichier ZIP et l'extraire.

  2. Accédez au répertoire contenant l'exemple de code Cloud Run :

    Node.js

    cd nodejs-docs-samples/eventarc/pubsub/

    Python

    cd python-docs-samples/eventarc/pubsub/

    Go

    cd golang-samples/eventarc/pubsub/

    Java

    cd java-docs-samples/eventarc/pubsub/

    Ruby

    cd ruby-docs-samples/eventarc/pubsub/

    C#

    cd dotnet-docs-samples/eventarc/pubsub/
  3. Créez le conteneur et importez-le dans Cloud Build :

    gcloud builds submit --tag $REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/trigger-pubsub:v1
  4. Déployez l'image de conteneur dans Cloud Run :

    gcloud run deploy ${SERVICE_NAME} \
        --image $REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/trigger-pubsub:v1
  5. Lorsque l'invite Allow unauthenticated invocations to trigger-pubsub (y/N)? (Autoriser les appels non authentifiés à déclencher-pubsub (y/N) ?) apparaît, répondez n pour "Non".

Lorsque l'URL du service Cloud Run s'affiche, le déploiement est terminé.

Créer un déclencheur Eventarc

Lorsqu'un message est publié dans le sujet Pub/Sub, l'événement déclenche le service Cloud Run.

  1. Créez un déclencheur pour écouter les messages Pub/Sub :

    Nouveau sujet Pub/Sub

      gcloud eventarc triggers create ${SERVICE_NAME} \
          --destination-run-service=${SERVICE_NAME} \
          --destination-run-region=${REGION} \
          --location=${REGION} \
          --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
          --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    Cela crée un sujet Pub/Sub et un déclencheur associé nommé trigger-pubsub.

    Sujet Pub/Sub existant

      gcloud eventarc triggers create ${SERVICE_NAME} \
          --destination-run-service=${SERVICE_NAME} \
          --destination-run-region=${REGION} \
          --location=${REGION} \
          --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
          --transport-topic=projects/PROJECT_ID/topics/TOPIC_ID \
          --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet Google Cloud
    • TOPIC_ID : ID du sujet Pub/Sub existant

    Cela crée un déclencheur nommé trigger-pubsub pour le sujet Pub/Sub existant.

    Notez que lorsque vous créez un déclencheur Eventarc pour la première fois dans un projet Google Cloud, le provisionnement de l'agent de service Eventarc peut prendre quelques instants. Ce problème peut généralement être résolu en essayant à nouveau de créer le déclencheur. Pour en savoir plus, consultez Erreurs d'autorisation refusée.

  2. Vérifiez que le déclencheur a bien été créé. Notez que, bien que votre déclencheur soit créé immédiatement, il peut falloir jusqu'à deux minutes pour qu'il soit pleinement opérationnel.

    gcloud eventarc triggers list --location=${REGION}

    L'état du déclencheur renvoyé doit être ACTIVE: Yes.

Générer et afficher un événement

Publiez un message dans un sujet Pub/Sub pour générer un événement et déclencher le service Cloud Run. Le service Cloud Run consigne les messages dans les journaux de service.

  1. Recherchez et définissez le sujet Pub/Sub en tant que variable d'environnement :

    export TOPIC_ID=$(gcloud eventarc triggers describe ${SERVICE_NAME} \
        --format='value(transport.pubsub.topic)')
    
  2. Envoyez un message au sujet Pub/Sub pour générer un événement :

    gcloud pubsub topics publish $TOPIC_ID --message "Hello there"
    

    L'événement est envoyé au service Cloud Run, qui consigne le message d'événement.

  3. Pour afficher les entrées de journal liées aux événements créées par votre service, procédez comme suit :

    gcloud logging read 'textPayload: "Hello there!"'

    L'entrée de journal doit être semblable à ceci :

    textPayload: 'Hello, Hello there!'

L'affichage des journaux peut nécessiter quelques instants. S'ils n'apparaissent pas immédiatement, patientez une minute et vérifiez de nouveau.

Effectuer un nettoyage

Pour éviter que des frais ne vous soient facturés, tels que le stockage de l'image de conteneur dans Artifact Registry, le stockage de fichiers dans votre bucket Cloud Storage et le déclenchement de Eventarc, vous pouvez supprimer les ressources que vous avez créées pour ce tutoriel :

  1. Supprimez le service Cloud Run.

  2. Supprimez votre image de conteneur.

  3. Supprimer le déclencheur Eventarc.

Vous pouvez également supprimer votre projet Google Cloud. La suppression de votre projet Google Cloud arrête la facturation de toutes les ressources utilisées dans ce projet.

Supprimez un projet Google Cloud :

gcloud projects delete PROJECT_ID

Étapes suivantes