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.

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.

Nachdem Sie die Compute Engine API aktiviert haben, wird als Standarddienstkonto das Compute Engine-Standarddienstkonto (PROJECT_NUMBER-compute@developer.gserviceaccount.com) verwendet. Zu Testzwecken verwendet der Trigger das Standarddienstkonto für seine Identität.

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 die Google CloudProjektnummer. Sie finden Ihre Projektnummer auf der Willkommensseite der Google Cloud -Konsole 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.