Apache APISIX Serverless-Plugin für Event Hooks

Bobur Umurzokov

Bobur Umurzokov

February 15, 2023

Technology

Apache APISIX ist ein Open-Source-API-Gateway mit hoher Leistung, das auf Nginx basiert. Eine seiner leistungsstarken Funktionen ist die Möglichkeit, serverlose Funktionen zu erstellen, das sind kleine, zustandslose Programme, die die Funktionalität von Apache APISIX erweitern können. In diesem Artikel behandeln wir die Grundlagen des Apache APISIX Serverless Plugins und wie es verwendet werden kann, um serverlose Funktionen als Reaktion auf Ereignisse auszulösen.

Lernziele

In diesem Artikel lernen Sie Folgendes:

  • Was ist das Apache APISIX Serverless-Plugin?
  • Wie funktioniert das Serverless-Plugin und wie wird es verwendet?
  • Anwendungsfälle für das Serverless-Plugin.
  • Wie Sie das Serverless-Plugin verwenden können, um es mit einem Webhook zu integrieren.

Was ist das Apache APISIX Serverless-Plugin?

Das Apache APISIX Serverless-Plugin für Ereignishooks ermöglicht es Ihnen, serverlose Funktionen zu schreiben und in das API-Gateway zu integrieren. Das Plugin bietet eine einfache und flexible Möglichkeit, benutzerdefinierten Code als Reaktion auf Ereignisse auszuführen, ohne die zugrunde liegende Infrastruktur verwalten zu müssen.

Das Serverless-Plugin trennt die Logik zur Behandlung von Ereignissen in separate serverlose Funktionen, wodurch Sie Ihre API-Architektur vereinfachen und leichter verwalten können. Apache APISIX bietet Unterstützung für Serverless-Frameworks beliebter Cloud-Anbieter wie Azure Functions und AWS Lambda.

Wie verwendet man das Serverless-Plugin?

Um das Apache APISIX Serverless-Plugin für Ereignishooks zu verwenden, müssen Sie einen serverlosen Funktionscode in der Programmiersprache Lua schreiben, der die Logik implementiert, die Sie als Reaktion auf ein Ereignis ausführen möchten, und das serverless-pre-function- oder serverless-post-function-Plugin aktivieren, abhängig von den Phasen des Anfrage-Antwort-Zyklus Ihrer Wahl.

Derzeit unterstützt APISIX nur Lua, um einen Funktionscode zu schreiben. Wenn Sie andere Programmiersprachen bevorzugen, können Sie jederzeit Plugin-Runner verwenden, um ein neues benutzerdefiniertes Plugin von Grund auf zu erstellen.

Anwendungsfälle für das Serverless-Plugin

Hier sind einige Anwendungsfälle für das Apache APISIX Serverless-Plugin für Ereignishooks:

  1. Dynamisches Routing: Das Serverless-Plugin kann verwendet werden, um eingehende API-Anfragen basierend auf bestimmten Kriterien wie der Anfragemethode, dem URL-Pfad oder Header-Werten dynamisch weiterzuleiten. Dies ermöglicht es Ihnen, komplexe Routing-Szenarien einfach zu implementieren, ohne die zugrunde liegende Apache APISIX-Konfiguration ändern zu müssen.

  2. Authentifizierung und Autorisierung: Sie können das Serverless-Plugin verwenden, um Authentifizierungs- und Autorisierungsprüfungen für Ihre API zu implementieren. Beispielsweise können Sie eine serverlose Funktion schreiben, die das Vorhandensein eines gültigen API-Schlüssels in den Anfrage-Headern überprüft, bevor die Anfrage fortgesetzt wird. Oder es kann als externer Autorisierungsdienst in Kombination mit dem forward-auth-Plugin verwendet werden.

  3. Anfrage-Transformation: Das Serverless-Plugin kann verwendet werden, um eingehende API-Anfragen zu transformieren, bevor sie vom Backend-Dienst verarbeitet werden. Beispielsweise können Sie eine serverlose Funktion schreiben, die die Anfrage-Header oder den Anfragekörper so ändert, dass sie dem vom Backend-Dienst erwarteten Format entsprechen.

  4. Antwort-Transformation: Sie können das Serverless-Plugin auch verwenden, um die Antwort vom Backend-Dienst zu transformieren, bevor sie an den Client zurückgesendet wird. Beispielsweise können Sie eine serverlose Funktion schreiben, die die Antwort-Header oder den Antwortkörper so ändert, dass sie dem vom Client erwarteten Format entsprechen.

  5. Protokollierung und Überwachung: Sie können das Serverless-Plugin verwenden, um Protokollierung und Überwachung für Ihre API zu implementieren. Beispielsweise können Sie eine serverlose Funktion schreiben, die detaillierte Informationen über jede API-Anfrage protokolliert, wie z.B. die Anfragemethode, URL, Header und den Anfragekörper, für eine spätere Analyse.

