Tutoriel : Déboguer un service Cloud Run à l'aide d'Eventarc

Ce tutoriel explique comment corriger les erreurs d'exécution rencontrées lorsque vous déployez des événements à partir de Cloud Storage à l'aide de journaux d'audit Cloud vers un service Cloud Run non authentifié.

Objectifs

  • Créer un bucket Cloud Storage qui servira de source d'événements.
  • Créer, importer et déployer une image de conteneur dans Cloud Run
  • Créer des déclencheurs Eventarc
  • Importer un fichier dans le bucket Cloud Storage
  • Corriger les erreurs d'exécution

Coûts

Ce tutoriel utilise 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.

Une fois que vous avez terminé ce tutoriel, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Consultez la page Effectuer un nettoyage pour en savoir plus.

Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

Suivez les prérequis décrits sur la page Recevoir un événement Cloud Audit Logging.

Créer un bucket Cloud Storage

Créez deux buckets de stockage dans deux régions qui serviront de source d'événements pour le service Cloud Run :

us-east1

export BUCKET1="troubleshoot-bucket1-$(gcloud config get-value core/project)"
gsutil mb -l us-east1 gs://${BUCKET1}

us-west1

export BUCKET2="troubleshoot-bucket2-$(gcloud config get-value core/project)"
gsutil mb -l us-west1 gs://${BUCKET2}

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

Récupérer l'exemple de code

Clonez le dépôt :

Go

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

Java

git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
cd java-docs-samples/eventarc/audit-storage

.NET

git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
cd dotnet-docs-samples/eventarc/audit-storage

Node.js

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
cd nodejs-docs-samples/eventarc/audit-storage

Python

git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
cd python-docs-samples/eventarc/audit-storage

Examiner le code

