Tutorial: Men-debug peristiwa pemilihan rute ke Cloud Run


Tutorial ini mengajarkan cara memecahkan masalah error runtime yang dialami saat Anda menggunakan Eventarc untuk merutekan peristiwa dari Cloud Storage ke layanan Cloud Run yang tidak diautentikasi menggunakan Cloud Audit Logs.

Tujuan

Tutorial ini menunjukkan kepada Anda cara menyelesaikan tugas-tugas berikut:

  1. Buat repositori standar Artifact Registry untuk menyimpan image container Anda.
  2. Membuat bucket Cloud Storage untuk menjadi sumber peristiwa.
  3. Mem-build, mengupload, dan men-deploy image container ke Cloud Run.
  4. Membuat pemicu Eventarc.
  5. Upload file ke bucket Cloud Storage.
  6. Memecahkan masalah dan memperbaiki error runtime.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna Google Cloud baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Sebelum memulai

Batasan keamanan yang ditentukan oleh organisasi mungkin mencegah Anda menyelesaikan langkah-langkah berikut. Untuk mengetahui informasi pemecahan masalah, lihat Mengembangkan aplikasi di lingkungan Google Cloud yang terbatas.

  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. To initialize the gcloud CLI, run the following command:

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

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

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Storage, Eventarc, and Pub/Sub APIs:

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com storage.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

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

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

  10. Make sure that billing is enabled for your Google Cloud project.

  11. Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Storage, Eventarc, and Pub/Sub APIs:

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com storage.googleapis.com
  12. Jika Anda adalah project creator, Anda diberi peran Pemilik dasar (roles/owner). Secara default, peran Identity and Access Management (IAM) ini mencakup izin yang diperlukan untuk akses penuh ke sebagian besar resource Google Cloud dan Anda dapat melewati langkah ini.

    Jika Anda bukan project creator, izin yang diperlukan harus diberikan pada project kepada akun utama yang sesuai. Misalnya, akun utama dapat berupa Akun Google (untuk pengguna akhir) atau akun layanan (untuk aplikasi dan workload komputasi). Untuk mengetahui informasi selengkapnya, lihat halaman eran dan izin untuk tujuan peristiwa Anda.

    Perhatikan bahwa secara default, izin Cloud Build mencakup izin untuk mengupload dan mendownload artefak Artifact Registry.

    Izin yang diperlukan

    Untuk mendapatkan izin yang Anda perlukan untuk menyelesaikan tutorial ini, minta administrator untuk memberi Anda peran IAM berikut di project Anda:

    Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

    Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

  13. Untuk Cloud Storage, aktifkan logging audit untuk jenis akses data ADMIN_READ, DATA_WRITE, dan DATA_READ.

    1. Baca kebijakan Identity and Access Management (IAM) yang terkait dengan project, folder, atau organisasi Google Cloud Anda, lalu simpan dalam file sementara:
      gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
    2. Di editor teks, buka /tmp/policy.yaml, lalu tambahkan atau ubah hanya konfigurasi log audit di bagian auditConfigs:

      auditConfigs:
      - auditLogConfigs:
        - logType: ADMIN_READ
        - logType: DATA_WRITE
        - logType: DATA_READ
        service: storage.googleapis.com
      bindings:
      - members:
      [...]
      etag: BwW_bHKTV5U=
      version: 1
    3. Tulis kebijakan IAM baru Anda:
      gcloud projects set-iam-policy PROJECT_ID /tmp/policy.yaml

      Jika perintah sebelumnya melaporkan konflik dengan perubahan lain, ulangi langkah-langkah ini, dimulai dengan membaca kebijakan IAM. Untuk informasi selengkapnya, lihat Mengonfigurasi log audit Akses Data dengan API.

  14. Berikan peran eventarc.eventReceiver ke akun layanan Compute Engine:

    export PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')"
    
    gcloud projects add-iam-policy-binding $(gcloud config get-value project) \
        --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com \
        --role='roles/eventarc.eventReceiver'

  15. Jika Anda mengaktifkan akun layanan Pub/Sub pada atau sebelum 8 April 2021, berikan peran iam.serviceAccountTokenCreator ke akun layanan Pub/Sub:

    gcloud projects add-iam-policy-binding $(gcloud config get-value project) \
        --member="serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"\
        --role='roles/iam.serviceAccountTokenCreator'

  16. Tetapkan default yang digunakan dalam tutorial ini:
    export REGION=us-central1
    gcloud config set run/region ${REGION}
    gcloud config set run/platform managed
    gcloud config set eventarc/location ${REGION}

