Apache APISIXs Integration mit Azure Serverless

API7.ai

December 1, 2021

Ecosystem

Integration von Apache APISIX mit Azure Serverless

Apache APISIX bietet Unterstützung für Serverless-Frameworks von beliebten Cloud-Anbietern (weitere sind in Arbeit). Anstatt die Funktions-URL hart in der Anwendung zu kodieren, schlägt Apache APISIX vor, eine Route mit aktiviertem Serverless-Plugin zu definieren. Dies gibt den Entwicklern die Flexibilität, die Funktions-URI heiß zu aktualisieren und den FaaS-Anbieter problemlos zu einem anderen Cloud-Provider zu wechseln. Darüber hinaus reduziert dieser Ansatz die Probleme mit der Autorisierung und Authentifizierung in der Anwendungslogik, da Apache APISIX über eine sehr starke Authentifizierungsunterstützung verfügt, die verwendet werden kann, um Client-Consumer zu identifizieren und zu autorisieren, auf die spezifische Route mit dem FaaS zuzugreifen. Dieser Artikel behandelt die kürzlich hinzugefügte neue Plugin-Erweiterung azure-functions und gibt detaillierte Anweisungen, wie Azure Functions, eine weit verbreitete Serverless-Lösung, in die Apache APISIX Serverless-Suite integriert werden kann.

Wie das azure-functions-Plugin funktioniert

Das azure-functions-Plugin ermöglicht es Benutzern, ein Upstream für die Azure HTTP Trigger-Serverless-Funktion für eine Gateway-URI zu definieren. Wenn aktiviert, beendet dieses Plugin die laufende Anfrage an diese spezifische URI und initiiert eine neue Anfrage an den Azure FaaS (das neue Upstream) im Namen des Clients mit den entsprechenden Autorisierungsdetails, die vom Benutzer festgelegt wurden, den Anfrage-Headern, dem Anfrage-Body und den Parametern (alle diese drei Komponenten werden von der ursprünglichen Anfrage übernommen) und gibt den Antwort-Body, den Statuscode und die Header an den ursprünglichen Client zurück, der die Anfrage an den Apache APISIX-Agenten gestellt hat.

Das Plugin unterstützt die Autorisierung für den Azure FaaS-Dienst über API-Schlüssel und Azure Active Directory.

Wie man Azure Functions mit Apache APISIX verwendet

Das primäre Ziel des Plugins ist es, die in der Routenkonfiguration angegebene Gateway-Route an die Azure Functions-URI zu proxen. Dieser Abschnitt gibt Ihnen eine praktische Anleitung, wie Sie einen serverlosen HTTP-Trigger in der Azure-Cloud konfigurieren und erstellen können.

  1. Melden Sie sich zunächst bei Microsoft Azure an und richten Sie einen Testplan ein. Azure Functions sind dauerhaft kostenlos bis zu 1 Million Aufrufen. Weitere Informationen zur Preisgestaltung finden Sie hier.

  2. Besuchen Sie das Azure-Portal (FYI, Azure-Dienste können über das Webportal, die CLI und VSCode aufgerufen werden. Der Einfachheit halber verwenden wir das Web).

    1. Erstellen Sie zunächst eine Ressourcengruppe, um Ihren FaaS, den Sie erstellen möchten, logisch zu partitionieren. Erstellen einer Ressourcengruppe
    2. Erstellen Sie eine Funktions-App mit der URL Ihrer Wahl (ich werde test-apisix auswählen). Erstellen einer Funktions-App
  3. Installieren Sie die Azure Functions-Erweiterung in den VSCode-Editor. Authentifizieren Sie sich nach der Installation über die Erweiterung und installieren Sie das Azure Functions Core Tool für die lokale Entwicklung mit:

    npm install -g azure-functions-core-tools@3 --unsafe-perm true
    
  4. Stellen Sie den folgenden Code-Snippet in derselben Funktions-App bereit, die wir gerade über das Azure Functions-Erweiterungs-Panel in VSCode erstellt haben:

    module.exports = async function (context, req) {
      context.log("HTTP trigger invoked on Test-APISIX.");
    
      const name = req.query.name || (req.body && req.body.name);
      const responseMessage = name
        ? "Hello, " + name
        : "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body to generate a personalized response.";
    
      context.res = {
        // status: 200, /* Defaults to 200 */
        body: responseMessage,
      };
    };
    

Dieser Code-Snippet nimmt den Namen aus den Abfrageparametern (falls vorhanden, sonst aus dem Anfrage-Body) und begrüßt den Benutzer.

Aktivieren des azure-functions-Plugins

Das folgende Beispiel zeigt, wie das azure-functions-Plugin für eine bestimmte Route aktiviert wird. Wir gehen davon aus, dass Ihr HTTP-Trigger bereitgestellt ist und bereit ist, bedient zu werden.

# Plugin für eine bestimmte Route aktivieren
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "plugins": {
        "azure-functions": {
            "function_uri": "http://test-apisix.azurewebsites.net/api/HttpTrigger",
            "authorization": {
                "apikey": "<Generierter API-Schlüssel für den Zugriff auf die Azure-Funktion>"
            }
        }
    },
    "uri": "/azure"
}'

Jede Anfrage (HTTP/1.1, HTTPS, HTTP2) an die URI /azure auf dem Apache APISIX-Gateway wird eine HTTP-Aufrufung an die oben genannte Funktions-URI auslösen, und der Antwort-Body zusammen mit den Antwort-Headern und dem Antwortcode wird an den Client zurückgegeben. Beispiel (hier nimmt die Azure-Cloud-Funktion nur den name-Abfrageparameter entgegen und gibt Hello $name zurück):

curl -i -XGET http://localhost:9080/azure\?name=Bisakh
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Request-Context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071
Date: Wed, 19 Nov 2021 18:46:55 GMT
Server: APISIX/2.10.2

Hello, Bisakh

Angenommen, Apache APISIX läuft auch mit enable_http2: true in der config-default.yaml für Port 9081 (sagen wir), dann wird jede HTTP/2-Kommunikation zwischen Client und APISIX-Agent ähnlich wie bei HTTP/1.1 an den Azure FaaS weitergeleitet, und die Antworten werden mit den entsprechenden Headern an den Client zurückgegeben. Beispiel:

curl -i -XGET --http2 --http2-prior-knowledge http://localhost:9081/azure\?name=Bisakh
HTTP/2 200
content-type: text/plain; charset=utf-8
request-context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071
Date: Wed, 19 Nov 2021 18:46:56 GMT
server: APISIX/2.10.2

Hello, Bisakh

Deaktivieren des azure-functions-Plugins

Um das Plugin zu deaktivieren, entfernen Sie einfach die entsprechende JSON-Konfiguration in der Plugin-Konfiguration, um das azure-functions-Plugin zu deaktivieren, und fügen Sie die entsprechende Upstream-Konfiguration hinzu. Apache APISIX-Plugins werden heiß neu geladen, daher ist kein Neustart von Apache APISIX erforderlich.

curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "uri": "/azure",
    "plugins": {},
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "127.0.0.1:1980": 1
        }
    }
}'

Benutzerdefinierte Konfiguration

In einer minimalen Konfiguration beim Erstellen einer neuen Route mit aktiviertem azure-functions-Plugin ist function_uri das obligatorische Attribut der Plugin-Konfiguration, das auf die Funktions-URL verweist. Es gibt viele zusätzliche Optionen, die mit dem Plugin-Schema und dem Metadaten-Schema angepasst werden können.

Plugin-Schema

