Comenzar a usar API Gateway y Cloud Run para gRPC

En esta página, se muestra cómo configurar API Gateway para administrar y proteger un servicio de backend de Cloud Run con gRPC.

Lista de tareas

Usa la siguiente lista de tareas mientras trabajas en el instructivo. Todas las tareas son necesarias para implementar una API Gateway para tu servicio de backend de Cloud Run con gRPC.

  1. Crea o selecciona un proyecto de Google Cloud.
  2. Si no has implementado tu propio Cloud Run, implementa un servicio de gRPC de backend de muestra. Ve el paso 7 en Antes de comenzar.
  3. Habilita los servicios de API Gateway necesarios.
  4. Crea un documento de configuración de la API de gRPC que describa tu API y configura las rutas a Cloud Run. Consulta Cómo configurar una configuración de API con gRPC.
  5. Implementa una API Gateway con tu configuración de API. Consulta Cómo implementar una API Gateway.
  6. Envía una solicitud para probar la implementación de tu API. Consulta Cómo enviar una solicitud a la API.
  7. Realiza un seguimiento de la actividad de tus servicios. Consulta Cómo realizar un seguimiento de la actividad de la API.
  8. Evita que se generen cargos en tu cuenta de Google Cloud. Consulta Cómo realizar una limpieza.

Antes de comenzar

  1. En la consola de Google Cloud, ve a la página Panel y selecciona o crea un proyecto de Google Cloud.

    Ir al panel

  2. Asegúrate de tener habilitada la facturación para tu proyecto.

    Habilitar la facturación

  3. Toma nota del ID del proyecto, ya que lo necesitarás más tarde. En el resto de la página, este ID del proyecto se denomina PROJECT_ID.

  4. Anota el número del proyecto, ya que será necesario más tarde. En el resto de esta página, este número de proyecto se denomina PROJECT_NUMBER.

  5. Descarga e instala Google Cloud CLI.

    Descarga la CLI de gcloud

  6. Sigue los pasos de la Guía de inicio rápido de Python de gRPC para instalar gRPC y las herramientas.

  7. Implementa el backend de ejemplo python-grpc-bookstore-server del servicio de gRPC Cloud Run para usarlo con este instructivo. El servicio de gRPC usa la siguiente imagen de contenedor:

    gcr.io/endpointsv2/python-grpc-bookstore-server:2

    Sigue los pasos de la Guía de inicio rápido: Implementa un contenedor de muestra ya compilado para implementar el servicio. Asegúrate de reemplazar la imagen de contenedor especificada en esa guía de inicio rápido por gcr.io/endpointsv2/python-grpc-bookstore-server:2.

    Anota la URL del servicio, así como la región y el ID del proyecto donde se implementa.

Habilita los servicios obligatorios

API Gateway requiere que habilites los siguientes servicios de Google:

Nombre Título
apigateway.googleapis.com API de API Gateway
servicemanagement.googleapis.com API de Administración de servicios
servicecontrol.googleapis.com API de Service Control

Para confirmar que los servicios obligatorios están habilitados, haz lo siguiente:

gcloud services list

Si no ves los servicios necesarios que se incluyeron en la lista, habilítalos:

gcloud services enable apigateway.googleapis.com
gcloud services enable servicemanagement.googleapis.com
gcloud services enable servicecontrol.googleapis.com

Para obtener más información sobre los servicios de gcloud, consulta Servicios de gcloud.

Crea una configuración de API con gRPC

