Alojar destinos de webhook

En esta guía se muestra cómo alojar un objetivo de webhook en un servicio de Cloud Run.

Cloud Run ofrece buenas soluciones para alojar tus objetivos de webhook. Cloud Run ofrece más flexibilidad y puede gestionar volúmenes más grandes con simultaneidad.

Alojamiento de objetivos de webhook en un servicio de Cloud Run es ideal para los siguientes casos:

  • Quieres que los tiempos de espera de las solicitudes sean más largos (hasta 15 minutos)
  • Esperas un volumen elevado y necesitas simultaneidad (80 solicitudes simultáneas por instancia)

Crear un objetivo de webhook en Cloud Run

Con Cloud Run, puedes definir un objetivo de webhook en el idioma que quieras. Solo tienes que crear un endpoint HTTP que pueda aceptar los datos. Normalmente, esto se hace con un POST, por ejemplo:

@app.route('/', methods=['POST'])
def index():
    data = request.get_json()

En este ejemplo, la página de índice de la URL está configurada para aceptar solo solicitudes POST y espera que los datos se envíen a través de una carga útil JSON.

Integración con el proveedor de webhooks

La mayoría de los servicios que proporcionan retrollamadas HTTP requieren que verifiques la propiedad de la URL. Esto se suele hacer enviando algún tipo de token, mensaje o secreto y esperando una respuesta válida. Deberá obtener estos requisitos del proveedor de servicios. Si usamos el webhook de ejemplo anterior, podría tener este aspecto:

def index():
    data = request.get_json()
    return data['challenge']

Una vez que el proveedor haya verificado la propiedad, también tendrás que añadir la autorización por tu parte.

Autorizar solicitudes

Un destino de webhook es una URL abierta y pública. La mayoría de los servicios proporcionan un token o un secreto para asegurarse de que las solicitudes entrantes proceden de servicios autorizados. Como la URL es pública, no puede evitar que se intente enviar datos de forma malintencionada al destino del webhook. Sin embargo, si usas tokens o secretos, solo procesarás datos de fuentes autorizadas.

Para verificar la solicitud, puedes configurar secretos o almacenar tu copia del secreto como variable de entorno o mediante algún tipo de sistema de gestión de claves.

Cuando almacenes tu copia del secreto como una variable de entorno, cada solicitud debe tener un secreto o un token en los encabezados de la solicitud o en la carga útil JSON, y debes comprobarlo para asegurarte de que la fuente sea válida.

def index():
    request_secret = request.headers['Secret']
    if request_secret != os.environ['SECRET']:
        return ('Unauthorized', 401)

Si el proveedor de webhook no admite un secreto u otro mecanismo de autenticación, cualquier persona que tenga la URL de tu destino de webhook podrá enviar mensajes. En este caso, tu implementación de webhook debería ser segura para exponerla a Internet público.

Responder a solicitudes

La mayoría de los servicios requieren que respondas a una solicitud en un plazo determinado, tal como se especifica en el servicio. Algunos webhooks tienen métodos de reintento integrados si se produce un error en la respuesta, como un código de estado HTTP 4xx o 5xx, por lo que deberá devolver un código de estado correcto (2xx) para que el servicio sepa que el evento se ha procesado correctamente.

def index():
    data = request.get_json()
    return ('', 200)

Tiempos de espera

Tanto Cloud Run como el proveedor de webhooks tienen tiempos de espera. Se aplicará el más corto de los dos a tu solicitud. Si el procesamiento de datos supera el tiempo asignado por Cloud Run o el proveedor de webhooks, tendrás que usar un producto que te permita completar el procesamiento de forma asíncrona, como Pub/Sub o Cloud Tasks. Estos productos te permiten transferir los datos rápidamente, devolver inmediatamente una respuesta correcta al proveedor de webhooks y continuar el proceso sin preocuparte por el tiempo de espera. También son buenas opciones para gestionar los fallos y los reintentos.

Patrones de webhooks habituales

Tipo Ejemplos
Reenviar datos Enviar una notificación a través de Firebase Cloud Messaging cada vez que se llama al webhook.
Almacenar datos Almacenar los datos en BigQuery para analizarlos más adelante.
Acciones de activación Completar acciones en Dialogflow, publicar respuestas en Twitter o enviar contenido a tu entorno de pruebas cada vez que se confirme código nuevo en GitHub.

Siguientes pasos