如何通过Amazon API Gateway + Lambda(节点)检索用户的公共IP地址

时间:2015-10-11 06:06:42

标签: node.js amazon-web-services aws-lambda aws-api-gateway

我目前正在编写一个Node.js lambda函数,我想在其中记录传入的请求者的公共IP地址。我一整天都在查看API网关和Lambda文档,但还没有找到解决方案。

lambda event对象是否包含我可以用来提取用户IP的请求元数据?

5 个答案:

答案 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

http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#context-variable-reference

您可以通过映射模板将其传递给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']);
};