La muestra de bookstore-grpc contiene los archivos que necesitas copiar y configurar de forma local.

  1. Crea un archivo descriptor protobuf autónomo desde tu archivo de servicio .proto:
    1. Guarda una copia de bookstore.proto del repositorio de ejemplo en tu directorio de trabajo actual. Este archivo define la API del servicio de Bookstore.
    2. Crea el siguiente directorio en el directorio de trabajo: mkdir generated_pb2
    3. Crea api_descriptor.pb, el archivo descriptor, mediante el compilador de búferes de protocolo protoc. Ejecuta el comando siguiente en el directorio donde guardaste bookstore.proto:
      python3 -m grpc_tools.protoc \
          --include_imports \
          --include_source_info \
          --proto_path=. \
          --descriptor_set_out=api_descriptor.pb \
          --python_out=generated_pb2 \
          --grpc_python_out=generated_pb2 \
          bookstore.proto

      En el comando anterior, --proto_path se configura como el directorio de trabajo actual. En tu entorno de compilación de gRPC, si usas un directorio diferente para los archivos de entrada .proto, cambia --proto_path a fin de que el compilador busque el directorio donde guardaste bookstore.proto.

  2. Crea un archivo de texto llamado api_config.yaml en tu directorio de trabajo actual (el mismo directorio que contiene bookstore.proto). Para mayor comodidad, en esta página se hace referencia al documento de configuración de la API de gRPC por ese nombre de archivo, pero puedes nombrarlo de otra manera si lo prefieres. Agrega el siguiente contenido al archivo:
    # The configuration schema is defined by the service.proto file.
    # https://github.com/googleapis/googleapis/blob/master/google/api/service.proto
    
    type: google.api.Service
    config_version: 3
    name: "*.apigateway.PROJECT_ID.cloud.goog"
    title: API Gateway + Cloud Run gRPC
    apis:
      - name: endpoints.examples.bookstore.Bookstore
    usage:
      rules:
      # ListShelves methods can be called without an API Key.
      - selector: endpoints.examples.bookstore.Bookstore.ListShelves
        allow_unregistered_calls: true
    backend:
      rules:
        - selector: "*"
          address: grpcs://python-grpc-bookstore-server-HASH-uc.a.run.app
    La sangría es importante para el formato yaml. Por ejemplo, el campo name debe estar al mismo nivel que type.
  3. En el campo name, un servicio llamado *.apigateway.PROJECT_ID.cloud.goog donde PROJECT_ID es el nombre de tu ID del proyecto de Google Cloud.
  4. En el campo address de la sección backend.rules, reemplaza grpcs://python-grpc-bookstore-server-HASH-uc.a.run.app con la URL real del servicio de Cloud Run del gRPC del backend python-grpc-bookstore-server, en el que HASH es el código hash único generado cuando creaste el servicio.

    En este ejemplo se supone que usas el servicio de backend de Bookstore de gRPC creado en Antes de comenzar. Si es necesario, reemplaza este valor por la URL de tu servicio de Cloud Run.

  5. Guarda tu documento de configuración de la API de gRPC.
  6. Crea la configuración de la API:
    gcloud api-gateway api-configs create CONFIG_ID \
    --api=API_ID --project=PROJECT_ID \
    --grpc-files=api_descriptor.pb,api_config.yaml
    donde:
    • CONFIG_ID especifica el nombre de la configuración de tu API.
    • API_ID especifica el nombre de tu API.
    • PROJECT_ID especifica el nombre del proyecto de Google Cloud.
    Por ejemplo:
    gcloud api-gateway api-configs create grpc-config \
    --api=grpc-test --project=my-test-project \
    --grpc-files=api_descriptor.pb,api_config.yaml

Implementa una API Gateway

Para implementar la configuración de la API de gRPC en una puerta de enlace, ejecuta el siguiente comando:

gcloud api-gateway gateways create GATEWAY_ID \
  --api=API_ID --api-config=CONFIG_ID \
  --location=GCP_REGION --project=PROJECT_ID

Donde:

  • GATEWAY_ID especifica el nombre de la puerta de enlace.
  • API_ID especifica el nombre de la API de API Gateway asociada a esta puerta de enlace.
  • CONFIG_ID especifica el nombre de la configuración de la API implementada en la puerta de enlace.
  • GCP_REGION es la región de Google Cloud para la puerta de enlace implementada.

  • PROJECT_ID especifica el nombre del proyecto de Google Cloud.

Por ejemplo:

gcloud api-gateway gateways create bookstore-grpc \
  --api=grpc-test --api-config=grpc-config \
  --location=us-central1 --project=my-project

Cuando el proceso finalice correctamente, puedes usar el siguiente comando para ver los detalles de la puerta de enlace:

gcloud api-gateway gateways describe GATEWAY_ID \
  --location=GCP_REGION --project=PROJECT_ID

Ten en cuenta el valor de la propiedad defaultHostname en el resultado de este comando. Esta es la parte del nombre de host de la URL de la puerta de enlace que usas para probar tu implementación en el siguiente paso.

Por ejemplo:

https://my-gateway-a12bcd345e67f89g0h.uc.gateway.dev

Envía una solicitud a la API

Para enviar solicitudes a la API de muestra, puedes usar un cliente gRPC de muestra escrito en Python.

  1. Clona el repositorio de Git donde se aloja el código del cliente de gRPC:

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
  2. Cambia tu directorio de trabajo:

    cd python-docs-samples/endpoints/bookstore-grpc/
  3. Instala las dependencias:

    pip3 install virtualenv
    virtualenv env
    source env/bin/activate
    pip3 install -r requirements.txt
  4. Envía una solicitud a la API de muestra:

    python3 bookstore_client.py --host=DEFAULT_HOSTNAME --port 443 --use_tls true

    Especifica la propiedad defaultHostname de tu puerta de enlace en DEFAULT_HOSTNAME, sin el identificador de protocolo. Por ejemplo:

    python3 bookstore_client.py --host=my-gateway-a12bcd345e67f89g0h.uc.gateway.dev --port 443 --use_tls true

Realiza un seguimiento de la actividad de la API

  1. Consulta los gráficos de actividad de tu API en la página API Gateway de la consola de Google Cloud. Haz clic en tu API para ver los gráficos de actividad en la página Descripción general. Las solicitudes pueden tardar unos minutos en reflejarse en los gráficos.

  2. Consulta los registros de solicitud de tu API en la página Visor de registros. Puedes encontrar un vínculo a la página Explorador de registros en la página API Gateway de la consola de Google Cloud.

    Ir a API Gateway

    Una vez en la página API Gateway, haz lo siguiente:

    1. Selecciona la API que deseas ver.
    2. Haz clic en la pestaña Detalles.
    3. Haz clic en el vínculo en Registros.

Acabas de implementar y probar una API en API Gateway con gRPC.

Realiza una limpieza

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste en esta guía de inicio rápido, puedes hacer lo siguiente:

Como alternativa, también puedes borrar el proyecto de Google Cloud que se usó para este instructivo.