In einer auf Microservices basierenden Architektur für ein System auf Unternehmensebene wie Clumio ist es nicht praktikabel, für jeden Microservice einen öffentlichen Endpunkt zu haben. Eines der größten Probleme ist die enge Kopplung, die dadurch zwischen Client und Server entsteht. Zudem muss jeder Microservice die gemeinsamen Komponenten wie Protokollierung, Tracing und Sicherheit (Authentifizierung, Autorisierung, Ratenbegrenzung) implementieren und warten.
An API Gateway dwells between a client and a server to proxy requests and responses between the two.
Ein API-Gateway bietet einen einheitlichen Einstiegspunkt für alle externen Clients und ein Framework, das alle oben genannten gemeinsamen Komponenten abdeckt. Dies ermöglicht es zudem jedem Microservice, unabhängig vom Gateway sein eigenes Kommunikationsprotokoll zu implementieren, das seinen Anforderungen am besten entspricht.
AWS API Gateway
Neben den oben genannten Vorteilen, die API-Gateways bieten, hatten wir noch weitere Anforderungen, die bei der Auswahl eine Rolle spielten:
- Ein Mechanismus, der eine nahtlose Integration mit dem API-Gateway ermöglicht, sodass die Einführung neuer APIs und die Pflege bestehender APIs reibungslos bzw. mit minimalem Aufwand erfolgen, damit sich die Entwickler in erster Linie auf ihre Geschäftslogik konzentrieren können
- Da ein API-Gateway potenziell einen Single Point of Failure darstellen könnte, sollte es sich um ein vollständig verwaltetes Angebot handeln, das ausfallsicher und hoch skalierbar ist.
- Unterstützung für WebSockets
Das AWS API Gateway erfüllt all diese Anforderungen und bietet eine gute Integration mit anderen AWS-Diensten, auf deren Grundlage sich weitere Lösungen entwickeln lassen.

Nutzung des AWS API Gateway
Swagger-Spezifikation
Swaggerprovides a powerful representation for RESTful APIs.
We have employed the„go-swagger“tool which is capable of generating a Swagger specification from annotated Go code.
Daher müssen Entwickler ihre REST-API lediglich gemäß der oben genannten Spezifikation mit Annotationen versehen und es unserem Framework (auf das später noch eingegangen wird) überlassen, die Integration in das AWS API Gateway zu übernehmen.
Integration mit AWS API Gateway
At Clumio, all our AWS infrastructure is managed as code viaTerraformverwaltet. Das AWS API Gateway lässt sich mithilfe der von Terraform bereitgestellten Ressourcen konfigurieren.
We use the„aws_api_gateway_rest_api“resource that allows us to feed the entire Swagger specification into the AWS API Gateway. The AWS API Gateway, however, cannot process a raw Swagger specification. It expects various extensions (likex-amazon-apigateway-integration), damit es eine API nahtlos konfigurieren kann. Hierfür haben wir ein Framework implementiert, das die erforderlichen Erweiterungen in eine rohe Swagger-Spezifikation einfügt, damit diese mit dem AWS API Gateway funktioniert!
VPC-Link-Integrationstyp
AWS API Gateway bietet verschiedene Integrationsmöglichkeiten mit Ihren Backend-Servern, um die eingehenden API-Anfragen weiterzuleiten.

As all our microservices are bound to a VPC for tighter security, we use theVPC Linkintegration. This enables the AWS API Gateway to access private API endpoints within the VPC securely.
Benutzerdefinierte Domainnamen und API-Zuordnungen
Standardmäßig generiert AWS API Gateway einen eindeutigen Domainnamen für die API, etwa aabbccdd12.execute-api.us-west-2.amazonaws.com. Als Unternehmen möchten wir natürlich den öffentlichen Domainnamen der APIs für unsere Nutzer individuell anpassen. AWS API Gateway ermöglicht uns dies über benutzerdefinierte Domainnamen.
Darüber hinaus erstellen wir im API Gateway separate APIs, die einigen unserer am stärksten frequentierten API-Basispfade entsprechen. Alle diese APIs werden dann wie unten dargestellt über API-Mappings miteinander verknüpft. Auf diese Weise können wir unsere APIs horizontal skalieren und verfügen dennoch über einen einzigen, nach außen gerichteten Domainnamen für sie.

Lambda Authorizer, Nutzungspläne und API-Schlüssel
Wie bereits erwähnt, besteht einer der Hauptanwendungsfälle für ein API-Gateway darin, die Authentifizierung und Autorisierung gleich zu Beginn des Lebenszyklus einer API-Anfrage durchzusetzen, damit nur der relevante Datenverkehr die Backend-Server erreicht.
We leverageLambda Authorizerfor authentication and authorization, while theNutzungspläne und API-Schlüsselare used to enforce rate-limiting/throttling for our APIs.

Wir haben einen tokenbasierten Lambda-Authorizer implementiert, der folgende Eingabe erwartet:
DasauthorizationToken(in the form of aJWT) kann verwendet werden, um die erforderliche Authentifizierungs-/Autorisierungslogik innerhalb des Lambda-Autorisierers zu implementieren, um die folgende Ausgabe zurückzugeben:
The authentication/authorization decision is governed by the value ofEffect(Allow|Deny) and the throttling decision is governed by the API key identifier inusageIdentifierKey. Der API-Schlüssel muss einem Nutzungsplan zugeordnet sein, der das durchzusetzende Anforderungslimit (in Form von Anfragen pro Sekunde) festlegt. Wir stellen für jeden Kunden einen API-Schlüssel aus und können somit die Drosselung auf Kundenebene durchsetzen.
Another interesting thing in the output iscontextwhich can have any key-value pairs as required by the application. We use this heavily to capture the client information which we then pass throughout the API request lifecycle. This eliminates the need to lookup client details, while the request navigates through multiple microservices at the backend.
Schlussfolgerung
Wir hoffen, dass Sie einen Einblick darin gewonnen haben, wie wir bei Clumio das AWS API Gateway nutzen, und dass Sie einen kleinen Einblick in unsere allgemeinen technischen Aktivitäten erhalten haben. Wir legen größten Wert auf Sicherheit, Skalierbarkeit und vor allem auf die Einführung entwicklerfreundlicher Prozesse. Dies erleichtert die Wartung unserer Produkte im Zuge unserer Weiterentwicklung und Skalierung und gewährleistet gleichzeitig genügend Flexibilität, um neue Funktionen zu integrieren.