我目前正在编写一个Node.js lambda函数,我想在其中记录传入的请求者的公共IP地址。我一整天都在查看API网关和Lambda文档,但还没有找到解决方案。
lambda event
对象是否包含我可以用来提取用户IP的请求元数据?
答案 0 :(得分:32)
以下是在Lambda函数中使用API网关function verifyGrossInvoiceTotal(){
browser.ignoreSynchronization = true;
browser.driver.switchTo().frame('viewDocumentInFrame');
var sum = 0;
var YieldTotal = element(by.cssContainingText('table.invoice-details td', 'Yield Total'));
YieldTotal.isPresent().then(function (isPresent){
if(isPresent){
var totalAmount = YieldTotal .$$('td').get(3);
totalAmount.getText().then(function (text) {
text = parseFloat(text.replace(/[^0-9.]/g, '')).toFixed(2);
sum = parseFloat(sum) + parseFloat(text);
});
}
});
});
的简单演示。
API映射模板:
$context.identity.sourceIp
Lambda函数:
{
"sourceIP" : "$context.identity.sourceIp"
}
答案 1 :(得分:19)
修改强>
更好的方法是检查
<select class="mydropdown">
<option value="0" selected disabled>Seach</option>
<option value="1"> Result 1</option>
<option value="2"> Result 2</option>
<option value="3"> Result 3</option>
</select>
您也可以从同一个对象
获取用户代理event['requestContext']['identity']['sourceIp']
请参阅下面的Cesar评论。标题很容易被欺骗,用户可以将event['requestContext']['identity']['userAgent']
设置为任何内容。从TCP连接中检索上面X-Forwarded-For
的AFAIK。
原始回答
截至2017年9月,您可以在API Gateway中使用Lambda Proxy集成创建方法,这样您就可以访问
sourceIp
看起来像events['headers']['X-Forwarded-For']
第一个ip 1.1.1.1,214.25.52.1
是您用户的公共IP地址。
答案 2 :(得分:10)
在API网关中,它是值
$context.identity.sourceIp
您可以通过映射模板将其传递给Lambda。
答案 3 :(得分:0)
API网关应该已经在http标头X-Forwarded-For
中包含了远程IP,因此您可以:
// Lambda handler function
module.exports.handlerFunc = async (event, context) => {
// `X-Forwarded-For` should return a comma-delimited list of IPs, first one being remote IP:
// X-Forwarded-For: '<remote IP>, <cloudfront/API gateway IP>, ...'
const remoteIp = event.headers['X-Forwarded-For'].split(', ')[0]
// If you want to see more info available in event and context, add following, deploy and check CloudWatch log:
// console.log(event, context)
}
答案 4 :(得分:-1)
exports.handler = (event, context) => {
console.log('ip:', event.headers['x-forwarded-for']);
};