Il est parfaitement valable pour mapper plusieurs méthodes en une seule fonction lambda et beaucoup de gens sont à l'aide de cette méthodologie, aujourd'hui, par opposition à la création d'une passerelle api de ressources et d'une fonction lambda pour chaque méthode discrète.
Vous pouvez envisager l'utilisation de proxy toutes les demandes pour une seule fonction. Jetez un oeil à la documentation suivante sur la création d'une Passerelle API => Lambda proxy de l'intégration:
http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html
Leur exemple est grand ici. Une demande similaire à la suivante:
POST /testStage/hello/world?name=me HTTP/1.1
Host: gy415nuibc.execute-api.us-east-1.amazonaws.com
Content-Type: application/json
headerName: headerValue
{
"a": 1
}
Sera le vent de l'envoi de l'événement suivant les données de votre AWS Lambda fonction:
{
"message": "Hello me!",
"input": {
"resource": "/{proxy+}",
"path": "/hello/world",
"httpMethod": "POST",
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"cache-control": "no-cache",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Desktop-Viewer": "true",
"CloudFront-Is-Mobile-Viewer": "false",
"CloudFront-Is-SmartTV-Viewer": "false",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Viewer-Country": "US",
"Content-Type": "application/json",
"headerName": "headerValue",
"Host": "gy415nuibc.execute-api.us-east-1.amazonaws.com",
"Postman-Token": "9f583ef0-ed83-4a38-aef3-eb9ce3f7a57f",
"User-Agent": "PostmanRuntime/2.4.5",
"Via": "1.1 d98420743a69852491bbdea73f7680bd.cloudfront.net (CloudFront)",
"X-Amz-Cf-Id": "pn-PWIJc6thYnZm5P0NMgOUglL1DYtl0gdeJky8tqsg8iS_sgsKD1A==",
"X-Forwarded-For": "54.240.196.186, 54.182.214.83",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https"
},
"queryStringParameters": {
"name": "me"
},
"pathParameters": {
"proxy": "hello/world"
},
"stageVariables": {
"stageVariableName": "stageVariableValue"
},
"requestContext": {
"accountId": "12345678912",
"resourceId": "roq9wj",
"stage": "testStage",
"requestId": "deef4878-7910-11e6-8f14-25afc3e9ae33",
"identity": {
"cognitoIdentityPoolId": null,
"accountId": null,
"cognitoIdentityId": null,
"caller": null,
"apiKey": null,
"sourceIp": "192.168.196.186",
"cognitoAuthenticationType": null,
"cognitoAuthenticationProvider": null,
"userArn": null,
"userAgent": "PostmanRuntime/2.4.5",
"user": null
},
"resourcePath": "/{proxy+}",
"httpMethod": "POST",
"apiId": "gy415nuibc"
},
"body": "{\r\n\t\"a\": 1\r\n}",
"isBase64Encoded": false
}
}
Vous avez maintenant accès à tous les en-têtes, url params, corps etc. et vous pourriez l'utiliser pour traiter les demandes de manière différente dans une seule fonction Lambda (essentiellement la mise en œuvre de votre propre routage).
Comme une opinion, je vois quelques avantages et les inconvénients de cette approche. Beaucoup d'entre eux dépendent de vos cas d'utilisation:
-
Déploiement: si chaque fonction lambda est discret, alors vous pouvez les déployer de manière indépendante, ce qui peut réduire le risque de changement de code (microservices stratégie). A l'inverse vous pouvez trouver que le besoin de déployer des fonctions séparément ajoute de la complexité et de l'est lourde.
-
Auto Description: Passerelle API est une interface extrêmement intuitive de voir la mise en page de votre Réparateur points de terminaison -- les noms et les verbes sont tous visibles en un coup d'œil. La mise en œuvre de votre propre routage peut se faire au détriment de cette visibilité.
-
Lambda et le dimensionnement des limites: Si vous proxy tous -- puis vous vous retrouverez à devoir choisir une taille de l'instance, le délai d'attente etc. qui pourra accueillir tous vos Reposant points de terminaison. Si vous créez des fonctions distinctes, alors vous pouvez plus choisir avec soin l'empreinte mémoire, délai d'attente, deadletter comportement etc. qui répond le mieux aux besoins spécifiques de l'invocation.