NameTypErforderlichStandardGültigBeschreibung
function_uristringerforderlichn/an/aDer Azure-Funktions-Endpunkt, der den serverlosen Funktionscode auslöst (z.B. http://test-apisix.azurewebsites.net/api/HttpTrigger).
authorizationobjectoptionaln/an/aAutorisierungsdaten für den Zugriff auf die Cloud-Funktion.
authorization.apikeystringoptionaln/an/aFeld innerhalb der Autorisierung. Der generierte API-Schlüssel, um Anfragen an diesen Endpunkt zu autorisieren.
authorization.clientidstringoptionaln/an/aFeld innerhalb der Autorisierung. Die Client-ID (Azure Active Directory), um Anfragen an diesen Endpunkt zu autorisieren.
timeoutintegeroptional3000[100,...]Timeout für Proxy-Anfragen in Millisekunden.
ssl_verifybooleanoptionaltruetrue/falseOb die SSL-Überprüfung des Servers aktiviert ist.
keepalivebooleanoptionaltruetrue/falseUm dieselbe Proxy-Verbindung in naher Zukunft wiederzuverwenden. Setzen Sie auf false, um Keepalives zu deaktivieren und die Verbindung sofort zu schließen.
keepalive_poolintegeroptional5[1,...]Die maximale Anzahl von Verbindungen im Pool.
keepalive_timeoutintegeroptional60000[1000,...]Das maximale Leerlauf-Timeout (ms).

Dies bietet eine große Flexibilität, um das Verhalten des Azure FaaS eng zu binden – von der Konfiguration des Timeouts bis zum Keepalive-Pool und der Validierung des SSL-Zertifikats des serverlosen FaaS. Um ehrlich zu sein, bedeutet dies viel, wenn es um Serverless geht, da die Dienste ereignisgesteuert sind und die Ressourcen vom Cloud-Anbieter dynamisch zugewiesen werden.

Metadaten-Schema

Ebenso gibt es einige Attribute, die durch die Verwendung von Metadaten angepasst werden können.

NameTypErforderlichStandardGültigBeschreibung
master_apikeystringoptional""n/aDer API-Schlüssel, der verwendet werden könnte, um auf die Azure-Funktions-URI zuzugreifen.
master_clientidstringoptional""n/aDie Client-ID (Active Directory), die verwendet werden könnte, um die Funktions-URI zu autorisieren.

Metadaten für das azure-functions-Plugin bieten die Funktionalität für eine Autorisierungs-Fallback-Lösung. Es definiert master_apikey und master_clientid (Azure Active Directory Client-ID), wo Benutzer (optional) den Master-API-Schlüssel oder die Client-ID für missionkritische Anwendungsbereitstellungen definieren können. Wenn also keine Autorisierungsdetails innerhalb des Plugin-Attributs gefunden werden, greifen die Autorisierungsdetails, die in den Metadaten vorhanden sind.

Die relative Prioritätsreihenfolge ist wie folgt:

  • Zuerst sucht das Plugin nach den Schlüsseln x-functions-key oder x-functions-clientid innerhalb des Anfrage-Headers an den Apache APISIX-Agenten.
  • Wenn sie nicht gefunden werden, überprüft das azure-functions-Plugin die Autorisierungsdetails innerhalb der Plugin-Attribute. Wenn vorhanden, fügt es den entsprechenden Header zur Anfrage hinzu, die an die Azure-Cloud-Funktion gesendet wird.
  • Wenn keine Autorisierungsdetails innerhalb der Plugin-Attribute gefunden werden, holt Apache APISIX die Metadaten-Konfiguration für dieses Plugin und verwendet die Master-Schlüssel.

Um einen neuen Master-API-Schlüssel hinzuzufügen, senden Sie eine Anfrage an den Endpunkt /apisix/admin/plugin_metadata mit den aktualisierten Metadaten wie folgt:

curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/azure-functions \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "master_apikey" : "<Ihr Azure-Master-Zugriffsschlüssel>"
}'

Zusammenfassung

Das azure-functions-Plugin ist das zweite Plugin von Apache APISIX, das für Serverless entwickelt wurde. Wir entwickeln weitere Serverless-Plugins und werden sie in den kommenden Apache APISIX-Versionen vorstellen. Wenn Sie interessiert sind, zögern Sie nicht, ein Issue zu erstellen, um Ihre Meinungen zu teilen. Sie können auch Ihre Vorschläge zur Entwicklung eines neuen Plugins in unserer Mailing-Liste diskutieren!

Tags: