Utiliser Eventarc pour recevoir des événements depuis Cloud Storage

Ce tutoriel explique comment déployer une application conteneurisée à l'aide d'un service Cloud Run authentifié qui reçoit des événements via Eventarc.

En spécifiant des filtres pour un déclencheur Eventarc, vous pouvez configurer le routage des événements, y compris la source et la cible des événements. Dans ce cas, la mise à jour d'un bucket Cloud Storage déclenche l'événement et une requête est envoyée à votre service Cloud Run sous la forme d'une requête HTTP.

Objectifs

Au cours de ce tutoriel, vous allez :

  1. Créer un bucket Cloud Storage qui servira de source d'événements.

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

  3. créer un déclencheur Eventarc qui achemine les événements du bucket Cloud Storage vers le service Cloud Run ;

  4. générer un événement en important un fichier dans le bucket Cloud Storage, et afficher cet événement dans les journaux Cloud Run.

Coûts

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

Vous pouvez obtenir 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 sans frais.

Avant de commencer

Les contraintes de sécurité définies par votre organisation peuvent vous empêcher d'effectuer les étapes suivantes. Pour en savoir plus sur la résolution de ce problème, consultez Développer des applications dans un environnement Google Cloud limité.

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.

  3. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  4. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    gcloud init
  5. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. Verify that billing is enabled for your Google Cloud project.

  7. Install the Google Cloud CLI.

  8. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  9. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    gcloud init
  10. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  11. Verify that billing is enabled for your Google Cloud project.

  12. Si vous n'utilisez pas Cloud Shell, mettez à jour les composants Google Cloud CLI et connectez-vous à l'aide de votre compte :
    gcloud components update
    gcloud auth login
  13. Activer les API :
    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        eventarc.googleapis.com \
        run.googleapis.com \
        storage.googleapis.com
  14. 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}
  15. Vous ou votre administrateur devez attribuer les rôles IAM suivants au compte déployeur, à l'identité du déclencheur et, éventuellement, à l'agent de service Pub/Sub.

    Rôles requis pour le compte déployeur

    1. 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.

      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 Gérer l'accès aux projets, aux dossiers et aux organisations.

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

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

    Rôles requis pour l'identité du déclencheur

    1. Notez le compte de service Compute Engine par défaut, car vous allez l'associer à un déclencheur Eventarc pour représenter l'identité du déclencheur à des fins de test. Ce compte de service est créé automatiquement après l'activation ou l'utilisation d'un service Google Cloud qui utilise Compute Engine, avec le format d'adresse e-mail suivant :

      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)'

      Pour les environnements de production, nous vous recommandons vivement de créer un compte de service et de lui attribuer un ou plusieurs rôles IAM contenant les autorisations minimales requises conformément au principe du moindre privilège.

    2. 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.
    3. Attribuez le rôle Récepteur d'événements Eventarc (roles/eventarc.eventReceiver) sur le projet au compte de service Compute Engine par défaut afin que le déclencheur Eventarc puisse recevoir des événements en provenance des fournisseurs d'événements
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
          --role=roles/eventarc.eventReceiver

    Rôle facultatif pour l'agent de service Pub/Sub

    • 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 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
  16. 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.

    Créer un bucket Cloud Storage

    Créez un bucket Cloud Storage qui servira de source d'événements :

    gcloud storage buckets create gs://PROJECT_ID-bucket/ --location=us-central1

    Une fois la source d'événements créée, vous pouvez déployer le service récepteur d'événements sur Cloud Run.

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

    Vous allez déployer un service Cloud Run qui reçoit et consigne les événements.

    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.

      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/audit-storage/

      Python

      cd python-docs-samples/eventarc/audit-storage/

      Go

      cd golang-samples/eventarc/audit_storage/

      Java

      cd java-docs-samples/eventarc/audit-storage/

      C#

      cd dotnet-docs-samples/eventarc/audit-storage/
    3. Créez le conteneur pour le service Cloud Run :

      export PROJECT_ID=$(gcloud config get-value project)
      export SERVICE_NAME=helloworld-events
      gcloud builds submit --tag $REGION-docker.pkg.dev/${PROJECT_ID}/REPOSITORY/${SERVICE_NAME}:v1
    4. Déployez l'image de conteneur dans Cloud Run :

      gcloud run deploy ${SERVICE_NAME} \
          --image $REGION-docker.pkg.dev/${PROJECT_ID}/REPOSITORY/${SERVICE_NAME}:v1
    5. Lorsque l'invite Autoriser l'accès public à helloworld-events (O/N) ? s'affiche, répondez en saisissant n pour "Non".

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

    Créer un déclencheur Eventarc

    Le déclencheur Eventarc envoie des événements à partir du bucket Cloud Storage vers le service Cloud Run helloworld-events. Le service nécessite une authentification, et l'événement doit être déclenché par un appelant disposant d'un compte de service doté des rôles et autorisations IAM requis pour utiliser la ressource.

    1. Créez un déclencheur filtrant les événements Cloud Storage :

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

      Cette action crée un déclencheur appelé helloworld-events.

      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}

      La sortie devrait ressembler à ce qui suit :

      NAME: helloworld-events
      TYPE: google.cloud.storage.object.v1.finalized
      DESTINATION: Cloud Run service: helloworld-events
      ACTIVE: Yes
      

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

    Importez un fichier texte dans le bucket Cloud Storage pour générer un événement acheminé vers le service Cloud Run. Le service Cloud Run consigne l'événement dans les journaux de service.

    1. Pour générer un événement, procédez comme suit :

      Transférez un fichier texte vers Cloud Storage :

       echo "Hello World" > random.txt
       gcloud storage cp random.txt gs://PROJECT_ID-bucket/random.txt
      

      L'importation génère un événement, et le service Cloud Run consigne le message de l'événement.

    2. Pour afficher l'entrée de journal, procédez comme suit :

      1. Filtrez les entrées de journal et renvoyez la sortie au format JSON :

        gcloud logging read "resource.labels.service_name=helloworld-events AND textPayload:random.txt" --format=json
        
      2. Recherchez une entrée de journal semblable à ceci :

        "textPayload": "Detected change in Cloud Storage bucket: objects/random.txt"
        

    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

    Si vous avez créé un projet pour ce tutoriel, supprimez-le. Si vous avez utilisé un projet existant et que vous souhaitez le conserver sans les modifications du présent tutoriel, supprimez les ressources créées pour ce tutoriel.

    Supprimer le projet

    Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.

    Pour supprimer le projet :

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Supprimer les ressources du tutoriel

    1. Supprimez le service Cloud Run que vous avez déployé dans ce tutoriel :

      gcloud run services delete SERVICE_NAME

      SERVICE_NAME est le nom de service que vous avez choisi.

      Vous pouvez également supprimer des services Cloud Run à partir de la consoleGoogle Cloud .

    2. Supprimez les configurations gcloud CLI par défaut que vous avez ajoutées lors de la configuration du tutoriel.

      Exemple :

      gcloud config unset run/region

      ou

      gcloud config unset project

    3. Supprimez les autres ressources Google Cloud créées dans ce tutoriel :

      • Supprimez le déclencheur Eventarc :
        gcloud eventarc triggers delete TRIGGER_NAME
        
        Remplacez TRIGGER_NAME par le nom de votre déclencheur.

    Étapes suivantes