Ich versuche, ein Amazon API-Gateway vor einen Application Load Balancer zu stellen, der den Datenverkehr zu meinem ECS-Cluster ausgleicht, in dem alle meine Mikrodienste bereitgestellt werden. Die Motivation für die Verwendung des API-Gateways ist die Verwendung eines benutzerdefinierten Autorisierungsprogramms über eine Lambda-Funktion.
Systemdiagramm
In Amazon-Wörtern ( https://aws.Amazon.com/api-gateway/faqs/ ): "Proxy-Anfragen an Back-End-Vorgänge müssen auch im Internet öffentlich zugänglich sein". Dies zwingt mich dazu, die ELB an die Öffentlichkeit zu stellen (Internetverbindung) anstatt intern. Dann brauche ich eine Möglichkeit, sicherzustellen, dass only das API-Gateway außerhalb der VPC auf die ELB zugreifen kann.
Meine erste Idee war, ein Client-Zertifikat in der API-Gatway zu verwenden, aber die ELB scheint dies nicht zu unterstützen.
Alle Ideen wären sehr dankbar!
Dies scheint ein riesiges Fehlteil für die API-Gateway-Technologie zu sein. Wenn Sie in der VPC keinen internen Server anrufen können, ist die Verwendung als Authentifizierungseingang für den Internetzugriff stark eingeschränkt. FWIW: In Azure unterstützt API Management dies sofort - es kann Anforderungen von annehmen Internet und Anrufe direkt in Ihr virtuelles Netzwerk einleiten, das ansonsten durch eine Firewall geschützt ist .. Die einzige Möglichkeit, die unter AWS möglich zu sein scheint, ist die Verwendung von Lambdas, was eine erhebliche Komplexitätsebene verursacht, insbesondere. wenn Sie verschiedene binäre Protokolle unterstützen müssen.
Sieht aus, als wäre diese Unterstützung jetzt hinzugefügt worden. Nicht getestet, YMMV:
Derzeit gibt es keine Möglichkeit, das API-Gateway vor der privaten ELB zu stellen. Sie haben also Recht, dass es mit dem Internet verbunden sein muss. Die beste Lösung für Ihren Fall, die ich mir vorstellen kann, wäre, ELB in den Durchlaufmodus TCP zu setzen und das Client-Zertifikat auf Ihren Endhosts hinter der ELB zu beenden.
Wir haben uns entschieden, einen Header zu verwenden, um zu überprüfen, ob der gesamte Datenverkehr durch API Gateway kommt. Wir speichern ein Geheimnis in den Umgebungsvariablen unserer Apps und teilen dem API Gateway mit, dass es bei der Erstellung der API eingefügt werden soll. Dann überprüfen Sie den Schlüssel in unserer App.
Folgendes tun wir dafür:
In unserem Basiscontroller überprüfen wir den Schlüssel (hinter dem Gateway befindet sich nur eine REST - API):
string ApiGatewayPassthroughHeader = context.HttpContext.Request.Headers["ApiGatewayPassthroughHeader"];
if (ApiGatewayPassthroughHeader != Environment.GetEnvironmentVariable("ApiGatewayPassthroughHeader"))
{
throw new error;
}
In unserer Swagger-Datei (wir verwenden swagger.json als Quelle für unsere APIs)
"x-Amazon-apigateway-integration": {
"type": "http_proxy",
"uri": "https://${stageVariables.url}/path/to/resource",
"httpMethod": "post",
"requestParameters": {
"integration.request.header.ApiGatewayPassthroughHeader": "${ApiGatewayPassthroughHeader}"
}
},
In unserer Docker-Compose-Datei (wir verwenden Docker, das gleiche kann jedoch in jeder Einstellungsdatei verwendet werden)
services:
example:
environment:
- ApiGatewayPassthroughHeader=9708cc2d-2d42-example-8526-4586b1bcc74d
Bei der Erstellung nehmen wir das Geheimnis aus unserer Einstellungsdatei und ersetzen es in der Datei swagger.json. Auf diese Weise können wir den Schlüssel in unserer Einstellungsdatei drehen und das API-Gateway wird aktualisiert, um den Schlüssel zu verwenden, nach dem die App sucht.
Dies ist möglich, wenn Sie VPC Link und Network Load Balancer verwenden.
Bitte werfen Sie einen Blick auf diesen Beitrag: https://adrianhesketh.com/2017/12/15/aws-api-gateway-to-ecs-via-vpc-link/
TL; DR
Hoffentlich hilft das!
Es ist jetzt möglich, einen Authorizer direkt vor dem ECS zu Application Load Balancer (ALB) hinzuzufügen.
Dies kann direkt in den Regeln eines Listeners konfiguriert werden. In diesem Blogeintrag finden Sie Details:
https://aws.Amazon.com/de/blogs/aws/built-in-authentication-in-alb/