Recevoir des événements Pub/Sub sur un point de terminaison HTTP interne dans un réseau VPC


Ce tutoriel explique comment créer un point de terminaison HTTP interne dans un réseau cloud privé virtuel (VPC) qui reçoit des événements de messages Pub/Sub à l'aide d'Eventarc. Pour en savoir plus sur cette destination d'événements, consultez la section Router des événements vers un point de terminaison HTTP interne dans un réseau VPC.

Vous pouvez exécuter les commandes suivantes à l'aide de Google Cloud CLI dans votre terminal ou Cloud Shell.

Objectifs

Au cours de ce tutoriel, vous allez :

  1. Créer un réseau VPC pour assurer la mise en réseau de vos ressources et services basés sur le cloud. Un réseau VPC est isolé de manière logique des autres réseaux dans Google Cloud.
  2. Créez un sous-réseau. Chaque réseau VPC est constitué d'une ou de plusieurs plages d'adresses IP appelées sous-réseaux. Les sous-réseaux sont des ressources régionales et sont associés à des plages d'adresses IP.
  3. Créer des règles de pare-feu VPC afin de pouvoir autoriser ou refuser le trafic vers ou depuis des instances de VM (machine virtuelle) sur votre réseau VPC.
  4. Créer un rattachement de réseau qui permet à un réseau VPC producteur d'initier des connexions à un réseau VPC consommateur.
  5. Créer une instance de VM Compute Engine dans le réseau VPC.
  6. Déployer un serveur Web en tant que service récepteur d'événements sur votre instance de VM.
  7. Créer un déclencheur Eventarc qui achemine les événements Pub/Sub vers le récepteur d'événements sur votre instance de VM.
  8. Établir une connexion SSH vers l'instance de VM.
  9. Publier un message dans un sujet Pub/Sub pour générer un événement et afficher le corps de l'événement dans l'outil SSH du navigateur.

Coûts

Dans ce document, vous utilisez 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é les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.

Avant de commencer

  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. Mettez à jour les composants de Google Cloud CLI :
    gcloud components update
  13. Connectez-vous à votre compte :
    gcloud auth login
  14. Définissez les variables de configuration utilisées dans ce guide de démarrage rapide :
    REGION=us-central1
    ZONE=us-central1-a
  15. Si vous êtes le créateur du projet, vous disposez du rôle de base Propriétaire (roles/owner). Par défaut, ce rôle Identity and Access Management (IAM) inclut les autorisations nécessaires pour accéder à la plupart des ressources Google Cloud. Vous pouvez ignorer cette étape.

    Si vous n'êtes pas le créateur du projet, les autorisations requises doivent être accordées au compte principal approprié sur le projet. Par exemple, un compte principal peut être un compte Google (pour les utilisateurs finaux) ou un compte de service (pour les applications et les charges de travail de calcul). Pour en savoir plus, consultez la page Rôles et autorisations pour la destination de votre événement.

    Autorisations requises

    Pour obtenir les autorisations nécessaires pour suivre ce guide de démarrage rapide, demandez à votre administrateur de vous accorder les rôles IAM suivants sur votre projet :

    Pour en savoir plus sur l'attribution de rôles, consultez la page Gérer l'accès aux projets, aux dossiers et aux organisations.

    Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

  16. Si vous avez activé l'agent de service Cloud Pub/Sub le 8 avril 2021 ou à une date antérieure, attribuez le rôle Créateur de jetons du compte de service (roles/iam.serviceAccountTokenCreator) au compte de service pour accepter les requêtes push Pub/Sub authentifiées. Sinon, ce rôle est attribué par défaut :
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
    Remplacez les éléments suivants :
    • PROJECT_ID : ID de votre projet Google Cloud
    • PROJECT_NUMBER : numéro de votre projet Google Cloud. Vous pouvez trouver le numéro de votre projet sur la page Bienvenue de la console Google Cloud ou en exécutant la commande suivante :
      gcloud projects describe PROJECT_ID --format='value(projectNumber)'

Créer un réseau VPC en mode personnalisé

Un réseau VPC est une version virtuelle d'un réseau physique, mise en œuvre au sein du réseau de production de Google Il fournit une connectivité à vos instances de VM Compute Engine.

Lorsqu'un réseau VPC en mode personnalisé est créé, aucun sous-réseau n'est créé automatiquement. Ce type de réseau vous offre un contrôle total sur ses sous-réseaux et ses plages d'adresses IP.

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

Remplacez NETWORK_NAME par le nom que vous souhaitez donner au réseau VPC.

Veuillez noter les points suivants :

  • Chaque nouveau réseau que vous créez doit posséder un nom unique au sein d'un même projet.
  • Le mode de routage Border Gateway Protocol (BGP) contrôle le comportement des routeurs cloud dans le réseau et peut être global ou regional. La valeur par défaut est regional.
  • Unité de transmission maximale (MTU), qui est la plus grande taille de paquets du réseau. La MTU peut être comprise entre 1300 et 8896. La valeur par défaut est 1460. Avant de définir la MTU sur une valeur supérieure à 1460, consultez la section Unité de transmission maximale.

Pour en savoir plus, consultez la page Créer et gérer des réseaux VPC.

Créer un sous-réseau IPv4 uniquement

Un réseau doit comporter au moins un sous-réseau pour que vous puissiez l'utiliser.

Lorsque vous créez un sous-réseau, vous définissez un nom, une région et au moins une plage d'adresses IPv4 principale conformément aux règles de sous-réseau. Notez que vous ne pouvez pas créer d'instances dans une région où aucun sous-réseau n'est défini.

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

Remplacez SUBNET_NAME par le nom du nouveau sous-réseau.

Pour en savoir plus, consultez la section Sous-réseaux.

Créer des règles de pare-feu VPC

Les règles de pare-feu VPC vous permettent d'autoriser ou de refuser le trafic entre les ressources d'un réseau VPC en fonction du numéro de port, du tag ou du protocole.

Les règles de pare-feu VPC sont définies au niveau du réseau et s'appliquent seulement au réseau sur lequel elles ont été créées. Cependant, le nom que vous sélectionnez pour chacune d'elles doit être unique au projet.

  1. Créez une règle de pare-feu pour votre réseau VPC qui autorise le trafic entrant provenant de n'importe quelle adresse IPv4 (0.0.0.0/0) vers toutes les instances du réseau utilisant le port 22. Cette règle n'est pas requise pour la diffusion d'événements. Toutefois, pour les besoins de ce tutoriel, créez la règle afin de pouvoir vous connecter à la VM à l'aide de SSH et confirmez la diffusion de l'événement :

    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. Créez pour votre réseau VPC une règle de pare-feu qui autorise le trafic entrant provenant d'une plage d'adresses IP spécifique vers toute instance du réseau utilisant le port 80 (car vous allez déployer un serveur Web sur votre VM qui écoute sur le port 80) :

    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

    Remplacez RULE_NAME_ONE et RULE_NAME_TWO par des noms uniques pour vos règles de pare-feu.

    Notez que l'utilisation de --source-ranges est facultative et indique une liste de blocs d'adresses IP autorisés à établir des connexions entrantes qui correspondent à la règle de pare-feu aux instances du réseau. Dans ce cas, la plage correspond à celle utilisée dans le sous-réseau que vous avez créé précédemment.

    Nous vous recommandons d'utiliser l'indicateur pour appliquer votre règle de pare-feu spécifiquement au trafic Eventarc. Si ni --source-ranges, ni --source-tags ne sont spécifiés, --source-ranges est défini par défaut sur 0.0.0.0/0, ce qui signifie que la règle s'applique à toutes les connexions IPv4 entrantes provenant de l'intérieur ou de l'extérieur du réseau.

Pour plus d'informations, consultez la section Utiliser des règles de pare-feu VPC.

Créer un rattachement de réseau

Un rattachement de réseau est une ressource qui permet à un réseau VPC producteur d'établir des connexions à un réseau VPC consommateur via une interface Private Service Connect.

Pour publier des événements, Eventarc utilise le rattachement de réseau pour établir une connexion au point de terminaison HTTP interne hébergé dans un réseau VPC.

Vous pouvez créer un rattachement de réseau qui accepte automatiquement les connexions de n'importe quelle interface Private Service Connect qui fait référence au rattachement de réseau. Créez le rattachement de réseau dans le même réseau et la même région que ceux contenant le service de destination HTTP.

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

Remplacez ATTACHMENT_NAME par le nom du rattachement de réseau.

Pour en savoir plus, consultez la page À propos des rattachements de réseau.

Créer une instance de VM dans un sous-réseau spécifique