Membuat repositori standar Artifact Registry

Buat repositori standar Artifact Registry untuk menyimpan image container Anda:

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

Ganti REPOSITORY dengan nama unik untuk repositori.

Membuat bucket Cloud Storage

Buat bucket Cloud Storage di setiap dua region sebagai sumber peristiwa untuk layanan Cloud Run:

  1. Buat bucket di us-east1:

    export BUCKET1="troubleshoot-bucket1-PROJECT_ID"
    gsutil mb -l us-east1 gs://${BUCKET1}
  2. Buat bucket di us-west1:

    export BUCKET2="troubleshoot-bucket2-PROJECT_ID"
    gsutil mb -l us-west1 gs://${BUCKET2}

Setelah sumber peristiwa dibuat, deploy layanan penerima peristiwa di Cloud Run.

Men-deploy penerima peristiwa

Deploy layanan Cloud Run yang menerima dan mencatat peristiwa ke dalam log.

  1. Ambil contoh kode dengan meng-clone repositori GitHub:

    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
    
  2. Tinjau kode untuk tutorial ini yang terdiri dari:

    • Pengendali peristiwa yang menerima peristiwa masuk sebagai CloudEvent dalam permintaan POST HTTP:

      Go

      
      // Processes CloudEvents containing Cloud Audit Logs for Cloud Storage
      package main
      
      import (
      	"fmt"
      	"log"
      	"net/http"
      	"os"
      
      	cloudevent "github.com/cloudevents/sdk-go/v2"
      )
      
      // HelloEventsStorage receives and processes a Cloud Audit Log event with Cloud Storage data.
      func HelloEventsStorage(w http.ResponseWriter, r *http.Request) {
      	if r.Method != http.MethodPost {
      		http.Error(w, "Expected HTTP POST request with CloudEvent payload", http.StatusMethodNotAllowed)
      		return
      	}
      
      	event, err := cloudevent.NewEventFromHTTPRequest(r)
      	if err != nil {
      		log.Printf("cloudevent.NewEventFromHTTPRequest: %v", err)
      		http.Error(w, "Failed to create CloudEvent from request.", http.StatusBadRequest)
      		return
      	}
      	s := fmt.Sprintf("Detected change in Cloud Storage bucket: %s", event.Subject())
      	fmt.Fprintln(w, s)
      }
      

      Java

      import io.cloudevents.CloudEvent;
      import io.cloudevents.rw.CloudEventRWException;
      import io.cloudevents.spring.http.CloudEventHttpUtils;
      import org.springframework.http.HttpHeaders;
      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 {
      
        @RequestMapping(value = "/", method = RequestMethod.POST, consumes = "application/json")
        public ResponseEntity<String> receiveMessage(
            @RequestBody String body, @RequestHeader HttpHeaders headers) {
          CloudEvent event;
          try {
            event =
                CloudEventHttpUtils.fromHttp(headers)
                    .withData(headers.getContentType().toString(), body.getBytes())
                    .build();
          } catch (CloudEventRWException e) {
            return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
          }
      
          String ceSubject = event.getSubject();
          String msg = "Detected change in Cloud Storage bucket: " + ceSubject;
          System.out.println(msg);
          return new ResponseEntity<>(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

      @app.route("/", methods=["POST"])
      def index():
          # Create a CloudEvent object from the incoming request
          event = from_http(request.headers, request.data)
          # Gets the GCS bucket name from the CloudEvent
          # Example: "storage.googleapis.com/projects/_/buckets/my-bucket"
          bucket = event.get("subject")
      
          print(f"Detected change in Cloud Storage bucket: {bucket}")
          return (f"Detected change in Cloud Storage bucket: {bucket}", 200)
      
      
    • Server yang menggunakan pengendali peristiwa:

      Go

      
      func main() {
      	http.HandleFunc("/", HelloEventsStorage)
      	// Determine port for HTTP service.
      	port := os.Getenv("PORT")
      	if port == "" {
      		port = "8080"
      	}
      	// Start HTTP server.
      	log.Printf("Listening on port %s", port)
      	if err := http.ListenAndServe(":"+port, nil); err != nil {
      		log.Fatal(err)
      	}
      }
      

      Java

      
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      
      @SpringBootApplication
      public class Application {
        public static void main(String[] args) {
          SpringApplication.run(Application.class, args);
        }
      }

      .NET

          public static void Main(string[] args)
          {
              CreateHostBuilder(args).Build().Run();
          }
          public static IHostBuilder CreateHostBuilder(string[] args)
          {
              var port = Environment.GetEnvironmentVariable("PORT") ?? "8080";
              var url = $"http://0.0.0.0:{port}";
      
              return Host.CreateDefaultBuilder(args)
                  .ConfigureWebHostDefaults(webBuilder =>
                  {
                      webBuilder.UseStartup<Startup>().UseUrls(url);
                  });
          }
      

      Node.js

      const app = require('./app.js');
      const PORT = parseInt(process.env.PORT) || 8080;
      
      app.listen(PORT, () =>
        console.log(`nodejs-events-storage listening on port ${PORT}`)
      );

      Python

      import os
      
      from cloudevents.http import from_http
      
      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)))
    • Dockerfile yang menentukan lingkungan operasi untuk layanan. Konten Dockerfile bervariasi menurut bahasa:

      Go

      
      # Use the official Go image to create a binary.
      # This is based on Debian and sets the GOPATH to /go.
      # https://hub.docker.com/_/golang
      FROM golang:1.23-bookworm 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:bookworm-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 image to create a build artifact.
      # https://hub.docker.com/_/maven
      FROM maven:3-eclipse-temurin-17-alpine 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 Eclipse Temurin for base image.
      # https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
      FROM eclipse-temurin:17.0.13_11-jre-alpine
      
      # 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/sdk:8.0-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/aspnet:8.0-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 image.
      # https://hub.docker.com/_/node
      FROM node:20-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 need a deterministic and repeatable build create a 
      # package-lock.json file and use npm ci:
      # RUN npm ci --omit=dev
      # if you need to include development dependencies during development
      # of your application, use:
      # RUN npm install --dev
      
      RUN npm install --omit=dev
      
      # 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.11-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

  3. Build image container Anda dengan Cloud Build dan upload image ke Artifact Registry:

    export PROJECT_ID=$(gcloud config get-value project)
    export SERVICE_NAME=troubleshoot-service
    gcloud builds submit --tag $REGION-docker.pkg.dev/${PROJECT_ID}/REPOSITORY/${SERVICE_NAME}:v1
  4. Men-deploy image container ke Cloud Run

    gcloud run deploy ${SERVICE_NAME} \
        --image $REGION-docker.pkg.dev/${PROJECT_ID}/REPOSITORY/${SERVICE_NAME}:v1 \
        --allow-unauthenticated

    Jika deployment berhasil, command line akan menampilkan URL layanan.