Integration von Apache APISIX mit Webhooks (Demo)

Um Apache APISIX mit Webhooks zu integrieren, müssen Sie eine serverlose Funktion erstellen, die eingehende POST-Anfragen an den URL-Endpunkt überwacht, überprüft, ob die Anfragemethode POST ist, und eine Webhook-Benachrichtigung an den Drittanbieterdienst sendet, sobald eine neue Nachricht gepostet wird.

Die serverlose Funktion sollte auch die Antwort vom Webhook zurückgeben, damit Sie den Status des Webhooks und eventuelle Fehlermeldungen sehen können, falls etwas schiefgeht. In beiden Fällen kann APISIX mit dem Zielservice kommunizieren und diesen darüber informieren, dass ein Ereignis ausgelöst wurde, indem eine bereitgestellte URL mit Informationen über dieses Ereignis aufgerufen wird.

APISIX sendet die POST-Anfrage an den Webhook

Voraussetzungen

  • Docker auf Ihrem Computer installiert, um APISIX auszuführen.
  • Grundkenntnisse über einige APISIX-Kernkonzepte wie Route, Upstream und Plugin.

Projekt einrichten

Das erste, was Sie tun müssen, ist das apisix-docker-Projekt-Repo von GitHub zu klonen:

git clone https://github.com/apache/apisix-docker.git

Öffnen Sie den Projektordner in Ihrem bevorzugten Code-Editor. Das Tutorial verwendet VS Code.

Apache APISIX installieren und ausführen

Um Apache APISIX auszuführen, können Sie diese Schritte befolgen:

Öffnen Sie ein neues Terminalfenster und führen Sie den Befehl docker compose up aus dem Stammverzeichnis des Projekts aus:

docker compose up -d

Der obige Befehl führt Apache APISIX und etcd zusammen mit Docker aus.

Wir haben APISIX in dieser Demo mit Docker installiert. Es gibt jedoch andere Möglichkeiten, es zu installieren, wie im Installationshandbuch beschrieben.

Serverlose Funktion in Apache APISIX konfigurieren

Um die serverlose Funktion in Apache APISIX einzurichten, müssen Sie eine neue Route für den Endpunkt erstellen und das Serverless-Plugin mit unserem benutzerdefinierten Funktionscode in Lua konfigurieren.

Hier ist ein Beispiel für eine serverlose Funktion in Lua, die eingehende POST-Anfragen an den Endpunkt überwacht und eine Webhook-Benachrichtigung sendet:

function webhook(conf, ctx)

    -- Notwendige Bibliotheken importieren
    local http = require("resty.http")
    local core = require("apisix.core")

    -- Webhook-Benachrichtigung nur senden, wenn die Anfragemethode POST ist, ansonsten überspringen und wie gewohnt an den Upstream senden
    if core.request.get_method() == "POST" then
        -- Webhook-Benachrichtigung an die angegebene URL senden
        local httpc = http.new()
        local res, err = httpc:request_uri("http://webhook.site/9db3d3a0-ab64-4142-a39f-d4852ca50f8d", {
            method = "POST",
            headers = {
                ["Content-Type"] = "application/json"
            },
            body = core.request.get_body(),
        })
        -- Antwort vom Webhook überprüfen
        if not res then
            core.log.error("Fehler beim Senden des Webhooks: ", err)
            return 500, err
        end
    end

    -- Antwort vom Upstream-Dienst zurückgeben
    return conf.status, conf.body
end

Wie Sie im obigen Beispielcode für die Webhook-Funktion sehen können, sendet er JSON-POST-Anfragen an eine bereitgestellte URL mit dem Anfragekörper (der Anfragekörper vom Client zum API-Gateway) als Nutzlast. Die Website https://webhook.site wird verwendet, um unseren Webhook-Endpunkt zu simulieren.

Um Ihren Webhook-Endpunkt zu erstellen und einzurichten:

  1. Generieren Sie eine URL, indem Sie https://webhook.site in Ihrem Webbrowser aufrufen.
  2. Wählen Sie Copy to clipboard neben Your unique URL.
  3. Fügen Sie sie in die request_uri-Methode der HTTP-Anfrage im Funktionscode ein.

Außerdem werden alle anderen Anfragen, einschließlich POST, weiter an den Upstream-Dienst gesendet. Im nächsten Schritt konfigurieren wir eine Route und einen Upstream.

Route und Upstream konfigurieren

Jetzt erstellen wir eine neue Route mit aktiviertem Serverless-Funktions-Plugin und einem Upstream, der als unser Backend-Dienst fungiert.

curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/1' \
    -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
    -H 'Content-Type: application/json' \
    -d '{
    "uri": "/post",
    "plugins": {
        "serverless-pre-function": {
            "phase": "rewrite",
            "functions" : ["
                    return function(conf, ctx)
                        -- Notwendige Bibliotheken importieren
                        local http = require(\"resty.http\")
                        local core = require(\"apisix.core\")

                        -- Webhook-Benachrichtigung nur senden, wenn die Anfragemethode POST ist, ansonsten überspringen und wie gewohnt an den Upstream senden
                        if core.request.get_method() == \"POST\" then
                            -- Webhook-Benachrichtigung an die angegebene URL senden
                            local httpc = http.new()
                            local res, err = httpc:request_uri(\"http://webhook.site/9db3d3a0-ab64-4142-a39f-d4852ca50f8d\", {
                                method = \"POST\",
                                headers = {
                                    [\"Content-Type\"] = \"application/json\"
                                },
                                body = core.request.get_body(),
                            })
                            -- Antwort vom Webhook überprüfen
                            if not res then
                                core.log.error(\"Fehler beim Senden des Webhooks: \", err)
                                return 500, err
                            end
                        end

                        -- Antwort vom Upstream-Dienst zurückgeben
                        return conf.status, conf.body
                    end"]
        }
    },
    "upstream": {
        "nodes": {
            "httpbin.org:80": 1
        },
        "type": "roundrobin"
    }
}'

Im vorherigen Beispiel für die Routenkonfiguration haben wir unsere erste Route erstellt, indem wir eine curl-Anfrage an die APISIX Admin API gesendet haben. Im Anfragekörper der Route haben wir angegeben, dass alle Anfragen an den Pfad /post den serverlosen Funktionscode auslösen und später an das Ziel httpbin.org weitergeleitet werden. Dies bedeutet, dass die Anfrage an den Endpunkt httpbin.org/post weitergeleitet wird, nachdem überprüft wurde, ob die Anfragemethode POST ist und ob das Ereignis an den Webhook-Endpunkt des Drittanbieters gesendet werden soll oder nicht. Der Backend-Dienst kann durch Ihren eigenen Backend-Dienst ersetzt werden.

Sie werden auch bemerken, dass wir den Funktionscode in die functions-Eigenschaft von serverless-pre-function im JSON-Objekt eingefügt haben.

Konfiguration testen

Schließlich testen wir, ob alles wie erwartet funktioniert, indem wir den /post-API-Gateway-Endpunkt aufrufen und das POST-Ereignis an die Webhook-Website gesendet wird.

curl -i http://127.0.0.1:9080/post -X POST -d \
'{
   "message": "A new webhook message"
}'

Nachdem Sie zur Webhook-URL von der Seite https://webhook.site navigiert haben, die Sie in den vorherigen Schritten generiert haben, sollten Sie eine POST-Anfrage sehen, die unseren Webhook-Endpunkt über das Ereignis informiert und den Anfragekörper gesendet hat.

APISIX sendet die Nutzlast an den Webhook

Zusätzlich dazu erhalten wir die Antwort vom Mock-Upstream-Dienst httpbin.org zurück:

HTTP/1.1 200 OK
Content-Type: application/json

{
  ...
  "form": {
    "{\n   \"message\": \"A new webhook message\"\n}": ""
  },
  "headers": {
    "Accept": "*/*",
    "Content-Length": "41",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "127.0.0.1",
    "X-Forwarded-Host": "127.0.0.1"
  },
  "json": null,
  "url": "http://127.0.0.1/post"
}

Offensichtlich wird der Webhook-Endpunkt nicht ausgelöst, wenn Sie andere HTTP-Anfragemethoden als POST senden.

Dies ist ein einfaches Beispiel für die Einrichtung einer serverlosen Funktion in Apache APISIX. Sie können diese Funktionalität erweitern, indem Sie komplexere Logik zu Ihrer serverlosen Funktion hinzufügen, wie z.B. das Auslösen einer weiteren Funktion als Reaktion auf Webhooks.

Fazit

Das Apache APISIX Serverless-Plugin für Ereignishooks bietet eine flexible und skalierbare Möglichkeit, serverlose Funktionen als Reaktion auf Ereignisse auszulösen, die während der Verarbeitung von API-Anfragen auftreten. Durch die Verwendung des Plugins können Sie Ihre API-Architektur vereinfachen, die Leistung und Zuverlässigkeit Ihrer Dienste verbessern und die Kosten für die Verwaltung Ihrer Anwendungsinfrastruktur senken.

Verwandte Ressourcen

Empfohlene Inhalte

Community

🙋 Treten Sie der Apache APISIX Community bei 🐦 Folgen Sie uns auf Twitter 📝 Finden Sie uns auf Slack

Tags: