Apache APISIXs Integration mit Azure Serverless
API7.ai
December 1, 2021
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.
-
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.
-
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).
- Erstellen Sie zunächst eine Ressourcengruppe, um Ihren FaaS, den Sie erstellen möchten, logisch zu partitionieren.
- Erstellen Sie eine Funktions-App mit der URL Ihrer Wahl (ich werde test-apisix auswählen).
- Erstellen Sie zunächst eine Ressourcengruppe, um Ihren FaaS, den Sie erstellen möchten, logisch zu partitionieren.
-
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
-
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
Name | Typ | Erforderlich | Standard | Gültig | Beschreibung |
---|---|---|---|---|---|
function_uri | string | erforderlich | n/a | n/a | Der Azure-Funktions-Endpunkt, der den serverlosen Funktionscode auslöst (z.B. http://test-apisix.azurewebsites.net/api/HttpTrigger). |
authorization | object | optional | n/a | n/a | Autorisierungsdaten für den Zugriff auf die Cloud-Funktion. |
authorization.apikey | string | optional | n/a | n/a | Feld innerhalb der Autorisierung. Der generierte API-Schlüssel, um Anfragen an diesen Endpunkt zu autorisieren. |
authorization.clientid | string | optional | n/a | n/a | Feld innerhalb der Autorisierung. Die Client-ID (Azure Active Directory), um Anfragen an diesen Endpunkt zu autorisieren. |
timeout | integer | optional | 3000 | [100,...] | Timeout für Proxy-Anfragen in Millisekunden. |
ssl_verify | boolean | optional | true | true/false | Ob die SSL-Überprüfung des Servers aktiviert ist. |
keepalive | boolean | optional | true | true/false | Um dieselbe Proxy-Verbindung in naher Zukunft wiederzuverwenden. Setzen Sie auf false, um Keepalives zu deaktivieren und die Verbindung sofort zu schließen. |
keepalive_pool | integer | optional | 5 | [1,...] | Die maximale Anzahl von Verbindungen im Pool. |
keepalive_timeout | integer | optional | 60000 | [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.
Name | Typ | Erforderlich | Standard | Gültig | Beschreibung |
---|---|---|---|---|---|
master_apikey | string | optional | "" | n/a | Der API-Schlüssel, der verwendet werden könnte, um auf die Azure-Funktions-URI zuzugreifen. |
master_clientid | string | optional | "" | n/a | Die 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
oderx-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!