Anleitung: Fehler in einem Cloud Run-Dienst mit Eventarc beheben

In dieser Anleitung wird beschrieben, wie Sie Laufzeitfehler beheben, die auftreten, wenn Sie Ereignisse aus Cloud Storage mithilfe von Cloud-Audit-Logging in einem nicht authentifizierten Cloud Run-Dienst bereitstellen.

Ziele

  • Cloud Storage-Bucket als Ereignisquelle erstellen
  • Container-Image in Cloud Run erstellen, hochladen und bereitstellen
  • Eventarc-Trigger erstellen
  • Datei in den Cloud Storage-Bucket hochladen
  • Laufzeitfehler beheben

Kosten

In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss dieser Anleitung können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Neue Google Cloud-Nutzer sind möglicherweise für eine kostenlose Testversion berechtigt.

Hinweis

Folgen Sie den Voraussetzungen unter Cloud-Audit-Logging-Ereignis empfangen.

Cloud Storage-Bucket erstellen

Erstellen Sie zwei Storage-Buckets in zwei Regionen als Ereignisquelle für den Cloud Run-Dienst:

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}

Nachdem die Ereignisquelle erstellt wurde, stellen Sie den Ereignisempfängerdienst in Cloud Run bereit.

Codebeispiel abrufen

Klonen Sie das Repository:

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

Code prüfen

Der Code dieser Anleitung besteht aus folgenden Elementen:

  • Ein Server, der eingehende Nachrichten verarbeitet, die in ein CloudEvent in der HTTP-POST-Anfrage verpackt sind:

    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)))
  • Ein Dockerfile, das die Betriebsumgebung für den Dienst definiert. Der Inhalt des Dockerfile variiert je nach Sprache:

    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

Code versenden

So versenden Sie den Code:

  1. Erstellen Sie das Container-Image mit Cloud Build und laden Sie es in Container Registry hoch:

    Go

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

    Ersetzen Sie PROJECT_ID durch Ihre Google Cloud-Projekt-ID. Sie können Ihre aktuelle Projekt-ID mithilfe von gcloud config get-value project prüfen.

    Bei Erfolg wird eine entsprechende Meldung mit der ID, Erstellungszeit und dem Image-Namen angezeigt. Das Image wird in Container Registry gespeichert und kann bei Bedarf wiederverwendet werden.

    Java

    1. Verwenden Sie gcloud credential helper, um Docker zum Übertragen des Containers an Container Registry zu autorisieren.
      gcloud auth configure-docker
    2. Verwenden Sie das Jib-Maven-Plug-in, um den Container zu erstellen und per Push in Container Registry zu übertragen.

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

      Ersetzen Sie PROJECT_ID durch Ihre Google Cloud-Projekt-ID.

      audit-storage ist der Containername. Prüfen Sie Ihre aktuelle Projekt-ID mit gcloud config get-value project. Bei Erfolg wird eine entsprechende Meldung angezeigt. Das Image wird in Container Registry gespeichert und kann bei Bedarf wiederverwendet werden.

    .NET

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

    Ersetzen Sie PROJECT_ID durch Ihre Google Cloud-Projekt-ID. Sie können Ihre aktuelle Projekt-ID mithilfe von gcloud config get-value project prüfen.

    Bei Erfolg wird eine entsprechende Meldung mit der ID, Erstellungszeit und dem Image-Namen angezeigt. Das Image wird in Container Registry gespeichert und kann bei Bedarf wiederverwendet werden.

    Node.js

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

    Ersetzen Sie PROJECT_ID durch Ihre Google Cloud-Projekt-ID. Sie können Ihre aktuelle Projekt-ID mithilfe von gcloud config get-value project prüfen.

    Bei Erfolg wird eine entsprechende Meldung mit der ID, Erstellungszeit und dem Image-Namen angezeigt. Das Image wird in Container Registry gespeichert und kann bei Bedarf wiederverwendet werden.

    Python

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

    Ersetzen Sie PROJECT_ID durch Ihre Google Cloud-Projekt-ID. Sie können Ihre aktuelle Projekt-ID mithilfe von gcloud config get-value project prüfen.

    Bei Erfolg wird eine entsprechende Meldung mit der ID, Erstellungszeit und dem Image-Namen angezeigt. Das Image wird in Container Registry gespeichert und kann bei Bedarf wiederverwendet werden.

  2. Stellen Sie das Container-Image für Cloud Run bereit:

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

    Ersetzen Sie PROJECT_ID durch Ihre GCP-Projekt-ID.
    audit-storage ist der Containername und troubleshoot-service der Name des Cloud Run-Dienstes.

    Beachten Sie, dass das Container-Image für den Dienst und die Region bereitgestellt wird, die Sie zuvor unter gcloud einrichten konfiguriert haben.

  3. Wenn Sie die Bereitstellung in Cloud Run vornehmen, antworten Sie mit y ("Ja") an die Eingabeaufforderung Nicht authentifiziert zulassen. Weitere Informationen zur IAM-basierten Authentifizierung finden Sie unter Eventarc-Rollen und -Berechtigungen.

    Wenn die Bereitstellung erfolgreich war, wird in der Befehlszeile die Dienst-URL angezeigt.

