Los webhooks de Zendesk son una herramienta potente para mantener sus otros sistemas actualizados con los cambios en su cuenta de Zendesk. El uso de webhooks para la integración con Amazon EventBridge crea la oportunidad de contar con flujos de trabajo más sofisticados gracias al procesamiento de datos en tiempo real. Este artículo describe cómo usar webhooks para enviar eventos de Zendesk a Amazon EventBridge.
Requisitos para enviar eventos a Amazon EventBridge a través de webhooks
- Debe ser un administrador en su cuenta de Zendesk.
- Debe tener una cuenta de AWS con EventBridge configurado.
Además, debe tener una comprensión básica de los servicios AWS, incluido EventBridge.
Crear un bus de eventos de EventBridge
Antes de crear el webhook, debe crear un bus de eventos de EventBridge.
arn:aws:events:{REGION}:{AWS_ID}:event-bus/{EVENT_BUS_ID}
Crear una función Lambda para recibir la carga de webhook
Se requiere una función Lambda para recibir el webhook, confirmar la firma del webhook y pasar la carga del webhook al bus de eventos de EventBridge que se creó.
- Use la consola Lambda de AWS para crear una nueva función Lambda. Complete los campos según se necesite. Bajo Advanced settings (Configuración avanzada), seleccione Enable function URL (Activar URL de función) y luego seleccione NONE (NINGUNO) como método de autenticación.
Tome nota del Function URL (URL de función). Este es el URL público al que va a conectar su webhook.
- Agregue el siguiente código a la ventana de Code source (Código fuente) y luego haga clic en Deploy (Desplegar).
import json import hashlib import hmac import os import base64 import logging import boto3 LOGGER = logging.getLogger() LOGGER.setLevel('INFO') EVENTBRIDGE = boto3.client('events') # Set these values in your Lambda function environment variables. EVENT_BUS_ARN = os.environ['EVENT_BUS_ARN'] WEBHOOK_SECRET = os.environ['WEBHOOK_SECRET'].encode('utf-8') def verify_signature(payload, signature, timestamp): '''Verify the provided webhook signature was created by Zendesk's Webhook feature.''' combined = timestamp + payload combined_bytes = combined.encode('utf-8') computed_hmac = hmac.new(WEBHOOK_SECRET, combined_bytes, hashlib.sha256) computed_signature = base64.b64encode(computed_hmac.digest()).decode('utf-8') return hmac.compare_digest(computed_signature, signature) def webhook_to_eventbridge(event): '''Forward the webhook body to AWS EventBridge.''' payload = event['body'] signature = event['headers'].get('x-zendesk-webhook-signature', '') timestamp = event['headers'].get('x-zendesk-webhook-signature-timestamp', '') if not verify_signature(payload, signature, timestamp): LOGGER.warning('Received webhook with invalid signature') return { 'statusCode': 403, 'body': json.dumps({'message': 'Forbidden'}), } payload_dict = json.loads(payload) if isinstance(payload, str) else payload event_source = payload_dict.get('source', 'webhook.custom') detail_type = payload_dict.get('type', 'defaultDetailType') put_events_response = EVENTBRIDGE.put_events( Entries=[ { 'Source': event_source, 'DetailType': detail_type, 'Detail': json.dumps(payload_dict), 'EventBusName': EVENT_BUS_ARN, } ] ) response_entries = put_events_response.get('Entries', []) if len(response_entries) == 0 or 'ErrorCode' in response_entries[0]: LOGGER.error(f'Push to event bridge failed: {response_entries}') return { 'statusCode': 500, 'body': json.dumps( { 'message': 'Failed to send event to EventBridge', 'response': put_events_response, } ), } return { 'statusCode': 200, 'body': json.dumps( { 'message': 'Event successfully sent to EventBridge', 'response': put_events_response, } ), } def lambda_handler(event, context): try: return webhook_to_eventbridge(event) except Exception as e: LOGGER.exception('Error handling webhook') return { 'statusCode': 500, 'body': json.dumps({'message': 'Error handling webhook', 'error': str(e)}), }
- Agregue dos variables de entorno a la función Lambda:
-
EVENT_BUS_ARN
: establezca esto en el valor ARN que obtuvo cuando creó el bus de eventos de EventBridge. Esta es la ubicación del bus de eventos. -
WEBHOOK_SECRET
: después de crear el webhook, tendrá que establecer esto en el secreto de webhook.
-
- Use la consola AWS IAM para crear un rol para el servicio AWS Lambda.
Tome nota del nombre del rol ya que lo necesitará para asignar el rol a la función Lambda.
- Después de crear el rol, edítelo para agregar el ARN del bus de eventos de EventBridge.
- Abra el rol.
- Bajo Step 2: Add permissions (Paso 2: Agregar permisos), haga clic en Edit (Editar) y seleccione Create inline policy (Crear política insertada).
- Busque los servicios de EventBridge y seleccione el método PutEvents.
- Bajo Resources (Recursos), haga clic en Add ARNs (Agregar ARN).
- Ingrese el ARN del bus de eventos de EventBridge y haga clic en Next (Siguiente).
- En Name (Nombre), ingrese un nombre para su política y haga clic en Create policy (Crear política).
- Use la consola AWS Lambda para abrir la función Lambda que creó y asígnele el rol de IAM. En la pestaña Configuration (Configuración), seleccione Permissions (Permisos) y haga clic en Edit (Editar). En la parte inferior de la página, seleccione el nombre del rol y haga clic en Save (Guardar).
Crear un webhook de Zendesk para conectarlo con Amazon EventBridge
Después de crear el bus de eventos de EventBridge y configurar la función Lambda, debe crear el propio webhook.
- En el Centro de administración, haga clic en Aplicaciones e integraciones en la barra lateral y luego seleccione Acciones y webhooks > Webhooks.
-
Cree el webhook, asegurándose de especificar los siguientes valores:
- Defina el URL de extremo usando el URL de función que obtuvo cuando creó la función Lambda.
- Establezca la Autenticación en Ninguna.
- Haga clic en Crear webhook.
WEBHOOK_SECRET
de la función Lambda. Consulte Crear una función Lambda para recibir la carga de webhook.