J'essaie de placer Amazon API Gateway devant un équilibreur de charge d'application, qui équilibre le trafic vers mon cluster ECS, où tous mes microservices sont déployés. La motivation d'utiliser l'API Gateway est d'utiliser un autoriseur personnalisé via une fonction lambda.
Diagramme système
En mots Amazon ( https://aws.Amazon.com/api-gateway/faqs/ ): "Les demandes de proxy pour les opérations d'arrière-plan doivent également être accessibles au public sur Internet". Cela m'oblige à rendre l'ELB public (face à Internet) au lieu d'interne. Ensuite, j'ai besoin d'un moyen de m'assurer que uniquement la passerelle API est capable d'accéder à l'ELB en dehors du VPC.
Ma première idée était d’utiliser un certificat client dans l’API Gatway, mais le ELB ne semble pas le prendre en charge.
Toutes les idées seraient très appréciées!
Cela semble être une énorme pièce manquante pour la technologie de passerelle API, compte tenu de la façon dont elle a été poussée. L'impossibilité d'appeler un serveur interne du VPC restreint considérablement son utilité en tant qu'authentification d'entrée pour l'accès à Internet. Internet et appelez directement sur votre réseau virtuel qui est par ailleurs désactivé par un pare-feu . La seule façon dont cela semble possible sous AWS est d'utiliser Lambdas, ce qui ajoute une couche importante de complexité, en particulier. si vous avez besoin de supporter différents protocoles binaires.
On dirait que ce support a maintenant été ajouté. N'a pas testé, YMMV:
À l'heure actuelle, il n'est pas possible de placer l'API Gateway devant un ELB privé. Vous avez donc raison de dire qu'il doit être connecté à Internet. La meilleure solution de contournement pour votre cas que je peux imaginer serait de mettre ELB en mode de transit TCP et de mettre fin au certificat client sur vos hôtes d'extrémité derrière l'ELB.
Nous avons décidé d’utiliser un en-tête pour vérifier que tout le trafic provient de l’API Gateway. Nous enregistrons un secret dans les variables d'environnement de nos applications et demandons à la passerelle API de l'inclure lors de la création de l'API. Ensuite, vérifiez cette clé dans notre application.
Voici ce que nous faisons pour cela:
Dans notre contrôleur de base, nous vérifions la clé (nous avons juste une API REST derrière la passerelle):
string ApiGatewayPassthroughHeader = context.HttpContext.Request.Headers["ApiGatewayPassthroughHeader"];
if (ApiGatewayPassthroughHeader != Environment.GetEnvironmentVariable("ApiGatewayPassthroughHeader"))
{
throw new error;
}
Dans notre fichier swagger (nous utilisons swagger.json comme source de nos API)
"x-Amazon-apigateway-integration": {
"type": "http_proxy",
"uri": "https://${stageVariables.url}/path/to/resource",
"httpMethod": "post",
"requestParameters": {
"integration.request.header.ApiGatewayPassthroughHeader": "${ApiGatewayPassthroughHeader}"
}
},
Dans notre fichier de composition de docker (nous utilisons docker, mais la même chose peut être utilisée dans n’importe quel fichier de paramètres)
services:
example:
environment:
- ApiGatewayPassthroughHeader=9708cc2d-2d42-example-8526-4586b1bcc74d
Au moment de la construction, nous extrayons le secret de notre fichier de paramètres et le remplaçons dans le fichier swagger.json. De cette manière, nous pouvons faire pivoter la clé dans notre fichier de paramètres et la passerelle d’API se mettra à jour pour utiliser la clé recherchée par l’application.
Cela est possible si vous utilisez VPC Link et Network Load Balancer.
S'il vous plaît jeter un oeil à ce post: https://adrianhesketh.com/2017/12/15/aws-api-gateway-to-ecs-via-vpc-link/
TL; DR
J'espère que cela pourra aider!
Il est maintenant possible d'ajouter un autoriseur directement à Application Load Balancer (ALB) devant ECS.
Ceci peut être configuré directement dans les règles d'un écouteur. Voir ce blog pour plus de détails:
https://aws.Amazon.com/de/blogs/aws/built-in-authentication-in-alb/