Trigger erstellen

Nachdem Sie einen Cloud Run-Dienst bereitgestellt haben, richten Sie einen Trigger ein, um über Audit-Logs Ereignisse aus Cloud Storage zu überwachen.

  1. Erstellen Sie einen Audit-Log-Trigger, um Cloud Storage-Ereignisse zu überwachen:

    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
    

    Dadurch wird ein Trigger mit dem Namen troubleshoot-trigger erstellt.

  2. Führen Sie den folgenden Befehl aus, um zu prüfen, ob troubleshoot-trigger erstellt wurde:

    gcloud eventarc triggers list
    

    troubleshoot-trigger wird mit dem Ziel troubleshoot-service angezeigt.

Problem untersuchen

So prüfen Sie, ob der Dienst erfolgreich bereitgestellt wurde und die Ereignisse aus Cloud Storage empfangen werden können:

  1. Erstellen Sie eine Datei und laden Sie sie in den ersten Storage-Bucket hoch:

     echo "Hello World" > random.txt
     gsutil cp random.txt gs://${BUCKET1}/random.txt
    
  2. Beobachten Sie die Logs, um zu prüfen, ob der Dienst ein Ereignis empfangen hat. Die Dienstlogs zeigen, dass der Dienst Ereignisse überwacht, was auf ein Problem mit der Einrichtung hinweist:

    Now listening on: http://0.0.0.0:8080

Problem untersuchen

Sie können nun den Grund dafür ermitteln, warum der Dienst keine Ereignisse empfängt.

Audit-Logs

In dieser Anleitung werden Cloud Storage-Ereignisse über Audit-Logs ausgegeben und an Cloud Run gesendet. Prüfen Sie, ob die Audit-Logs für Cloud Storage aktiviert sind.

  1. Rufen Sie die Seite IAM und Admin > Audit-Logs auf und wählen Sie das Kästchen Google Cloud Storage aus. Zur Cloud-Audit-Logging-Konsole
  2. Achten Sie darauf, dass die Logtypen Lesen durch den Administrator, Daten lesen und Daten schreiben für Cloud-Audit-Logging ausgewählt sind.

Nachdem Sie Cloud-Audit-Logging aktiviert haben, laden Sie die Datei noch einmal und prüfen Sie die Logs. Wenn der Dienst immer noch keine Ereignisse empfängt, kann dies mit dem Triggerstandort zusammenhängen.

Triggerstandort

Es können mehrere Ressourcen an verschiedenen Standorten vorhanden sein und Sie müssen nach Ereignissen aus Quellen filtern, die sich in derselben Region wie das Cloud Run-Ziel befinden. Weitere Informationen finden Sie unter Von Eventarc unterstützte Standorte.

In dieser Anleitung haben Sie den Cloud Run-Dienst in us-central1 bereitgestellt. Sie haben auch am selben Standort einen Trigger erstellt, da eventarc/location auf us-central1 festgelegt war.

Beschreiben Sie den Trigger, um den Standort des Triggers aufzulisten:

gcloud eventarc triggers describe troubleshoot-trigger

Sie haben jedoch zwei Buckets an den Standorten us-east1 und us-west1 erstellt. Wenn Sie Ereignisse von diesen Standorten erhalten möchten, müssen Sie Trigger an diesen Standorten erstellen. Erstellen Sie nun einen Trigger in us-east1.

  1. Löschen Sie den vorhandenen Trigger am Standort us-central1:

       gcloud eventarc triggers delete troubleshoot-trigger
    
  2. Legen Sie als Standort und Region us-east1 fest:

      gcloud config set eventarc/location us-east1
      gcloud config set run/region us-east1
    
  3. Senden Sie den Code noch einmal.

  4. Erstellen Sie einen neuen Trigger am Standort 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. Prüfen Sie, ob der Trigger erstellt wird:

       gcloud eventarc triggers list
    

Die Initialisierung eines Triggers kann bis zu zehn Minuten dauern, bevor Ereignisse gesendet werden.

Zeitpunkt der Initialisierung

Nachdem die Trigger erstellt wurden, kann es bis zu 10 Minuten dauern, bis die Ereignisse fließen. Führen Sie den folgenden Befehl aus, um zu prüfen, ob die Trigger aktiv sind:

   gcloud eventarc triggers list

Eine ähnliche Ausgabe wird angezeigt, die den Status des Triggers angibt:

    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

Laden Sie nach zehn Minuten eine Datei in jeden Bucket hoch. Ereignisse für jede Datei werden in die Cloud Run-Dienstlogs geschrieben. Wenn der Dienst keine Ereignisse empfängt, kann dies mit der Größe der Ereignisse zusammenhängen.

Termingröße

Die von Ihnen gesendeten Ereignisse dürfen die Limits für die Ereignisgröße (512 KB) nicht überschreiten.

