Webhooks-Ziele hosten

In dieser Anleitung wird beschrieben, wie ein Webhook-Ziel in einem Cloud Run-Dienst gehostet wird.

Cloud Functions vs. Cloud Run

Cloud Functions und Cloud Run bieten beide gute Lösungen für das Hosting 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. Cloud Run bietet mehr Flexibilität und ist in der Lage, größere Mengen gleichzeitig zu verarbeiten.

Verwenden Sie Cloud Run in folgenden Fällen:

  • 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 Gleichzeitigkeit (80 gleichzeitige Anfragen pro Container-Instanz).

Webhook-Ziel in Cloud Run erstellen

Mit Cloud Run 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.

Sie müssen Ihre Kopie des Secrets entweder als Umgebungsvariable speichern oder eine Art Schlüsselverwaltungssystem verwenden, um die Anfrage zu bestätigen. Jede Anfrage sollte in den Anfrage-Headern oder in der JSON-Nutzlast ein Secret oder Token enthalten. Sie müssen es überprü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 Cloud Run als auch der Webhooks-Anbieter haben Zeitüberschreitungen. Für Ihre Anwendung gilt die kürzere der beiden Optionen. Wenn Ihre Datenverarbeitung die von Cloud Run oder dem Webhooks-Anbieter vorgesehene Zeit überschreitet, müssen Sie ein Produkt verwenden, mit dem Sie die Verarbeitung asynchron abschließen 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 Speichern der Daten in BigQuery für eine spätere Analyse.
Aktionen auslösen Ausführen von Aktionen in Dialogflow, Posten von Antworten auf Twitter oder Weiterleiten an Ihre Staging-Umgebung, wenn neuer Code in GitHub per Commit übergeben wird.

Weitere Informationen