web-dev-qa-db-fra.com

Comment puis-je récupérer l'adresse IP publique d'un utilisateur via Amazon API Gateway + Lambda (nœud)

J'écris actuellement une fonction lambda Node.js, dans laquelle je veux enregistrer l'adresse IP publique du demandeur entrant. J'ai regardé à la fois les documents API Gateway et Lambda toute la journée, mais je n'ai pas trouvé de solution.

L'objet lambda event inclut-il des métadonnées de demande que je peux utiliser pour extraire l'IP de l'utilisateur?

35
rdegges

Voici une démonstration simple de l'utilisation de $context.identity.sourceIp dans une fonction Lambda.

Modèle de mappage d'API:

{
    "sourceIP" : "$context.identity.sourceIp"
}

Fonction lambda:

'use strict';
console.log('Loading function');
exports.handler = (event, context, callback) => {
    console.log('SourceIP =', event.sourceIP);
    callback(null, event.sourceIP);
};
33

Modifier

Une meilleure façon est en fait de vérifier

event['requestContext']['identity']['sourceIp']

Vous pouvez également obtenir l'agent utilisateur à partir du même objet

event['requestContext']['identity']['userAgent']

Voir le commentaire de César ci-dessous. Les en-têtes sont facilement usurpés et l'utilisateur peut définir X-Forwarded-For à tout. AFAIK le sourceIp ci-dessus est récupéré de la connexion TCP.

Réponse originale

Depuis septembre 2017, vous pouvez créer une méthode dans API Gateway avec l'intégration de Lambda Proxy, cela vous donnera accès à

events['headers']['X-Forwarded-For']

Qui ressemblera à quelque chose comme 1.1.1.1,214.25.52.1

Le premier ip 1.1.1.1 est l'adresse IP publique de votre utilisateur.

22
Jonathan

Dans la passerelle API, c'est la valeur

$context.identity.sourceIp

http://docs.aws.Amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#context-variable-reference

Vous pouvez transmettre cela à votre Lambda via un modèle de mappage.

10
Mike76