【发布时间】: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