Le code de ce tutoriel contient les éléments suivants :

  • Un serveur qui gère les messages entrants encapsulés dans une fonction CloudEvent de la requête HTTP POST :

    Go

    
    // Sample audit_storage is a Cloud Run service which handles Cloud Audit Log events with Cloud Storage data.
    package main
    
    import (
    	"fmt"
    	"log"
    	"net/http"
    	"os"
    )
    
    // HelloEventsStorage receives and processes a Cloud Audit Log event with Cloud Storage data.
    func HelloEventsStorage(w http.ResponseWriter, r *http.Request) {
    	s := fmt.Sprintf("Detected change in Cloud Storage bucket: %s", string(r.Header.Get("Ce-Subject")))
    	log.Printf(s)
    	fmt.Fprintln(w, s)
    }
    

    Java

    import java.util.Arrays;
    import java.util.List;
    import java.util.Map;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestHeader;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class EventController {
    
      private static final List<String> requiredFields =
          Arrays.asList("ce-id", "ce-source", "ce-type", "ce-specversion");
    
      @RequestMapping(value = "/", method = RequestMethod.POST)
      public ResponseEntity<String> receiveMessage(
          @RequestBody Map<String, Object> body, @RequestHeader Map<String, String> headers) {
        for (String field : requiredFields) {
          if (headers.get(field) == null) {
            String msg = String.format("Missing expected header: %s.", field);
            System.out.println(msg);
            return new ResponseEntity<String>(msg, HttpStatus.BAD_REQUEST);
          }
        }
    
        if (headers.get("ce-subject") == null) {
          String msg = "Missing expected header: ce-subject.";
          System.out.println(msg);
          return new ResponseEntity<String>(msg, HttpStatus.BAD_REQUEST);
        }
    
        String ceSubject = headers.get("ce-subject");
        String msg = "Detected change in Cloud Storage bucket: " + ceSubject;
        System.out.println(msg);
        return new ResponseEntity<String>(msg, HttpStatus.OK);
      }
    }

    .NET

    
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;
    
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
        }
    
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger<Startup> logger)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
    
            logger.LogInformation("Service is starting...");
    
            app.UseRouting();
    
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapPost("/", async context =>
                {
                    logger.LogInformation("Handling HTTP POST");
    
                    var ceSubject = context.Request.Headers["ce-subject"];
                    logger.LogInformation($"ce-subject: {ceSubject}");
    
                    if (string.IsNullOrEmpty(ceSubject))
                    {
                        context.Response.StatusCode = 400;
                        await context.Response.WriteAsync("Bad Request: expected header Ce-Subject");
                        return;
                    }
    
                    await context.Response.WriteAsync($"GCS CloudEvent type: {ceSubject}");
                });
            });
        }
    }
    

    Node.js

    const express = require('express');
    const app = express();
    
    app.use(express.json());
    app.post('/', (req, res) => {
      if (!req.header('ce-subject')) {
        return res
          .status(400)
          .send('Bad Request: missing required header: ce-subject');
      }
    
      console.log(
        `Detected change in Cloud Storage bucket: ${req.header('ce-subject')}`
      );
      return res
        .status(200)
        .send(
          `Detected change in Cloud Storage bucket: ${req.header('ce-subject')}`
        );
    });
    
    module.exports = app;

    Python

    import os
    
    from flask import Flask, request
    
    app = Flask(__name__)
    if __name__ == "__main__":
        app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))
  • Un Dockerfile qui définit l'environnement d'exploitation du service. Le contenu du Dockerfile varie selon le langage :

    Go

    
    # Use the offical golang image to create a binary.
    # This is based on Debian and sets the GOPATH to /go.
    # https://hub.docker.com/_/golang
    FROM golang:1.16-buster as builder
    
    # Create and change to the app directory.
    WORKDIR /app
    
    # Retrieve application dependencies.
    # This allows the container build to reuse cached dependencies.
    # Expecting to copy go.mod and if present go.sum.
    COPY go.* ./
    RUN go mod download
    
    # Copy local code to the container image.
    COPY . ./
    
    # Build the binary.
    RUN go build -v -o server
    
    # Use the official Debian slim image for a lean production container.
    # https://hub.docker.com/_/debian
    # https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
    FROM debian:buster-slim
    RUN set -x && apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
        ca-certificates && \
        rm -rf /var/lib/apt/lists/*
    
    # Copy the binary to the production image from the builder stage.
    COPY --from=builder /app/server /server
    
    # Run the web service on container startup.
    CMD ["/server"]
    

    Java

    
    # Use the official maven/Java 8 image to create a build artifact.
    # https://hub.docker.com/_/maven
    FROM maven:3.8-jdk-11 as builder
    
    # Copy local code to the container image.
    WORKDIR /app
    COPY pom.xml .
    COPY src ./src
    
    # Build a release artifact.
    RUN mvn package -DskipTests
    
    # Use AdoptOpenJDK for base image.
    # It's important to use OpenJDK 8u191 or above that has container support enabled.
    # https://hub.docker.com/r/adoptopenjdk/openjdk8
    # https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
    FROM adoptopenjdk/openjdk11:alpine-slim
    
    # Copy the jar to the production image from the builder stage.
    COPY --from=builder /app/target/audit-storage-*.jar /audit-storage.jar
    
    # Run the web service on container startup.
    CMD ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/audit-storage.jar"]
    

    .NET

    
    # Use Microsoft's official build .NET image.
    # https://hub.docker.com/_/microsoft-dotnet-core-sdk/
    FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine AS build
    WORKDIR /app
    
    # Install production dependencies.
    # Copy csproj and restore as distinct layers.
    COPY *.csproj ./
    RUN dotnet restore
    
    # Copy local code to the container image.
    COPY . ./
    WORKDIR /app
    
    # Build a release artifact.
    RUN dotnet publish -c Release -o out
    
    # Use Microsoft's official runtime .NET image.
    # https://hub.docker.com/_/microsoft-dotnet-core-aspnet/
    FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-alpine AS runtime
    WORKDIR /app
    COPY --from=build /app/out ./
    
    # Run the web service on container startup.
    ENTRYPOINT ["dotnet", "AuditStorage.dll"]

    Node.js

    
    # Use the official lightweight Node.js 10 image.
    # https://hub.docker.com/_/node
    FROM node:12-slim
    
    # Create and change to the app directory.
    WORKDIR /usr/src/app
    
    # Copy application dependency manifests to the container image.
    # A wildcard is used to ensure both package.json AND package-lock.json are copied.
    # Copying this separately prevents re-running npm install on every code change.
    COPY package*.json ./
    
    # Install dependencies.
    # If you add a package-lock.json speed your build by switching to 'npm ci'.
    # RUN npm ci --only=production
    RUN npm install --production
    
    # Copy local code to the container image.
    COPY . .
    
    # Run the web service on container startup.
    CMD [ "npm", "start" ]
    

    Python

    
    # Use the official Python image.
    # https://hub.docker.com/_/python
    FROM python:3.9-slim
    
    # Allow statements and log messages to immediately appear in the Cloud Run logs
    ENV PYTHONUNBUFFERED True
    
    # Copy application dependency manifests to the container image.
    # Copying this separately prevents re-running pip install on every code change.
    COPY requirements.txt ./
    
    # Install production dependencies.
    RUN pip install -r requirements.txt
    
    # Copy local code to the container image.
    ENV APP_HOME /app
    WORKDIR $APP_HOME
    COPY . ./
    
    # Run the web service on container startup.
    # Use gunicorn webserver with one worker process and 8 threads.
    # For environments with multiple CPU cores, increase the number of workers
    # to be equal to the cores available.
    CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

Transmettre le code

Pour transmettre votre code, procédez comme suit :

  1. Créez votre image de conteneur avec Cloud Build, puis importez-la dans Container Registry :

    Go

     gcloud builds submit --tag gcr.io/PROJECT_ID/audit-storage

    Remplacez PROJECT_ID par l'ID de votre projet Google Cloud. Vous pouvez vérifier l'ID de votre projet actuel avec gcloud config get-value project.

    En cas de réussite, un message SUCCESS contenant l'ID, l'heure de création et le nom de l'image s'affiche. L'image est stockée dans Container Registry et peut être réutilisée si vous le souhaitez.

    Java

    1. Utilisez l'assistant d'identification gcloud pour autoriser Docker à transférer le conteneur vers Container Registry.
      gcloud auth configure-docker
    2. Utilisez le plug-in Maven Jib pour créer et transférer le conteneur dans Container Registry.

      mvn compile jib:build -Dimage=gcr.io/PROJECT_ID/audit-storage

      Remplacez PROJECT_ID par l'ID de votre projet Google Cloud.

      audit-storage est le nom du conteneur. Vous pouvez vérifier l'ID de votre projet actuel avec gcloud config get-value project. En cas de réussite, un message SUCCESS s'affiche. L'image est stockée dans Container Registry et peut être réutilisée si vous le souhaitez.

    .NET

     gcloud builds submit --tag gcr.io/PROJECT_ID/audit-storage

    Remplacez PROJECT_ID par l'ID de votre projet Google Cloud. Vous pouvez vérifier l'ID de votre projet actuel avec gcloud config get-value project.

    En cas de réussite, un message SUCCESS contenant l'ID, l'heure de création et le nom de l'image s'affiche. L'image est stockée dans Container Registry et peut être réutilisée si vous le souhaitez.

    Node.js

     gcloud builds submit --tag gcr.io/PROJECT_ID/audit-storage

    Remplacez PROJECT_ID par l'ID de votre projet Google Cloud. Vous pouvez vérifier l'ID de votre projet actuel avec gcloud config get-value project.

    En cas de réussite, un message SUCCESS contenant l'ID, l'heure de création et le nom de l'image s'affiche. L'image est stockée dans Container Registry et peut être réutilisée si vous le souhaitez.

    Python

     gcloud builds submit --tag gcr.io/PROJECT_ID/audit-storage

    Remplacez PROJECT_ID par l'ID de votre projet Google Cloud. Vous pouvez vérifier l'ID de votre projet actuel avec gcloud config get-value project.

    En cas de réussite, un message SUCCESS contenant l'ID, l'heure de création et le nom de l'image s'affiche. L'image est stockée dans Container Registry et peut être réutilisée si vous le souhaitez.

  2. Déployez l'image de conteneur dans Cloud Run :

    gcloud run deploy troubleshoot-service --image gcr.io/PROJECT_ID/audit-storage \
    --allow-unauthenticated
    

    Remplacez PROJECT_ID par l'ID de votre projet GCP.
    audit-storage correspond au nom du conteneur et troubleshoot-service au nom du service Cloud Run.

    Notez que l'image de conteneur est déployée sur le service et la région que vous avez précédemment configurés dans la section Configurer gcloud.

  3. Lorsque vous effectuez un déploiement sur Cloud Run, répondez y (oui) à l'invite Autoriser l'accès non authentifié. Pour en savoir plus sur l'authentification basée sur IAM, consultez la page Rôles et autorisations Eventarc.

    Une fois le déploiement effectué, la ligne de commande affiche l'URL du service.

Créer un déclencheur

Maintenant que vous avez déployé un service Cloud Run, configurez un déclencheur pour écouter les événements de Cloud Storage via des journaux d'audit.

  1. Créez un déclencheur de journal d'audit pour écouter les événements Cloud Storage :

    gcloud eventarc triggers create troubleshoot-trigger \
      --destination-run-service=troubleshoot-service \
      --event-filters="type=google.cloud.audit.log.v1.written" \
      --event-filters="serviceName=storage.googleapis.com" \
      --event-filters="methodName=storage.objects.create" \
      --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
    

    Cette action crée un déclencheur appelé troubleshoot-trigger.

  2. Pour vérifier que troubleshoot-trigger a été créé, exécutez la commande suivante :

    gcloud eventarc triggers list
    

    troubleshoot-trigger s'affiche avec une cible troubleshoot-service.

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

Pour vérifier que le service a bien été déployé et que vous pouvez recevoir des événements de Cloud Storage, procédez comme suit :

  1. Créez et importez un fichier dans le premier bucket de stockage :

     echo "Hello World" > random.txt
     gsutil cp random.txt gs://${BUCKET1}/random.txt
    
  2. Surveillez les journaux pour vérifier si le service a reçu un événement. Les journaux du service indiquent que le service écoute les événements, ce qui indique un problème dans la configuration :

    Now listening on: http://0.0.0.0:8080

Examiner le problème

Vous pouvez maintenant suivre le processus permettant de déterminer pourquoi le service ne reçoit pas d'événements.

Journaux d'audit

Dans ce tutoriel, les événements Cloud Storage sont émis via des journaux d'audit et envoyés à Cloud Run. Vérifiez si les journaux d'audit sont activés pour Cloud Storage.

  1. Accédez à IAM et administration > Journaux d'audit, puis cochez la case Google Cloud Storage. Accéder à la console Cloud Audit Logging
  2. Assurez-vous que les types de journaux Cloud Audit Logging Lecture administrateur, Lecture de données et Écriture de données sont sélectionnés.

Une fois les journaux d'audit Cloud activés, importez à nouveau le fichier et vérifiez les journaux. Le service ne reçoit toujours pas d'événements, ce qui peut être dû à l'emplacement du déclencheur.

Emplacement du déclencheur

Plusieurs ressources peuvent se trouver à différents emplacements. Vous devez filtrer les événements des sources situées dans la même région que la cible Cloud Run. Pour en savoir plus, consultez les emplacements acceptés dans Eventarc.

Dans ce tutoriel, vous avez déployé le service Cloud Run dans la zone us-central1. Vous avez également créé un déclencheur au même emplacement, car vous avez défini eventarc/location sur us-central1.

Pour répertorier l'emplacement du déclencheur, décrivez le déclencheur :

gcloud eventarc triggers describe troubleshoot-trigger

Cependant, vous avez créé deux buckets dans les emplacements us-east1 et us-west1. Pour recevoir des événements de ces emplacements, vous devez y créer des déclencheurs. Nous allons créer un déclencheur dans us-east1.

  1. Supprimez le déclencheur existant dans l'emplacement us-central1 :

       gcloud eventarc triggers delete troubleshoot-trigger
    
  2. Définissez l'emplacement et la région sur us-east1 :

      gcloud config set eventarc/location us-east1
      gcloud config set run/region us-east1
    
  3. Transmettez à nouveau le code.

  4. Créez un déclencheur à l'emplacement us-east1 :

      gcloud eventarc triggers create troubleshoot-trigger \
        --destination-run-service=troubleshoot-service \
        --event-filters="type=google.cloud.audit.log.v1.written" \
        --event-filters="serviceName=storage.googleapis.com" \
        --event-filters="methodName=storage.objects.create" \
        --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
    
  5. Vérifiez que le déclencheur a été créé :

       gcloud eventarc triggers list
    

Un déclencheur peut prendre jusqu'à 10 minutes pour s'initialiser avant de commencer à diffuser des événements.

Délai d'initialisation

Une fois les déclencheurs créés, un délai d'initialisation de 10 minutes peut s'écouler avant le lancement de la diffusion des événements. Exécutez la commande suivante pour vérifier que les déclencheurs sont actifs :

   gcloud eventarc triggers list

Un résultat semblable au suivant indique l'état du déclencheur :

    NAME                   TYPE                               DESTINATION_RUN_SERVICE  DESTINATION_RUN_PATH  ACTIVE
    troubleshoot-trigger3  google.cloud.audit.log.v1.written  troubleshoot-service2                          By 14:16:56
    troubleshoot-trigger   google.cloud.audit.log.v1.written  troubleshoot-service                           Yes

Au bout de 10 minutes, importez à nouveau un fichier dans chaque bucket. Les événements de chaque fichier sont écrits dans les journaux du service Cloud Run. Si le service ne reçoit pas d'événements, cela peut être lié à leur taille.

Taille des événements

Les événements que vous envoyez ne doivent pas dépasser la limite de taille (512 ko).

Un déclencheur ayant déjà diffusé des événements a cessé de fonctionner

  1. Vérifiez que la source génère des événements. Vérifiez les journaux d'audit Cloud et assurez-vous que le service surveillé émet des journaux. Si les journaux sont enregistrés, mais que les événements ne sont pas diffusés, contactez l'assistance.

  2. Vérifiez qu'un sujet Pub/Sub avec le même nom de déclencheur existe.

    1. Pour répertorier les déclencheurs, consultez la page sur la commande gcloud eventarc triggers list.
    2. Pour répertorier les sujets Pub/Sub, exécutez la commande suivante :

        gcloud pubsub topics list
      

    Vérifiez que le nom du sujet Pub/Sub inclut le nom du déclencheur créé. Si le sujet Pub/Sub est manquant, créez un sujet lors de la création du déclencheur.

  3. Vérifiez l'état du sujet Pub/Sub :

    1. Assurez-vous qu'une coche  s'affiche dans l'onglet Déclencheurs. Dans Cloud Console, accédez à Cloud Run, puis sélectionnez le service que vous avez créé et accédez à l'onglet Déclencheurs.

    2. Accédez à Pub/Sub > Sujets, puis cliquez sur le sujet Pub/Sub.

      Accéder aux sujets Pub/Sub

    3. Vérifiez si les messages sont publiés dans le sujet avec la métrique topic/send_message_operation_count. Si les messages ne sont pas publiés dans le sujet, vérifiez les journaux d'audit Cloud et assurez-vous que le service surveillé émet des journaux. Si les journaux sont enregistrés, mais que les événements ne sont pas diffusés, contactez l'assistance.

      Métrique du sujet

    4. Vérifiez si les messages sont transférés vers Cloud Run avec la métrique subscription/push_request_count regroupée par response_code.

      1. Dans Cloud Console, accédez à Cloud Monitoring.

        Accéder à Monitoring

      2. Ajoutez votre projet à un nouvel espace de travail.

      3. Cliquez sur Tableaux de bord, puis sélectionnez le tableau de bord Cloud Pub/Sub.

      4. Dans le tableau de bord Cloud Pub/Sub, cliquez sur le sujet Pub/Sub que vous avez créé.

      5. Dans la section Incidents, cliquez sur Créer une règle.

      6. Sur la page Créer une règle d'alerte, cliquez sur Ajouter une condition.

      7. Dans l'onglet Métrique, fournissez les conditions suivantes :

        • Abonnement Cloud Pub/Sub en tant que Resource type (Type de ressource)
        • Requêtes push en tant que Metric (Métrique)
        • response_code dans le champ Group by (Grouper par)
        • 0 comme seuil de configuration Métrique de l&#39;abonnementPour en savoir plus sur les métriques d'utilisation de Pub/Sub, consultez la section Surveiller les abonnements push.
      8. Cliquez sur Add (Ajouter) pour accéder à la page Créer une règle d'alerte.

      9. Dans la section Quelles sont les étapes pour résoudre le problème ?, indiquez le nom de l'alerte, par exemple samplealert, puis cliquez sur Enregistrer.

      10. Pour afficher l'alerte, accédez à Monitoring > Tableau de bord > Cloud Pub/Sub. Cliquez sur le sujet Pub/Sub, puis sur l'onglet Abonnement.

      Si des erreurs de transmission sont signalées, consultez les journaux du service Cloud Run. Si le point de terminaison de réception renvoie un code d'état autre que OK, cela signifie que le code Cloud Run ne fonctionne pas comme prévu et que vous devez contacter l'assistance.

Nettoyer

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. Dans Cloud Console, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

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 Google Cloud Console.

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

    Supprimez le paramètre de région :

     gcloud config unset run/region
    
  3. Supprimez la configuration du projet :

     gcloud config unset project
    
  4. Supprimez les autres ressources Google Cloud créées dans ce tutoriel :

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

    • Supprimez l'image de conteneur nommée gcr.io/PROJECT_ID/audit-storage de Container Registry. Remplacez PROJECT_ID par l'ID de votre projet Google Cloud.

Étape suivante

  • Pour résoudre les autres problèmes que vous pouvez rencontrer lors de l'utilisation d'Eventarc, consultez la page Dépannage.