【问题标题】:Pass User-Agent and client ip to Lambda Function将 User-Agent 和客户端 ip 传递给 Lambda 函数
【发布时间】:2017-06-19 15:07:42
【问题描述】:

有点新鲜:

我有一个非常简单的 Lambda 函数,它试图使用客户端/用户 IP 地址查找数据库。我没有从客户端传递 IP 地址,而是想从 API Gateway 调用的请求标头中提取它。

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

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

我有一个用于集成请求的“application/json”主体映射模板:

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

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

来自 PostMan 我的结果是:

"{\"isBase64Encoded\":false,\"statusCode\":200,\"headers\":{\"访问控制 - 允许 - 来源\":\"*\"},\"body\":{\"badIP\":false,\"ipIsNull\":true,\"ip\" :null}}"

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;
`}

`} }

【问题讨论】:

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


    【解决方案1】:

    在您的代码中,括号({})周围有很多反引号,这可能是也可能不是问题的原因。 JavaScript 中的反引号是template literals

    假设您的函数在语法上是正确的,您应该在您的 Lambda 函数中接收到 source_ipuser_agent,因为您的映射表达式是正确的。

    同时检查您的 Lambda 函数的日志输出,这可能会导致发现问题。

    另外,只是提醒一下。您将context 变量从您的处理程序传递给您的getGeoLocByIp 并调用它event。这可能会导致混乱。虽然,您没有在任何地方引用 event-context,因此您可以将其删除。

    【讨论】:

    • 反引号是我尝试提供格式良好的降价,失败了。至于事件和上下文,我在两者之间来回交换,看看我是否能发现值在哪里。我会删除它。感谢您的提示。
    猜你喜欢
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 2016-01-10
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    相关资源
    最近更新 更多