Webhook-Ziel hosten

In dieser Anleitung erfahren Sie, wie Sie ein Webhook-Ziel in einem Knative-Bereitstellungsdienst hosten.

Cloud Functions und Knative-Bereitstellung im Vergleich

Cloud Functions und Knative bieten gute Lösungen zum Hosten Ihrer Webhook-Ziele. Im Allgemeinen lässt sich Cloud Functions schnell einrichten, eignet sich gut für das Prototyping und ist ideal für Workflows mit weniger Volumen. Die Bereitstellung von Knative bietet mehr Flexibilität und ist in der Lage, größere Mengen gleichzeitig zu verarbeiten.

Verwenden Sie die Bereitstellung mit Knative, wenn:

  • Sie verwenden Sprachen oder Laufzeiten, die in Cloud Functions nicht unterstützt werden.
  • Sie möchten für Anfragen längere Zeitüberschreitungen haben (bis zu 15 Minuten).
  • Sie erwarten ein großes Volumen und benötigen Nebenläufigkeit (mindestens 80 gleichzeitige Anfragen pro Container-Instanz).

Webhook-Ziel in der Bereitstellung mit Knative erstellen

Mit der Bereitstellung von Knative können Sie ein Webhook-Ziel in einer beliebigen Sprache definieren. Sie müssen nur einen HTTP-Endpunkt erstellen, der die Daten akzeptiert. Dies geschieht in der Regel mit einem POST, z. B.:

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

Im obigen Beispiel ist die Indexseite der URL so konfiguriert, dass sie nur POST-Anfragen akzeptiert und erwartet, dass Daten über eine JSON-Nutzlast übermittelt werden.

Integration mit dem Webhook-Anbieter

Bei den meisten Diensten, die HTTP-Callbacks bereitstellen, müssen Sie die URL-Inhaberschaft bestätigen. Dies geschieht in der Regel, indem eine Art von Token, Nachricht oder Secret gesendet und eine gültige Antwort erwartet wird. Diese Anforderungen müssen Sie beim Dienstanbieter einholen. Im obigen Beispiel könnte dies so aussehen:

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

Nachdem der Anbieter Ihre Inhaberschaft bestätigt hat, müssen Sie auch auf Ihrer Seite eine Autorisierung hinzufügen.

Anfragen autorisieren

Ein Webhook-Ziel ist eine offene und öffentliche URL. Die meisten Dienste stellen ein Token oder ein Secret bereit, um sicherzustellen, dass die eingehenden Anfragen von autorisierten Diensten stammen. Da die URL öffentlich ist, können Sie böswillige Versuche, Daten an das Webhook-Ziel zu senden, nicht verhindern. Die Verwendung von Tokens oder Secrets sorgt jedoch dafür, dass nur Daten aus autorisierten Quellen verarbeitet werden.

Zum Prüfen der Anfrage können Sie entweder Secrets konfigurieren oder Ihre Kopie des Secrets entweder als Umgebungsvariable oder mithilfe eines Schlüsselverwaltungssystems speichern.

Wenn Sie Ihre Kopie des Secrets als Umgebungsvariable speichern, sollte jede Anfrage ein Secret oder Token in den Anfrageheadern oder in der JSON-Nutzlast haben und Sie müssen es prüfen, um sicherzustellen, dass die Quelle gültig ist.

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

Wenn der Webhook-Anbieter ein Secret oder einen anderen Authentifizierungsmechanismus nicht unterstützt, kann jeder mit der URL Ihres Webhook-Ziels Nachrichten senden. In diesem Fall sollte kein Problem sein, wenn die Webhook-Implementierung über das öffentliche Internet frei zugänglich ist.

Auf Anfragen antworten

Bei den meisten Diensten müssen Sie innerhalb eines bestimmten Zeitraums, wie vom Dienst angegeben, auf eine Anfrage antworten. Einige Webhooks verfügen über integrierte Wiederholungsmethoden, wenn eine Fehlerantwort auftritt, z. B. der HTTP-Statuscode 4xx oder 5xx. Daher müssen Sie einen erfolgreichen Statuscode (2xx) zurückgeben, um dem Dienst mitzuteilen, dass das Ereignis ordnungsgemäß verarbeitet wurde.

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

Zeitlimits

Sowohl die Knative-Bereitstellung als auch der Webhook-Anbieter haben Zeitlimits. Für Ihre Anwendung gilt die kürzere der beiden Optionen. Wenn Ihre Datenverarbeitung die vom Knative-Bereitstellungs- oder Webhook-Anbieter zugeteilte Zeit überschreitet, müssen Sie ein Produkt verwenden, mit dem Sie die Verarbeitung asynchron ausführen können, z. B. Pub/Sub oder Cloud Tasks. Mit diesen Produkten können Sie die Daten schnell übergeben, sofort eine Erfolgsantwort an den Webhook-Anbieter senden und die Verarbeitung ohne Zeitüberschreitung fortsetzen. Dies sind auch gute Optionen für den Umgang mit Fehlern und Wiederholungen.

Häufige Muster für Webhooks

Typ Beispiele
Daten weiterleiten Senden einer Benachrichtigung über Firebase Cloud Messaging bei jedem Aufruf des Webhooks.
Daten speichern Daten zur späteren Analyse in BigQuery speichern
Aktionen auslösen Ausführen von Aktionen in Dialogflow, Posten von Antworten auf Twitter oder Übertragen an Ihre Staging-Umgebung, wenn neuer Code in GitHub per Commit übergeben wird.

Nächste Schritte