Zendesk-Webhooks sind ein leistungsstarkes Tool, mit dem Sie Änderungen, die Sie in Ihrem Zendesk-Konto vornehmen, an Ihre anderen Systeme übertragen können. Durch die Integration mit Amazon EventBridge mithilfe von Webhooks können Sie komplexere Workflows mit Echtzeit-Datenverarbeitung erstellen. In diesem Beitrag wird beschrieben, wie Sie Zendesk-Ereignisse mithilfe von Webhooks an Amazon EventBridge senden.
Voraussetzungen für die Übertragung von Ereignissen an Amazon EventBridge mit Webhooks
- Sie müssen ein Administrator in Ihrem Konto sein.
- Sie benötigen ein AWS-Konto, in dem EventBridge eingerichtet ist.
Außerdem sollten Sie mit den Grundlagen von AWS und EventBridge vertraut sein.
Erstellen eines EventBridge-Ereignisbusses
Bevor Sie den Webhook einrichten, müssen Sie einen EventBridge-Ereignisbus erstellen.
arn:aws:events:{REGION}:{AWS_ID}:event-bus/{EVENT_BUS_ID}
Erstellen einer Lambda-Funktion für den Empfang der Webhook-Nutzlast
Eine Lambda-Funktion wird benötigt, um den Webhook zu empfangen, seine Signatur zu bestätigen und seine Nutzlast an den EventBridge-Ereignisbus weiterzuleiten, den Sie erstellt haben.
- Verwenden Sie die AWS Lambda-Konsole, um eine neue Lambda-Funktion zu erstellen. Nehmen Sie in den Feldern die erforderlichen Einstellungen vor. Klicken Sie unter Advanced settings auf Enable function URL und wählen Sie die Authentifizierungsmethode NONE.
Notieren Sie sich den Eintrag im Feld Function URL. Dies ist die öffentliche URL, mit der Sie Ihren Webhook verbinden.
- Fügen Sie im Fenster Code source den folgenden Code hinzu und klicken Sie dann auf Deploy.
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)}), }
- Fügen Sie der Lambda-Funktion zwei Umgebungsvariablen hinzu:
-
EVENT_BUS_ARN
: Setzen Sie diese Variable auf den ARN-Wert, den Sie beim Erstellen des EventBridge-Ereignisbusses erhalten haben. Dies ist der Standort des Ereignisbusses. -
WEBHOOK_SECRET
: Nachdem Sie den Webhook erstellt haben, müssen Sie diese Variable auf das Webhook-Geheimnis setzen.
-
- Verwenden Sie die AWS IAM-Konsole, um eine Rolle für den AWS Lambda-Service zu erstellen.
Notieren Sie sich den Namen der Rolle. Er wird für die Zuweisung der Rolle an die Lambda-Funktion benötigt.
- Nachdem Sie die Rolle erstellt haben, bearbeiten Sie sie und fügen Sie ihr den ARN des EventBridge-Ereignisbusses hinzu.
- Öffnen Sie die Rolle.
- Klicken Sie unter Step 2: Add permissions auf Edit und dann auf Create inline policy.
- Suchen Sie nach EventBridge-Services und wählen Sie die Methode PutEvents aus.
- Klicken Sie unter Resources auf Add ARNs.
- Geben Sie den ARN des EventBridge-Ereignisbusses ein und klicken Sie auf Next.
- Geben Sie in das Feld Name einen Namen für Ihre Richtlinie ein und klicken Sie auf Create policy.
- Verwenden Sie die AWS Lambda-Konsole, um Ihre Lambda-Funktion zu öffnen und ihr die IAM-Rolle zuzuweisen. Klicken Sie in der Registerkarte Configuration auf Permissions und dann auf Edit. Klicken Sie unten auf der Seite auf den Namen der Rolle und dann auf Save.
Erstellen eines Zendesk-Webhooks für die Verbindung mit Amazon EventBridge
Nachdem Sie den EventBridge-Ereignisbus erstellt und die Lambda-Funktion konfiguriert haben, müssen Sie den eigentlichen Webhook erstellen.
- Klicken Sie in der Seitenleiste des Admin Centers auf Apps und Integrationen und dann auf Aktionen und Webhooks > Webhooks.
-
Erstellen Sie den Webhook und geben Sie dabei die folgenden Werte ein:
- Setzen Sie die Endpunkt-URL auf die Function URL, die Sie beim Erstellen der Lambda-Funktion erhalten haben.
- Setzen Sie Authentifizierung auf Keine.
- Klicken Sie auf Webhook erstellen.
WEBHOOK_SECRET
Ihrer Lambda-Funktion einfügen. Weitere Informationen finden Sie unter Erstellen einer Lambda-Funktion für den Empfang der Webhook-Nutzlast.