Buat pemicu

Setelah men-deploy layanan Cloud Run, siapkan pemicu untuk memproses peristiwa dari Cloud Storage melalui log audit.

  1. Buat pemicu Eventarc untuk memproses peristiwa Cloud Storage yang dirutekan menggunakan Cloud Audit Logs:

    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
    

    Tindakan ini akan membuat pemicu yang disebut troubleshoot-trigger.

  2. Untuk mengonfirmasi bahwa troubleshoot-trigger telah dibuat, jalankan:

    gcloud eventarc triggers list
    

    Outputnya akan mirip dengan berikut ini:

    NAME: troubleshoot-trigger
    TYPE: google.cloud.audit.log.v1.written
    DESTINATION: Cloud Run service: troubleshoot-service
    ACTIVE: By 20:03:37
    LOCATION: us-central1
    

Membuat dan melihat peristiwa

Pastikan Anda telah berhasil men-deploy layanan dan dapat menerima peristiwa dari Cloud Storage.

  1. Buat dan upload file ke bucket penyimpanan BUCKET1:

     echo "Hello World" > random.txt
     gsutil cp random.txt gs://${BUCKET1}/random.txt
    
  2. Pantau log untuk memeriksa apakah layanan menerima peristiwa. Untuk melihat entri log, selesaikan langkah-langkah berikut:

    1. Filter entri log dan tampilkan output dalam format JSON:

      gcloud logging read "resource.labels.service_name=troubleshoot-service \
          AND textPayload:random.txt" \
          --format=json
    2. Cari entri log yang mirip dengan:

      "textPayload": "Detected change in Cloud Storage bucket: ..."
      

