Pub/Sub-Ereignisse an einem internen HTTP-Endpunkt in einem VPC-Netzwerk empfangen


In dieser Anleitung erfahren Sie, wie Sie einen internen HTTP-Endpunkt in einem VPC-Netzwerk (Virtual Private Cloud) erstellen, das Pub/Sub-Nachrichtenereignisse mithilfe von Eventarc empfängt. Weitere Informationen zu diesem Ereignisziel finden Sie unter Ereignisse an einen internen HTTP-Endpunkt in einem VPC-Netzwerk weiterleiten.

Sie können die folgenden Befehle über das Google Cloud CLI entweder in Ihrem Terminal oder in Cloud Shell ausführen.

Ziele

In dieser Anleitung wird Folgendes beschrieben:

  1. Erstellen Sie ein VPC-Netzwerk für das Netzwerk Ihrer cloudbasierten Ressourcen und Dienste. Ein VPC-Netzwerk ist logisch von anderen Netzwerken in Google Cloud isoliert.
  2. Erstellen Sie ein Subnetz. Jedes VPC-Netzwerk besteht aus einem oder mehreren IP-Adressbereichen, die als Subnetze bezeichnet werden. Subnetze sind regionale Ressourcen, denen IP-Adressbereiche zugeordnet sind.
  3. Erstellen Sie VPC-Firewallregeln, um Traffic zu oder von VM-Instanzen (VM-Instanzen) in Ihrem VPC-Netzwerk zuzulassen oder abzulehnen.
  4. Erstellen Sie einen Netzwerkanhang, mit dem ein Produzenten-VPC-Netzwerk Verbindungen zu einem Nutzer-VPC-Netzwerk initiieren kann.
  5. Erstellen Sie eine Compute Engine-VM-Instanz im VPC-Netzwerk.
  6. Webserver als Ereignisempfängerdienst auf der VM-Instanz bereitstellen
  7. Sie erstellen einen Eventarc-Trigger, der Pub/Sub-Ereignisse an den Ereignisempfänger auf Ihrer VM-Instanz weiterleitet.
  8. Screenshot: SSH-Verbindung zur VM-Instanz herstellen.
  9. Veröffentlichen Sie eine Nachricht in einem Pub/Sub-Thema, um ein Ereignis zu generieren, und sehen Sie sich den Text des Ereignisses im SSH-Browsertool an.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

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 der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweise

  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 Compute Engine, Eventarc, and Pub/Sub APIs:

    gcloud services enable compute.googleapis.com eventarc.googleapis.com pubsub.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 Compute Engine, Eventarc, and Pub/Sub APIs:

    gcloud services enable compute.googleapis.com eventarc.googleapis.com pubsub.googleapis.com
  12. Aktualisieren Sie die Google Cloud CLI-Komponenten:
    gcloud components update
  13. Melden Sie sich mit Ihrem -Konto an:
    gcloud auth login
  14. Legen Sie die in dieser Kurzanleitung verwendeten Konfigurationsvariablen fest:
    REGION=us-central1
    ZONE=us-central1-a
  15. Wenn Sie der Projektersteller sind, wird Ihnen die einfache Owner-Rolle (roles/owner) zugewiesen. Standardmäßig enthält diese IAM-Rolle (Identity and Access Management) die Berechtigungen, die für den vollständigen Zugriff auf die meisten Google Cloud-Ressourcen erforderlich sind. Sie können diesen Schritt überspringen.

    Wenn Sie nicht der Project Creator sind, müssen dem entsprechenden Hauptkonto die erforderlichen Berechtigungen für das Projekt erteilt werden. Ein Hauptkonto kann beispielsweise ein Google-Konto (für Endnutzer) oder ein Dienstkonto (für Anwendungen und Computing-Arbeitslasten) sein. Weitere Informationen finden Sie auf der Seite Rollen und Berechtigungen für Ihr Ereignisziel.

    Erforderliche Berechtigungen

    Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Ausführen der Kurzanleitung benötigen:

    Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

    Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

  16. Wenn Sie den Cloud Pub/Sub-Dienst-Agent am oder vor dem 8. April 2021 aktiviert haben, um authentifizierte Pub/Sub-Push-Anfragen zu unterstützen, weisen Sie dem von Google verwalteten Dienstkonto die Rolle „Ersteller von Dienstkonto-Tokens“ (roles/iam.serviceAccountTokenCreator) zu. Andernfalls wird diese Rolle standardmäßig zugewiesen:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
    Ersetzen Sie Folgendes:
    • PROJECT_ID: Ihre Google Cloud-Projekt-ID
    • PROJECT_NUMBER: Ihre Google Cloud-Projektnummer. Sie finden Ihre Projektnummer auf der Willkommensseite der Google Cloud Console oder durch Ausführen des folgenden Befehls:
      gcloud projects describe PROJECT_ID --format='value(projectNumber)'

Erstellen Sie ein VPC-Netzwerk im benutzerdefinierten Modus.

Ein VPC-Netzwerk ist eine virtuelle Version eines physischen Netzwerks, die innerhalb des Produktionsnetzwerks von Google implementiert wurde. Sie ermöglicht eine Verbindung für Ihre Compute Engine-VM-Instanzen.

Wenn ein VPC-Netzwerk im benutzerdefinierten Modus erstellt wird, werden keine Subnetze automatisch erstellt. Diese Art von Netzwerk bietet Ihnen vollständige Kontrolle über die Subnetze und IP-Bereiche.

gcloud compute networks create NETWORK_NAME \
    --subnet-mode=custom \
    --bgp-routing-mode=regional \
    --mtu=1460

Ersetzen Sie NETWORK_NAME durch einen Namen für das VPC-Netzwerk.

Wichtige Hinweise:

  • Jedes neu erstellte Netzwerk muss einen Namen haben, der innerhalb desselben Projekts nur einmal vorkommt.
  • Der Routingmodus Border Gateway Protocol (BGP) steuert das Verhalten von Cloud Routern im Netzwerk und kann entweder global oder regional sein. Der Standardwert ist regional.
  • Die maximale Übertragungseinheit (MTU) ist die größte Paketgröße des Netzwerks. MTU kann auf einen beliebigen Wert zwischen 1300 und 8896 gesetzt werden. Der Standardwert ist 1460. Bevor Sie die MTU auf einen höheren Wert als 1460 setzen, lesen Sie die Informationen unter Maximale Übertragungseinheit.

Weitere Informationen finden Sie unter VPC-Netzwerke erstellen und verwalten.

Nur-IPv4-Subnetz erstellen

Ein Netzwerk kann erst verwendet werden, wenn es mindestens ein Subnetz hat.

Legen Sie einen Namen, eine Region und mindestens einen primären IPv4-Adressbereich gemäß den Subnetzregeln fest, wenn Sie ein Subnetz erstellen. Beachten Sie, dass Sie keine Instanzen in einer Region erstellen können, für die kein Subnetz definiert ist.

gcloud compute networks subnets create SUBNET_NAME \
    --region=$REGION \
    --network=NETWORK_NAME \
    --range=10.10.10.0/24

Geben Sie für SUBNET_NAME einen Namen für das neue Subnetz an.

Weitere Informationen finden Sie unter Subnetze.

VPC-Firewallregeln erstellen

Mit Firewallregeln können Sie den Traffic zwischen Ressourcen in einem VPC-Netzwerk auf Grundlage der Portnummer, des Tags oder des Protokolls zulassen oder ablehnen.

VPC-Firewallregeln werden auf Netzwerkebene definiert und gelten nur für das Netzwerk, in dem sie erstellt werden. Der Name für jede Regel muss jedoch für das Projekt eindeutig sein.

  1. Erstellen Sie eine Firewallregel für Ihr VPC-Netzwerk, die eingehenden Traffic von jeder IPv4-Adresse (0.0.0.0/0) zu jeder Instanz im Netzwerk über Port 22 zulässt. Diese Regel ist für die Ereignisübermittlung nicht erforderlich. Erstellen Sie jedoch für diese Anleitung die Regel, damit Sie über SSH eine Verbindung zur VM herstellen können und die Zustellung des Ereignisses bestätigen:

    gcloud compute firewall-rules create RULE_NAME_ONE \
        --network=projects/PROJECT_ID/global/networks/NETWORK_NAME \
        --direction=INGRESS \
        --priority=65534 \
        --action=ALLOW \
        --source-ranges=0.0.0.0/0 \
        --rules=tcp:22
  2. Erstellen Sie eine Firewallregel für Ihr VPC-Netzwerk, die eingehenden Traffic von einem bestimmten IP-Adressbereich zu einer beliebigen Instanz im Netzwerk über Port 80 zulässt, da Sie auf Ihrer VM einen Webserver bereitstellen, der Port 80 überwacht:

    gcloud compute firewall-rules create RULE_NAME_TWO \
        --network=projects/PROJECT_ID/global/networks/NETWORK_NAME \
        --direction=INGRESS \
        --priority=1000 \
        --action=ALLOW \
        --source-ranges=10.10.10.0/24 \
        --rules=tcp:80

    Ersetzen Sie RULE_NAME_ONE und RULE_NAME_TWO durch eindeutige Namen für Ihre Firewallregeln.

    Die Verwendung von --source-ranges ist optional und gibt eine Liste von IP-Adressblöcken an, die eingehende Verbindungen, die der Firewallregel entsprechen, mit den Instanzen im Netzwerk durchführen dürfen. In diesem Fall entspricht der Bereich dem Bereich, der in dem zuvor erstellten Subnetz verwendet wird.

    Wir empfehlen, das Flag zu verwenden, um Ihre Firewallregel speziell auf Eventarc-Traffic anzuwenden. Wenn weder --source-ranges noch --source-tags angegeben ist, ist --source-ranges standardmäßig 0.0.0.0/0. Das bedeutet, dass die Regel für alle eingehenden IPv4-Verbindungen von innerhalb oder außerhalb des netzwerks gilt.

Weitere Informationen finden Sie unter VPC-Firewallregeln verwenden.

Netzwerkanhang erstellen

Ein Netzwerkanhang ist eine Ressource, mit der ein Produzenten-VPC-Netzwerk über eine Private Service Connect-Schnittstelle Verbindungen zu einem Nutzer-VPC-Netzwerk initiieren kann.

Eventarc verwendet zum Veröffentlichen von Ereignissen den Netzwerkanhang, um eine Verbindung zum internen HTTP-Endpunkt herzustellen, der in einem VPC-Netzwerk gehostet wird.

Sie können einen Netzwerkanhang erstellen, der automatisch Verbindungen von jeder Private Service Connect-Schnittstelle akzeptiert, die auf den Netzwerkanhang verweist. Erstellen Sie den Netzwerkanhang im selben Netzwerk und in derselben Region wie der HTTP-Zieldienst.

gcloud compute network-attachments create ATTACHMENT_NAME \
    --region=$REGION \
    --subnets=SUBNET_NAME \
    --connection-preference=ACCEPT_AUTOMATIC

Ersetzen Sie ATTACHMENT_NAME durch einen Namen für den Netzwerkanhang.

Weitere Informationen finden Sie unter Netzwerkanhänge.

VM-Instanz in einem bestimmten Subnetz erstellen

Eine Compute Engine-VM-Instanz ist eine virtuelle Maschine, die in der Infrastruktur von Google gehostet wird. Die Begriffe Compute Engine-Instanz, VM-Instanz und VM werden synonym verwendet. VM-Instanzen umfassen Google Kubernetes Engine-Cluster (GKE), Instanzen der flexiblen App Engine-Umgebung und andere Google Cloud-Produkte, die auf Compute Engine-VMs basieren.

Erstellen Sie eine Compute Engine-VM-Instanz im VPC-Netzwerk, für das Sie einen Ereignisempfängerdienst bereitstellen können.

gcloud compute instances create INSTANCE_NAME \
      --zone=$ZONE \
      --machine-type=e2-medium \
      --subnet=SUBNET_NAME

Ersetzen Sie INSTANCE_NAME durch einen Namen für die VM.

Weitere Informationen finden Sie unter VM-Instanz erstellen und starten.

Ereignisempfänger auf der VM bereitstellen

Stellen Sie einen Webserver auf Ihrer VM bereit, der Port 80 überwacht und Ereignisse empfängt und protokolliert.

  1. Stellen Sie mithilfe der SSH-Schaltfläche in der Google Cloud Console eine SSH-Verbindung zu Ihrer VM-Instanz her, um eine Verbindung zur VM herzustellen.

    Nachdem eine Verbindung zum SSH-Server hergestellt wurde, verwenden Sie das Terminal "SSH im Browser", um Befehle auf der VM-Instanz auszuführen.

  2. Erstellen Sie im "SSH im Browser"-Terminal eine Textdatei mit dem Dateinamen server.py, die den folgenden Python-Code enthält:

    #!/usr/bin/env python3
    from http.server import BaseHTTPRequestHandler, HTTPServer
    import logging
    
    class S(BaseHTTPRequestHandler):
        def _set_response(self):
            self.send_response(200)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
    
        def do_GET(self):
            logging.info("GET request,\nPath: %s\nHeaders:\n%s\n", str(self.path), str(self.headers))
            self._set_response()
            self.wfile.write("GET request for {}".format(self.path).encode('utf-8'))
    
        def do_POST(self):
            content_length = int(self.headers['Content-Length'])
            post_data = self.rfile.read(content_length)
            logging.info("POST request,\nPath: %s\nHeaders:\n%s\n\nBody:\n%s\n",
                    str(self.path), str(self.headers), post_data.decode('utf-8'))
    
            self._set_response()
            self.wfile.write("POST request for {}".format(self.path).encode('utf-8'))
    
    def run(server_class=HTTPServer, handler_class=S, port=80):
        logging.basicConfig(level=logging.INFO)
        server_address = ('', port)
        http_server = server_class(server_address, handler_class)
        logging.info('Starting HTTP Server at port %d...\n', port)
        try:
            http_server.serve_forever()
        except KeyboardInterrupt:
            pass
        http_server.server_close()
        logging.info('Stopping HTTP Server...\n')
    
    if __name__ == '__main__':
        from sys import argv
    
        if len(argv) == 2:
            run(port=int(argv[1]))
        else:
            run()
  3. Starten Sie den Server und führen Sie den Server für die verbleibenden Schritte in dieser Anleitung aus:

    sudo python3 server.py
    

