Recibir eventos de Pub/Sub en un endpoint HTTP interno de una red de VPC


En este tutorial se explica cómo crear un endpoint HTTP interno en una red de nube privada virtual (VPC) que recibe eventos de mensajes de Pub/Sub mediante Eventarc. Para obtener más información sobre este destino de eventos, consulta Dirigir eventos a un endpoint HTTP interno en una red de VPC.

Puedes ejecutar los siguientes comandos con la CLI de Google Cloud en tu terminal o en Cloud Shell.

Objetivos

En este tutorial, aprenderás a hacer lo siguiente:

  1. Crea una red VPC para proporcionar redes a tus recursos y servicios basados en la nube. Una red de VPC está aislada lógicamente de otras redes en Google Cloud.
  2. Crea una subred. Cada red de VPC consta de uno o varios intervalos de direcciones IP denominados subredes. Las subredes son recursos regionales y tienen intervalos de direcciones IP asociados.
  3. Crea reglas de cortafuegos de VPC para permitir o denegar el tráfico hacia o desde las instancias de máquina virtual de tu red de VPC.
  4. Crea un acoplamiento de red que permita que una red de VPC de productor inicie conexiones con una red de VPC de consumidor.
  5. Crea una instancia de VM de Compute Engine en la red VPC.
  6. Despliega un servidor web como servicio de receptor de eventos en tu instancia de VM.
  7. Crea un activador de Eventarc que enrute eventos de Pub/Sub al receptor de eventos de tu instancia de VM.
  8. Establece una conexión SSH con la instancia de VM.
  9. Publica un mensaje en un tema de Pub/Sub para generar un evento y consulta el cuerpo del evento en la herramienta SSH en el navegador.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.

Antes de empezar

  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. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  4. Para inicializar gcloud CLI, ejecuta el siguiente comando:

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • 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.

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Compute Engine, Eventarc, and Pub/Sub APIs:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable compute.googleapis.com eventarc.googleapis.com pubsub.googleapis.com
  8. Install the Google Cloud CLI.

  9. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  10. Para inicializar gcloud CLI, ejecuta el siguiente comando:

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • 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.

  12. Verify that billing is enabled for your Google Cloud project.

  13. Enable the Compute Engine, Eventarc, and Pub/Sub APIs:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable compute.googleapis.com eventarc.googleapis.com pubsub.googleapis.com
  14. Actualiza los componentes de Google Cloud CLI:
    gcloud components update
  15. Inicia sesión con tu cuenta:
    gcloud auth login
  16. Define las variables de configuración que se usan en esta guía de inicio rápido:
    REGION=us-central1
    ZONE=us-central1-a
  17. Si has creado el proyecto, se te asignará el rol básico Propietario (roles/owner). De forma predeterminada, este rol de gestión de identidades y accesos (IAM) incluye los permisos necesarios para acceder por completo a la mayoría de los recursos Google Cloud, por lo que puedes saltarte este paso.

    Si no eres el creador del proyecto, debes conceder los permisos necesarios al principal correspondiente. Por ejemplo, una entidad principal puede ser una cuenta de Google (para usuarios finales) o una cuenta de servicio (para aplicaciones y cargas de trabajo de computación). Para obtener más información, consulta la página Roles y permisos de tu destino de evento.

    Permisos obligatorios

    Para obtener los permisos que necesitas para completar esta guía de inicio rápido, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en tu proyecto:

    Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

    También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

  18. Si habilitaste el agente de servicio de Cloud Pub/Sub el 8 de abril del 2021 o antes para admitir solicitudes push de Pub/Sub autenticadas, asigna el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) al agente de servicio. De lo contrario, este rol se asigna de forma predeterminada:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
    Sustituye lo siguiente:
    • PROJECT_ID: tu ID de proyecto Google Cloud
    • PROJECT_NUMBER: el número de tu proyecto Google Cloud . Puedes encontrar el número de tu proyecto en la página Bienvenido de la consola Google Cloud o ejecutando el siguiente comando:
      gcloud projects describe PROJECT_ID --format='value(projectNumber)'
  19. Crear una red VPC en modo personalizado

    Una red de VPC es una versión virtual de una red física que se implementa en la red de producción de Google. Proporciona conectividad a las instancias de máquina virtual de Compute Engine.

    Cuando se crea una red VPC en modo personalizado, no se crea ninguna subred automáticamente. Este tipo de red te ofrece un control total sobre sus subredes e intervalos de IP.

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

    Sustituye NETWORK_NAME por el nombre de la red VPC.

    Ten en cuenta lo siguiente:

    • Cada red que cree debe tener un nombre único en el mismo proyecto.
    • El modo de enrutamiento Border Gateway Protocol (BGP) controla el comportamiento de los routers de Cloud Router en la red y puede ser global o regional. El valor predeterminado es regional.
    • La unidad máxima de transmisión (MTU) es el tamaño de paquete más grande de la red. El valor de MTU puede ser cualquiera entre 1300 y 8896. El valor predeterminado es 1460. Antes de definir la MTU con un valor superior a 1460, consulta Unidad máxima de transmisión.

    Para obtener más información, consulta Crear y gestionar redes de VPC.

    Crear una subred solo IPv4

    Una red debe tener al menos una subred para poder usarla.

    Cuando creas una subred, le asignas un nombre, una región y al menos un intervalo de direcciones IPv4 principal de acuerdo con las reglas de las subredes. Ten en cuenta que no puedes crear instancias en una región que no tenga ninguna subred definida.

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

    Sustituye SUBNET_NAME por el nombre de la nueva subred.

    Para obtener más información, consulta Subredes.

    Crear reglas de cortafuegos de VPC

    Las reglas de cortafuegos de VPC te permiten permitir o denegar el tráfico entre recursos de una red de VPC en función del número de puerto, la etiqueta o el protocolo.

    Las reglas de cortafuegos de VPC se definen a nivel de red y solo se aplican a la red en la que se crean. Sin embargo, el nombre que elijas para una regla debe ser único en el proyecto.

    1. Crea una regla de cortafuegos para tu red de VPC que permita el tráfico entrante de cualquier dirección IPv4 (0.0.0.0/0) a cualquier instancia de la red mediante el puerto 22. Esta regla no es obligatoria para la entrega de eventos. Sin embargo, para este tutorial, crea la regla de forma que puedas conectarte a la VM mediante SSH y confirmar la entrega del evento:

      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. Crea una regla de cortafuegos para tu red de VPC que permita el tráfico entrante desde un intervalo de direcciones IP específico a cualquier instancia de la red mediante el puerto 80 (ya que vas a implementar un servidor web en tu VM que escucha en el puerto 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

      Sustituye RULE_NAME_ONE y RULE_NAME_TWO por nombres únicos para tus reglas de firewall.

      Ten en cuenta que el uso de --source-ranges es opcional e indica una lista de bloques de direcciones IP que pueden establecer conexiones entrantes que coincidan con la regla de cortafuegos a las instancias de la red. En este caso, el intervalo coincide con el intervalo usado en la subred que has creado anteriormente.

      Te recomendamos que uses la marca para aplicar la regla de firewall específicamente al tráfico de Eventarc. Si no se especifica ni --source-ranges ni --source-tags, --source-ranges tiene el valor predeterminado 0.0.0.0/0, lo que significa que la regla se aplica a todas las conexiones IPv4 entrantes desde dentro o fuera de la red.

    Para obtener más información, consulta Usar reglas de cortafuegos de VPC.

    Crear un archivo adjunto de red

    Una vinculación de red es un recurso que permite que una red de VPC de un productor inicie conexiones con una red de VPC de un consumidor a través de una interfaz de Private Service Connect.

    Para publicar eventos, Eventarc usa el archivo adjunto de red para establecer una conexión con el endpoint HTTP interno alojado en una red VPC.

    Puedes crear una vinculación de red que acepte automáticamente las conexiones de cualquier interfaz de Private Service Connect que haga referencia a la vinculación de red. Crea el adjunto de red en la misma red y región que contenga el servicio de destino HTTP.

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

    Sustituye ATTACHMENT_NAME por el nombre de la conexión de red.

    Para obtener más información, consulta Acerca de los archivos adjuntos de red.

    Crear una instancia de VM en una subred específica

    Una instancia de VM de Compute Engine es una máquina virtual alojada en la infraestructura de Google. Los términos instancia de Compute Engine, instancia de VM y VM son sinónimos y se usan indistintamente. Las instancias de máquina virtual incluyen clústeres de Google Kubernetes Engine (GKE), instancias del entorno flexible de App Engine y otros Google Cloud productos creados en máquinas virtuales de Compute Engine.

    Crea una instancia de VM de Compute Engine en la red de VPC en la que puedas desplegar un servicio de receptor de eventos.

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

    Sustituye INSTANCE_NAME por el nombre de la VM.

    Para obtener más información, consulta Crear e iniciar una instancia de VM.

    Desplegar un receptor de eventos en la VM

    Implementa un servidor web en tu VM que escuche en el puerto 80 y reciba y registre eventos.

    1. Establece una conexión SSH con tu instancia de VM mediante el botón SSH de la consola Google Cloud para conectarte a tu VM.

      Una vez que se haya establecido una conexión con el servidor SSH, usa la terminal SSH en el navegador para ejecutar comandos en tu instancia de VM.

    2. En el terminal SSH en el navegador, crea un archivo de texto con el nombre server.py que contenga el siguiente código de Python:

      #!/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. Inicia el servidor y mantenlo en funcionamiento durante los pasos restantes de este tutorial:

      sudo python3 server.py
      

    Crear un activador de Eventarc

    Crea un activador de Eventarc que cree un tema de Pub/Sub y enrute los eventos al receptor de eventos desplegado en la VM cuando se publique un mensaje en el tema de Pub/Sub.

    Después de habilitar la API Compute Engine, la cuenta de servicio predeterminada es la cuenta de servicio predeterminada de Compute Engine (PROJECT_NUMBER-compute@developer.gserviceaccount.com). Para hacer pruebas, el activador usa esta cuenta de servicio predeterminada para su identidad.

    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

    Sustituye PROJECT_NUMBER por el número de tu proyecto. Google Cloud Puedes encontrar el número de tu proyecto en la página Bienvenido de la consola Google Cloud o ejecutando el siguiente comando:

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

    Para obtener más información sobre cómo configurar el activador, consulta Dirigir eventos a un endpoint HTTP interno en una red de VPC.

    Generar y ver un evento de tema de Pub/Sub

    Puedes generar un evento publicando un mensaje en un tema de Pub/Sub.

    1. Busca y define el tema de Pub/Sub como variable de entorno:

      export MY_TOPIC=$(gcloud eventarc triggers describe TRIGGER_NAME \
          --location=$REGION \
          --format='value(transport.pubsub.topic)')
    2. Publica un mensaje en el tema de Pub/Sub para generar un evento:

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

      El activador de Eventarc enruta el evento al endpoint HTTP interno de tu red VPC. En la terminal SSH en el navegador, se muestra el cuerpo del evento. Debería ser similar a lo siguiente:

      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 -
      

      Ten en cuenta que, si decodificas el valor data de SGVsbG8gV29ybGQ= de su formato Base64, se devuelve "Hello World".

    Has desplegado correctamente un servicio de receptor de eventos en un endpoint HTTP interno de una red VPC, has creado un activador de Eventarc, has generado un evento desde Pub/Sub y has confirmado que el activador ha dirigido el evento al endpoint de destino según lo previsto.

    Limpieza

    Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.

    Eliminar el proyecto

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    Eliminar recursos concretos

    1. Elimina el activador de Eventarc:
      gcloud eventarc triggers delete TRIGGER_NAME --location=$REGION
    2. Elimina la instancia:
      gcloud compute instances delete INSTANCE_NAME
    3. Elimina el archivo adjunto de la red:
      gcloud compute network-attachments delete ATTACHMENT_NAME --region=$REGION
    4. Elimina las reglas de cortafuegos:
      gcloud compute firewall-rules delete RULE_NAME_ONE
      gcloud compute firewall-rules delete RULE_NAME_TWO
    5. Elimina la subred:
      gcloud compute networks subnets delete SUBNET_NAME --region=$REGION
    6. Elimina la red de VPC:
      gcloud compute networks delete NETWORK_NAME

    Siguientes pasos