Perhatikan bahwa, pada awalnya, tidak ada entri log yang ditampilkan. Hal ini menunjukkan bahwa ada masalah dalam penyiapan yang harus Anda selidiki.

Menyelidiki masalah

Lakukan proses penyelidikan mengapa layanan tidak menerima peristiwa.

Waktu inisialisasi

Meskipun pemicu Anda langsung dibuat, diperlukan waktu hingga dua menit agar pemicu diterapkan dan memfilter peristiwa. Jalankan perintah berikut untuk mengonfirmasi bahwa pemicu aktif:

gcloud eventarc triggers list

Output menunjukkan status pemicu. Dalam contoh berikut, troubleshoot-trigger akan aktif pada pukul 14.16.56:

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

Setelah pemicu aktif, upload file lagi ke bucket penyimpanan. Peristiwa dicatat dalam log layanan Cloud Run. Jika layanan tidak menerima peristiwa, hal ini mungkin terkait dengan ukuran peristiwa.

Log audit

Dalam tutorial ini, peristiwa Cloud Storage dirutekan menggunakan Cloud Audit Logs dan dikirim ke Cloud Run. Pastikan log audit diaktifkan untuk Cloud Storage.

  1. Di Konsol Google Cloud, buka halaman Audit logs.

    Buka Log audit

  2. Centang kotak Google Cloud Storage.
  3. Pastikan jenis log Admin Read, Data Read, dan Data Write dipilih.

Setelah mengaktifkan Log Audit Cloud, upload file lagi ke bucket penyimpanan dan periksa log. Jika layanan masih tidak menerima peristiwa, hal ini mungkin terkait dengan lokasi pemicu.

Lokasi pemicu

Mungkin ada beberapa resource di lokasi yang berbeda dan Anda harus memfilter peristiwa dari sumber yang berada di region yang sama dengan target Cloud Run. Untuk informasi selengkapnya, lihat lokasi yang didukung oleh Eventarc dan Memahami lokasi Eventarc.

Dalam tutorial ini, Anda telah men-deploy layanan Cloud Run ke us-central1. Karena menetapkan eventarc/location ke us-central1, Anda juga membuat pemicu di lokasi yang sama.

Namun, Anda membuat dua bucket Cloud Storage di lokasi us-east1 dan us-west1. Untuk menerima peristiwa dari lokasi tersebut, Anda harus membuat pemicu Eventarc di lokasi tersebut.

Buat pemicu Eventarc yang terletak di us-east1:

  1. Konfirmasi lokasi pemicu yang ada:

    gcloud eventarc triggers describe troubleshoot-trigger
    
  2. Tetapkan lokasi dan region ke us-east1:

    gcloud config set eventarc/location us-east1
    gcloud config set run/region us-east1
    
  3. Deploy penerima peristiwa lagi dengan mem-build dan men-deploy image container ke Cloud Run.

  4. Buat pemicu baru yang terletak di us-east1:

    gcloud eventarc triggers create troubleshoot-trigger-new \
      --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. Pastikan pemicu dibuat:

    gcloud eventarc triggers list
    

    Pemicu dapat memerlukan waktu hingga dua menit untuk melakukan inisialisasi sebelum mulai merutekan peristiwa.

  6. Untuk mengonfirmasi bahwa pemicu kini di-deploy dengan benar, buat dan lihat peristiwa.

