有点新鲜:
我有一个非常简单的Lambda函数,它尝试使用客户端/用户ip地址查找数据库。我没有从客户端传递IP地址,但是想从API网关调用的Request头中提取它。
对于资源的POST方法,我正在映射这些HTTP请求标头:
我为集成请求的“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;
`}
`} }
答案 0 :(得分:0)
代码中的括号({
和}
)周围有很多反引号可能会或可能不会导致问题。 JavaScript中的反引号为template literals。
假设您的函数在语法上是正确的,那么当您的映射表达式正确时,应该接收Lambda函数中的source_ip
和user_agent
。
检查Lambda函数的日志输出,这可能会导致识别问题。
另外,只是单挑。您已将context
变量从处理程序传递到getGeoLocByIp
并将其称为event
。这可能会导致混淆。但是,您并未在任何地方引用event-context
,因此您可以将其删除。