API Gateway
Le gardien intelligent de vos API qui orchestre, sécurise et optimise les interactions entre vos services et vos clients.
Qu'est-ce qu'un API Gateway ?
Imaginez un grand hôtel de luxe. Les clients (applications, sites web, mobiles) souhaitent profiter des services de l'hôtel, mais ne peuvent pas accéder directement aux cuisines, à la blanchisserie ou aux réserves.
L'API Gateway est comme le concierge de l'hôtel. Il se trouve à l'entrée, accueille les clients, vérifie leurs autorisations, les dirige vers le bon service, et s'assure que toutes les demandes sont traitées correctement et de manière sécurisée.
Pourquoi est-ce important ?
Sécurité
Protège vos services internes contre les accès non autorisés et les attaques malveillantes.
Simplicité
Offre une interface unique et cohérente pour accéder à différents services, même s'ils utilisent des technologies différentes.
En résumé, un API Gateway est un composant essentiel des architectures modernes qui facilite la communication entre différentes applications tout en ajoutant une couche de sécurité, de performance et de gestion indispensable.
Fonctionnement technique
Un API Gateway est un service qui se positionne comme point d'entrée unique pour toutes les requêtes client vers les services backend. Il agit comme une façade unifiée qui abstrait l'architecture sous-jacente et offre de nombreuses fonctionnalités essentielles.
Les fonctionnalités clés
Routage et orchestration
L'API Gateway route intelligemment les requêtes vers les services appropriés, permettant l'agrégation de plusieurs appels backend ou la décomposition d'une requête en plusieurs appels. Il est souvent utilisé en conjonction avec des fonctions AWS Lambda et des services
S3.
// Exemple de définition d'une API Gateway AWS avec CloudFormation
Resources:
ApiGatewayRestApi:
Type: AWS::ApiGateway::RestApi
Properties:
Name: SampleApiGateway
Description: Example API Gateway for demonstration
EndpointConfiguration:
Types:
- REGIONAL
ApiGatewayResource:
Type: AWS::ApiGateway::Resource
Properties:
ParentId: !GetAtt ApiGatewayRestApi.RootResourceId
PathPart: "items"
RestApiId: !Ref ApiGatewayRestApi
ApiGatewayMethod:
Type: AWS::ApiGateway::Method
Properties:
AuthorizationType: NONE
HttpMethod: GET
ResourceId: !Ref ApiGatewayResource
RestApiId: !Ref ApiGatewayRestApi
Integration:
IntegrationHttpMethod: POST
Type: AWS_PROXY
Uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${LambdaFunction.Arn}/invocations
ApiGatewayDeployment:
Type: AWS::ApiGateway::Deployment
DependsOn: ApiGatewayMethod
Properties:
RestApiId: !Ref ApiGatewayRestApi
StageName: prod
Sécurité et authentification
Implémente divers mécanismes de sécurité comme l'authentification (OAuth, JWT, API Keys), l'autorisation, et la validation des requêtes. Ces méthodes sont souvent intégrées avec AWS Cognito pour une gestion complète des identités.
// Exemple de configuration OAuth avec un API Gateway
// Configuration typique dans un API Gateway
{
"type": "oauth2",
"flows": {
"authorizationCode": {
"authorizationUrl": "https://auth.example.com/oauth/authorize",
"tokenUrl": "https://auth.example.com/oauth/token",
"scopes": {
"read:users": "Lecture des informations utilisateurs",
"write:users": "Modification des informations utilisateurs"
}
}
}
}
// Exemple d'implémentation côté client (JavaScript)
async function getProtectedResource() {
const token = localStorage.getItem('access_token');
const response = await fetch('https://api.example.com/protected-resource', {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
});
return response.json();
}
Rate limiting et throttling
Protège les services backend contre la surcharge en limitant le nombre de requêtes qu'un client peut effectuer dans un intervalle de temps donné.
Exemples de configurations typiques:
- Limite de 100 requêtes par minute par IP
- Limite de 1000 requêtes par jour par API key
- Throttling adaptatif basé sur la charge du système
Transformation et médiation
Transforme les requêtes et réponses pour assurer la compatibilité entre les clients et les services backend, et permet d'adapter les interfaces au fil du temps.
// Exemple de transformation de réponse API dans un API Gateway
// Kong API Gateway - plugin transformer
{
"name": "response-transformer",
"config": {
"add": {
"headers": ["x-response-time:2ms", "x-api-version:1.0"],
"json": ["metadata.timestamp:$now", "metadata.version:1.0"]
},
"remove": {
"json": ["internal_id", "sensitive_data"]
},
"rename": {
"json": ["user_id:id", "user_name:name"]
},
"replace": {
"json": ["status:active", "type:customer"]
}
}
}
// Exemple du format de données transformées
// Avant la transformation:
{
"user_id": 12345,
"user_name": "Jean Dupont",
"internal_id": "IN-7890",
"sensitive_data": "confidentiel",
"last_login": "2023-10-15"
}
// Après la transformation:
{
"id": 12345,
"name": "Jean Dupont",
"last_login": "2023-10-15",
"status": "active",
"type": "customer",
"metadata": {
"timestamp": "2023-10-16T14:30:45Z",
"version": "1.0"
}
}
Implémentations populaires
- AWS API Gateway - Service managé intégré à l'écosystème AWS pour les APIs REST et WebSocket
- Kong - API Gateway open source basé sur NGINX, hautement performant et extensible
- Apigee - Plateforme complète de gestion d'API de Google Cloud
- Express Gateway - Solution basée sur Express.js pour
Node.js
- Spring Cloud Gateway - Solution pour l'écosystème Spring
Exemple avec Express Gateway
Voici un exemple plus concret utilisant Express Gateway, une solution open-source basée sur Express.js:
// Exemple d'API Gateway avec ExpressJS et express-gateway
// Configuration dans gateway.config.yml
http:
port: 8080
admin:
port: 9876
host: localhost
apiEndpoints:
users:
host: localhost
paths: '/users/*'
products:
host: localhost
paths: '/products/*'
serviceEndpoints:
usersService:
url: 'http://localhost:3000'
productsService:
url: 'http://localhost:3001'
policies:
- basic-auth
- cors
- rate-limit
- log
- proxy
pipelines:
users:
apiEndpoints:
- users
policies:
- rate-limit:
action:
max: 100
windowMs: 60000
- basic-auth:
- proxy:
action:
serviceEndpoint: usersService
changeOrigin: true
products:
apiEndpoints:
- products
policies:
- cors:
- log:
action:
message: 'Request to products service'
- proxy:
action:
serviceEndpoint: productsService
Patterns d'architecture
- Backend for Frontend (BFF) - API Gateways spécifiques pour différents clients (mobile, web, etc.) avec des optimisations pour
React ou
Vue.js
- API Composition - Agrégation de plusieurs appels d'API en une seule réponse
- API Versioning - Gestion des différentes versions d'API coexistantes
- Circuit Breaker - Protection contre les défaillances en cascade dans les architectures microservices, souvent implémenté avec
AWS Step Functions
Cas d'usage
Architectures microservices
Facilite la communication entre les microservices et les clients en fournissant un point d'entrée unifié et en masquant la complexité interne.
APIs publiques et partenaires
Sécurise et surveille l'accès aux APIs exposées à des tiers, avec une gestion précise des autorisations et une protection contre les abus.
Applications mobiles et web
Optimise les APIs pour différents clients en adaptant les données et en réduisant les allers-retours réseau.
Évolution des APIs
Permet la coexistence de plusieurs versions d'API et facilite les migrations en douceur en transformant les requêtes et réponses au besoin.
Industries qui utilisent massivement les API Gateways
De nombreux secteurs s'appuient sur les API Gateways pour leurs architectures critiques :