Eventarc-Trigger erstellen

Sie erstellen einen Eventarc-Trigger, der ein neues Pub/Sub-Thema erstellt und Ereignisse an den auf der VM bereitgestellten Ereignisempfänger weiterleitet, wenn eine Nachricht im Pub/Sub-Thema veröffentlicht wird.

Zu Testzwecken verwendet der Trigger das Compute Engine-Standarddienstkonto (PROJECT_NUMBER-compute@developer.gserviceaccount.com) für seine Identität. Dieses Dienstkonto wurde nach der Aktivierung der Compute Engine API automatisch erstellt.

Für Produktionsumgebungen empfehlen wir dringend, ein neues Dienstkonto zu erstellen und ihm eine oder mehrere IAM-Rollen zuzuweisen, die die erforderlichen Mindestberechtigungen enthalten und dem Grundsatz der geringsten Berechtigung folgen.

gcloud eventarc triggers create TRIGGER_NAME \
    --location=$REGION \
    --destination-http-endpoint-uri=http://INSTANCE_NAME.$ZONE.c.PROJECT_ID.internal \
    --network-attachment="projects/PROJECT_ID/regions/$REGION/networkAttachments/ATTACHMENT_NAME" \
    --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
    --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com

Ersetzen Sie PROJECT_NUMBER durch Ihre Google Cloud-Projektnummer. Sie finden Ihre Projektnummer auf der Willkommensseite der Google Cloud Console oder durch Ausführen des folgenden Befehls:

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

Weitere Informationen zum Konfigurieren des Triggers finden Sie unter Ereignisse an einen internen HTTP-Endpunkt in einem VPC-Netzwerk weiterleiten.

Generieren Sie ein Pub/Sub-Thema und rufen Sie es auf.

Sie können ein Ereignis generieren, indem Sie eine Nachricht in einem Pub/Sub-Thema veröffentlichen.

  1. Suchen Sie das Pub/Sub-Thema und legen Sie es als Umgebungsvariable fest:

    export MY_TOPIC=$(gcloud eventarc triggers describe TRIGGER_NAME \
        --location=$REGION \
        --format='value(transport.pubsub.topic)')
  2. Senden Sie eine Nachricht an das Pub/Sub-Thema, um ein Ereignis zu generieren:

    gcloud pubsub topics publish $MY_TOPIC --message "Hello World"

    Der Eventarc-Trigger leitet das Ereignis an den internen HTTP-Endpunkt in Ihrem VPC-Netzwerk weiter. Im SSH-Terminal im Browser wird der Text des Ereignisses ausgegeben. Er sollte in etwa so aussehen:

    Body:
    {
        "message": {
            "data": "SGVsbG8gV29ybGQ=",
            "messageId": "8795720366614192",
            "publishTime": "2023-08-26T13:09:48Z"
        }
    }
    
    10.10.10.3 - - [26/Aug/2023 13:09:49] "POST / HTTP/1.1" 200 -
    

    Beachten Sie, dass wenn Sie den data-Wert von SGVsbG8gV29ybGQ= aus seinem Base64-Format decodieren, "Hello World" zurückgegeben wird.

Sie haben einen Ereignisempfängerdienst an einem internen HTTP-Endpunkt in einem VPC-Netzwerk bereitgestellt, einen Eventarc-Trigger erstellt sowie ein Ereignis über Pub/Sub generiert und bestätigt, dass das Ereignis wie erwartet vom Trigger zum Zielendpunkt weitergeleitet wurde.

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

Projekt löschen

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

Einzelne Ressourcen löschen

  1. Löschen Sie den Eventarc-Trigger:
    gcloud eventarc triggers delete TRIGGER_NAME --location=$REGION
  2. Löschen Sie die Instanz:
    gcloud compute instances delete INSTANCE_NAME
  3. Löschen Sie den Netzwerkanhang:
    gcloud compute network-attachments delete ATTACHMENT_NAME --region=$REGION
  4. Löschen Sie die Firewallregeln:
    gcloud compute firewall-rules delete RULE_NAME_ONE
    gcloud compute firewall-rules delete RULE_NAME_TWO
  5. Löschen Sie das Subnetz:
    gcloud compute networks subnets delete SUBNET_NAME --region=$REGION
  6. Löschen Sie das VPC-Netzwerk:
    gcloud compute networks delete NETWORK_NAME

Nächste Schritte