Une instance de VM Compute Engine est une machine virtuelle hébergée sur l'infrastructure de Google. Les termes instance Compute Engine, instance de VM et VM sont synonymes et sont utilisés de manière interchangeable. Les instances de VM incluent des clusters Google Kubernetes Engine (GKE), des instances de l'environnement flexible App Engine et d'autres produits Google Cloud basés sur des VM Compute Engine.

Créez une instance de VM Compute Engine dans le réseau VPC sur lequel vous pouvez déployer un service récepteur d'événements.

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

Remplacez INSTANCE_NAME par le nom de la VM.

Pour en savoir plus, consultez la page Créer et démarrer une instance de VM.

Déployer un récepteur d'événements sur la VM

Déployez un serveur Web sur votre VM qui écoute sur le port 80, et qui reçoit et consigne les événements.

  1. Établissez une connexion SSH à votre instance de VM en utilisant le bouton SSH de la console Google Cloud pour vous connecter à votre VM.

    Une fois la connexion au serveur SSH établie, utilisez le terminal SSH du navigateur pour exécuter des commandes sur votre instance de VM.

  2. Dans le terminal SSH du navigateur, créez un fichier texte portant le nom de fichier server.py et contenant le code Python suivant :

    #!/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. Démarrez le serveur et maintenez-le en cours d'exécution pour les étapes restantes de ce tutoriel :

    sudo python3 server.py
    

Créer un déclencheur Eventarc

Créez un déclencheur Eventarc qui crée un sujet Pub/Sub et achemine les événements vers le récepteur d'événements déployé sur la VM lorsqu'un message est publié dans le sujet Pub/Sub.

À des fins de test, le déclencheur utilise le compte de service Compute Engine par défaut (PROJECT_NUMBER-compute@developer.gserviceaccount.com) pour son identité. Ce compte de service a été créé automatiquement après l'activation de l'API Compute Engine.

Veuillez noter que les environnements de production, nous vous recommandons vivement de créer un compte de service et de lui attribuer un ou plusieurs rôles IAM contenant les autorisations minimales requises conformément au principe du moindre privilège.

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

Remplacez PROJECT_NUMBER par votre numéro de projet Google Cloud. Vous pouvez trouver le numéro de votre projet sur la page Bienvenue de la console Google Cloud ou en exécutant la commande suivante :

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

Pour plus d'informations sur la configuration du déclencheur, consultez la section Router des événements vers un point de terminaison HTTP interne dans un réseau VPC.

Générer et afficher un événement de type sujet Pub/Sub.

Vous pouvez générer un événement en publiant un message dans un sujet Pub/Sub.

  1. Recherchez et définissez le sujet Pub/Sub en tant que variable d'environnement :

    export MY_TOPIC=$(gcloud eventarc triggers describe TRIGGER_NAME \
        --location=$REGION \
        --format='value(transport.pubsub.topic)')
  2. Envoyer un message au sujet Pub/Sub pour générer un événement :

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

    Le déclencheur Eventarc achemine l'événement vers le point de terminaison HTTP interne de votre réseau VPC. Dans le terminal SSH du navigateur, le corps de l'événement est généré. Le résultat doit ressembler à ceci :

    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 -
    

    Notez que si vous décodez la valeur data de SGVsbG8gV29ybGQ= à partir de son format Base64, le message "Hello World" est renvoyé.

Vous venez de déployer un service récepteur d'événements sur un point de terminaison HTTP interne d'un réseau VPC, de créer un déclencheur Eventarc, de générer un événement à partir de Pub/Sub et de confirmer que l'événement a été acheminé comme prévu par le déclencheur vers le point de terminaison cible.

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

Supprimer le projet

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

Supprimer des ressources individuelles

  1. Supprimez le déclencheur Eventarc :
    gcloud eventarc triggers delete TRIGGER_NAME --location=$REGION
  2. Supprimez l'instance.
    gcloud compute instances delete INSTANCE_NAME
  3. Supprimez le rattachement de réseau :
    gcloud compute network-attachments delete ATTACHMENT_NAME --region=$REGION
  4. Supprimez les règles de pare-feu :
    gcloud compute firewall-rules delete RULE_NAME_ONE
    gcloud compute firewall-rules delete RULE_NAME_TWO
  5. Supprimez le sous-réseau :
    gcloud compute networks subnets delete SUBNET_NAME --region=$REGION
  6. Supprimez le réseau VPC :
    gcloud compute networks delete NETWORK_NAME

Étapes suivantes