Masalah lain yang mungkin Anda temui

Anda mungkin mengalami masalah lain saat menggunakan Eventarc.

Ukuran peristiwa

Peristiwa yang Anda kirim tidak boleh melebihi batas ukuran peristiwa.

Pemicu yang sebelumnya mengirimkan peristiwa telah berhenti berfungsi

  1. Pastikan sumber menghasilkan peristiwa. Periksa Cloud Audit Logs dan pastikan layanan yang dipantau memunculkan log. Jika log dicatat, tetapi peristiwa tidak dikirim, hubungi dukungan.

  2. Pastikan topik Pub/Sub dengan nama pemicu yang sama sudah ada. Eventarc menggunakan Pub/Sub sebagai lapisan transpornya dan akan menggunakan topik Pub/Sub yang ada atau akan otomatis membuat topik dan mengelolanya untuk Anda.

    1. Untuk mencantumkan pemicu, lihat gcloud eventarc triggers list.
    2. Untuk mencantumkan topik Pub/Sub, jalankan:

      gcloud pubsub topics list
      
    3. Pastikan nama topik Pub/Sub menyertakan nama pemicu yang dibuat. Contoh:

      name: projects/PROJECT_ID/topics/eventarc-us-east1-troubleshoot-trigger-new-123

    Jika topik Pub/Sub tidak ada, buat pemicu lagi untuk penyedia, jenis peristiwa, dan tujuan Cloud Run tertentu.

  3. Pastikan pemicu telah dikonfigurasi untuk layanan.

    1. Di konsol Google Cloud, buka halaman Services.

      Buka Layanan

    2. Klik nama layanan untuk membuka halaman Detail layanan.

    3. Klik tab Trigger.

      Pemicu Eventarc yang terkait dengan layanan harus tercantum.

  4. Verifikasi status topik dan langganan Pub/Sub menggunakan jenis metrik Pub/Sub.

    • Anda dapat memantau pesan yang diteruskan dan tidak dapat dikirim menggunakan metrik subscription/dead_letter_message_count. Metrik ini menunjukkan jumlah pesan yang tidak dapat dikirim yang diteruskan Pub/Sub dari langganan.

      Jika pesan tidak dipublikasikan ke topik, periksa Cloud Audit Logs dan pastikan layanan yang dipantau memunculkan log. Jika log dicatat, tetapi peristiwa tidak dikirim, hubungi dukungan.

    • Anda dapat memantau langganan push menggunakan metrik subscription/push_request_count dan mengelompokkan metrik menurut response_code dan subcription_id.

      Jika error push dilaporkan, periksa log layanan Cloud Run. Jika endpoint penerima menampilkan kode status non-OK, hal ini menunjukkan bahwa kode Cloud Run tidak berfungsi seperti yang diharapkan dan Anda harus menghubungi dukungan.

    Untuk mengetahui informasi selengkapnya, lihat Membuat kebijakan pemberitahuan batas metrik.

Pembersihan

Jika Anda membuat project baru untuk tutorial ini, hapus project tersebut. Jika Anda menggunakan project yang ada dan ingin mempertahankannya tanpa perubahan yang ditambahkan dalam tutorial ini, hapus resource yang dibuat untuk tutorial.

Menghapus project

Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.

Untuk menghapus project:

  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.

Menghapus referensi tutorial

  1. Hapus layanan Cloud Run yang Anda deploy dalam tutorial ini:

    gcloud run services delete SERVICE_NAME

    Dengan SERVICE_NAME adalah nama layanan pilihan Anda.

    Anda juga dapat menghapus layanan Cloud Run dari Google Cloud Console.

  2. Hapus konfigurasi default gcloud CLI yang Anda tambahkan selama penyiapan tutorial.

    Contoh:

    gcloud config unset run/region

    atau

    gcloud config unset project

  3. Hapus resource Google Cloud lain yang dibuat dalam tutorial ini:

    • Hapus pemicu Eventarc:
      gcloud eventarc triggers delete TRIGGER_NAME
      
      Ganti TRIGGER_NAME dengan nama pemicu Anda.

Langkah berikutnya