Ein Trigger, der zuvor bereitgestellte Ereignisse gesendet hat, funktioniert nicht mehr

  1. Prüfen Sie, ob die Quelle Ereignisse generiert. Prüfen Sie die Cloud-Audit-Logs und achten Sie darauf, dass der überwachte Dienst Logs ausgibt. Wenn Logs aufgezeichnet, aber keine Ereignisse zugestellt werden, wenden Sie sich an den Support.

  2. Prüfen Sie, ob ein Pub/Sub-Thema mit demselben Triggernamen vorhanden ist.

    1. Informationen zum Auflisten von Triggern finden Sie unter gcloud eventarc triggers list.
    2. Führen Sie folgenden Befehl aus, um die Pub/Sub-Themen aufzulisten:

        gcloud pubsub topics list
      

    Prüfen Sie, ob der Name des Pub/Sub-Themas den Namen des erstellten Triggers enthält. Wenn das Pub/Sub-Thema fehlt, erstellen Sie ein Thema, wenn Sie den Trigger erstellen.

  3. Prüfen Sie den Status des Pub/Sub-Themas:

    1. Prüfen Sie, ob auf dem Tab Trigger ein Häkchen angezeigt wird. Wechseln Sie in der Cloud Console zu Cloud Run und wählen Sie den erstellten Dienst aus. Wechseln Sie dann zum Tab Trigger.

    2. Öffnen Sie Pub/Sub > Themen und klicken Sie auf das Pub/Sub-Thema.

      Zu Pub/Sub-Themen

    3. Beobachten Sie, ob Nachrichten zum Thema mit dem Messwert veröffentlicht werden: topic/send_message_operation_count. Wenn keine Nachrichten zum Thema veröffentlicht werden, prüfen Sie Cloud-Audit-Logs und achten Sie darauf, dass der überwachte Dienst Logs ausgibt. Wenn Logs aufgezeichnet, aber keine Ereignisse zugestellt werden, wenden Sie sich an den Support.

      Themenmesswert

    4. Beobachten Sie, ob Nachrichten erfolgreich an Cloud Run mit dem Messwert subscription/push_request_count gesendet wurden (response_code).

      1. Rufen Sie in der Cloud Console Cloud Monitoring auf.

        Zu Monitoring

      2. Fügen Sie Ihr Projekt zu einem neuen Workspace hinzu.

      3. Klicken Sie auf Dashboards und wählen Sie das Dashboard Cloud Pub/Sub aus.

      4. Klicken Sie im Dashboard Cloud Pub/Sub auf das von Ihnen erstellte Pub/Sub-Thema.

      5. Klicken Sie im Abschnitt Vorfälle auf Richtlinie erstellen.

      6. Klicken Sie auf der Seite Benachrichtigungsrichtlinie erstellen auf Bedingung hinzufügen.

      7. Geben Sie auf dem Tab Messwert die folgenden Bedingungen an:

        • Cloud Pub/Sub-Abo als Ressourcentyp.
        • Push-Anfragen als Messwert.
        • response_code als Gruppieren nach.
        • 0 als Konfigurationsschwellenwert. Abomesswert Weitere Informationen zu Nutzungsmesswerten für Pub/Sub finden Sie unter Push-Abos beobachten.
      8. Klicken Sie auf Hinzufügen, um die Seite Benachrichtigungsrichtlinie erstellen aufzurufen.

      9. Geben Sie im Abschnitt Wie kann das Problem behoben werden? einen Benachrichtigungsnamen ein, z. B. samplealert, und klicken Sie auf Speichern.

      10. Sie können sich die Benachrichtigung unter Monitoring > Dashboard > Cloud Pub/Sub ansehen. Klicken Sie auf das Thema Pub/Sub und dann auf den Tab Abo.

      Wenn Push-Fehler gemeldet werden, prüfen Sie die Cloud Run-Dienstlogs. Wenn der empfangende Endpunkt einen Statuscode zurückgibt, der nicht "OK" ist, weist dies darauf hin, dass der Cloud Run-Code nicht wie erwartet funktioniert. Wenden Sie sich in diesem Fall an den Support.

Bereinigen

Wenn Sie ein neues Projekt für diese Anleitung erstellt haben, löschen Sie das Projekt. Wenn Sie ein vorhandenes Projekt verwendet haben und es beibehalten möchten, ohne die Änderungen in dieser Anleitung hinzuzufügen, löschen Sie die für die Anleitung erstellten Ressourcen.

Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten, wenn Sie das zum Ausführen der Anleitung erstellte Projekt löschen.

So löschen Sie das Projekt:

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Anleitungsressourcen löschen

  1. Löschen Sie den Cloud Run-Dienst, den Sie in dieser Anleitung bereitgestellt haben:

    gcloud run services delete SERVICE-NAME

    Dabei ist SERVICE-NAME der von Ihnen ausgewählte Dienstname.

    Sie können Cloud Run-Dienste auch über die Google Cloud Console löschen.

  2. Entfernen Sie die gcloud-Standardkonfigurationen, die Sie während der Einrichtung der Anleitung hinzugefügt haben.

    Entfernen Sie die Regionseinstellung:

     gcloud config unset run/region
    
  3. Entfernen Sie die Projektkonfiguration:

     gcloud config unset project
    
  4. Löschen Sie sonstige Google Cloud-Ressourcen, die in dieser Anleitung erstellt wurden:

    • Löschen Sie den Trigger:
      gcloud eventarc triggers delete TRIGGER_NAME
      
      Ersetzen Sie TRIGGER_NAME durch den Namen des Triggers.

    • Löschen Sie das Container-Image mit dem Namen gcr.io/PROJECT_ID/audit-storage aus Container Registry. Ersetzen Sie PROJECT_ID durch Ihre Google Cloud-Projekt-ID.

Bereinigen

  • Informationen zum Beheben anderer Probleme in Verbindung mit Eventarc finden Sie unter Fehlerbehebung.