Alojar un destino de webhook

En esta guía, se muestra cómo alojar el destino de un webhook en un servicio de entrega de Knative.

Diferencias entre Cloud Functions y la entrega de Knative

Cloud Functions y la entrega de Knative proporcionan buenas soluciones para alojar los destinos de tu webhook. En general, Cloud Functions se configura con rapidez, es bueno para el prototipado y es ideal para flujos de trabajo de menor volumen. La entrega de Knative proporciona más flexibilidad y puede controlar volúmenes más grandes con simultaneidad.

Usa la entrega de Knative en el siguiente caso:

  • Usas lenguajes o entornos de ejecución no compatibles con Cloud Functions.
  • Deseas tiempos de espera de solicitudes más largos (hasta 15 minutos).
  • Esperas un gran volumen y necesitas simultaneidad (80 solicitudes simultáneas o más por instancia de contenedor)

Crea un destino de webhook en la entrega de Knative

Con la entrega de Knative, puedes definir un destino de webhook en cualquier lenguaje que elijas. Solo necesitas crear un extremo HTTP que pueda aceptar los datos. Por lo general, esto se hace con una solicitud POST, como en el siguiente ejemplo:

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

En el ejemplo anterior, la página de índice de la URL se configuró para aceptar solo solicitudes POST y espera que los datos se entreguen mediante una carga útil de JSON.

Integra al proveedor de webhook

La mayoría de los servicios que proporcionan devoluciones de llamadas HTTP requieren que verifiques la propiedad de la URL. Por lo general, se hace mediante el envío de algún tipo de token, mensaje o secreto y la espera de una respuesta válida. Deberás obtener estos requisitos del proveedor de servicios. Mediante el mismo ejemplo anterior, podría verse de la siguiente forma:

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

Una vez que el proveedor verifique tu propiedad, también deberás agregar autorización de tu parte.

Autoriza solicitudes

Un destino del webhook es una URL abierta y pública. La mayoría de los servicios proporcionan un token o un secreto para garantizar que las solicitudes entrantes provengan de servicios autorizados. Debido a que la URL es pública, no puedes evitar los intentos maliciosos de enviar datos al destino del webhook. Sin embargo, el uso de tokens o secretos garantiza que solo se procesen datos de fuentes autorizadas.

Para verificar la solicitud, puedes configurar los secretos o almacenar tu copia del secreto, como una variable de entorno o con algún tipo de sistema de administració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 de JSON, y debes verificarlo para asegurarte de que el origen sea válido.

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

Si el proveedor de webhooks no admite un secreto ni otro mecanismo de autenticación, cualquier persona con la URL del destino del webhook podrá enviar mensajes. En este caso, la implementación del webhook debería ser segura de exponer en la Internet pública.

Responde a solicitudes

La mayoría de los servicios requieren que respondas a una solicitud dentro de un período determinado, según lo especificado por el servicio. Algunos webhooks tienen métodos de reintento integrados si hay una respuesta de error, como un código de estado HTTP 4xx o 5xx, por lo que deberás mostrar un código de estado exitoso (2xx) para informarle al servicio que el evento se procesó de forma correcta.

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

Tiempos de espera

La entrega de Knative y el proveedor de webhooks tienen tiempos de espera. Se aplicará el más corto a tu aplicación. Si el procesamiento de datos supera el tiempo asignado por la entrega de Knative o el proveedor de webhooks, deberás 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 con rapidez, mostrar una respuesta correcta al proveedor de webhooks de inmediato y continuar con el procesamiento sin tiempo de espera. Estas también son buenas opciones para manejar fallas y reintentos.

Patrones de webhooks comunes

Tipo Ejemplos
Retransmisión de datos Enviar una notificación a través de Firebase Cloud Messaging cada vez que se llama al webhook.
Almacenamiento de datos Almacenar los datos en BigQuery para su análisis posterior
Activación de acciones Llevar a cabo acciones en Dialogflow, publicar respuestas en Twitter o enviarlas a tu entorno de etapa de pruebas cada vez que se confirma un código nuevo en GitHub.

¿Qué sigue?