将User-Agent和客户端ip传递给Lambda函数

时间:2017-06-16 23:22:46

标签: amazon-web-services aws-lambda aws-api-gateway

有点新鲜:

我有一个非常简单的Lambda函数,它尝试使用客户端/用户ip地址查找数据库。我没有从客户端传递IP地址,但是想从API网关调用的Request头中提取它。

对于资源的POST方法,我正在映射这些HTTP请求标头:

  • HTTP_CLIENT_IP(不确定这是否足够)
  • User_Agent类

我为集成请求的“application / json”提供了一个Body Mapping模板:

{ "source_ip" : "$context.identity.sourceIp", "user_agent" : "$context.identity.userAgent" }

从AWS API Gateway控制台测试POST方法时,我将HTTP_CLIENT_IP设置为有效的专用地址,并将User-Agent设置为“test”。这些是我的结果:

从PostMan我的结果是:

{\"isBase64Encoded\":false,\"statusCode\":200,\"headers\": {\”Access-Control - Allow - Origin \“:\”* \“},\"body\": {\”badIP \“:false,\”ipIsNull \“:true,\ “IP \”:空}}“

AWS控制台的结果并不是真正令人担忧的问题,但PostMan的结果是!

任何帮助将不胜感激,谢谢。

以下是非常小的Lambda函数:

"use strict";

console.log('Loading function');
exports.handler = (event, context, callback) => `{
     var loc = getGeoLocByIP(event.source_ip, event.user_agent, context);
     callback(null, JSON.stringify(loc));
`};

function getGeoLocByIP(clientIp, userAgent, event) `{
    var maxmind = require('maxmind');
    if (maxmind.validate(clientIp)) `{
       var fs = require('fs');
       var dbLoc = 'data/GeoLite2-City.mmdb'; 

       if (fs.existsSync(dbLoc)) `{
           var cityLookup = maxmind.openSync(dbLoc);
           var lkupres = cityLookup.get(clientIp);
           cityName = lkupres.city.names.en;
           var response = `{
              "isBase64Encoded": false,
              "statusCode": 200,
              "headers": `{
                 "Access-Control - Allow - Origin": "*"
              `},
              "body": `{
                 "cityName": cityName,
                 "client_ip": clientIP,
                 "user_agent": userAgent
              `}
           `};
           return response;
       `} else `{
        console.warn('db file does not exist: ' + dbLoc);
       `}
    `} else `{
      if (clientIp != null) `{
          var response = `{
            "isBase64Encoded": false,
            "statusCode": 200,
            "headers": `{
                "Access-Control - Allow - Origin": "*"
            `},
            "body": `{
                "badIP": true,
                "ipIsNull": false,
                "ip": clientIp
            `}
        `};
    `} else `{
        var response = `{
            "isBase64Encoded": false,
            "statusCode": 200,
            "headers": `{
                "Access-Control - Allow - Origin": "*"
            `},
            "body": `{
                "badIP": false,
                "ipIsNull": true,
                "ip" : null
            `}
        `};
    `}
    return response;
`}

`} }

1 个答案:

答案 0 :(得分:0)

代码中的括号({})周围有很多反引号可能会或可能不会导致问题。 JavaScript中的反引号为template literals

假设您的函数在语法上是正确的,那么当您的映射表达式正确时,应该接收Lambda函数中的source_ipuser_agent

检查Lambda函数的日志输出,这可能会导致识别问题。

另外,只是单挑。您已将context变量从处理程序传递到getGeoLocByIp并将其称为event。这可能会导致混淆。但是,您并未在任何地方引用event-context,因此您可以将其删除。