如何通过 AmazonAPI 网关 + Lambda (节点)检索用户的公共 IP 地址

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

Lambda event对象是否包含可用于提取用户 IP 的请求元数据?

62718 次浏览

在 API 网关中,是值

$context.identity.sourceIp

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

您可以通过映射模板将其传递给 Lambda。

下面是在 Lambda 函数中使用 API 网关的 $context.identity.sourceIp的简单演示。

API 映射模板:

{
    "sourceIP" : "$context.identity.sourceIp"
}

Lambda 函数:

'use strict';
console.log('Loading function');
exports.handler = (event, context, callback) => {
console.log('SourceIP =', event.identity.sourceIP);
callback(null, event.identity.sourceIP);
};

HTTP API 的更新

添加@Elijah 的注释

event['requestContext']['http']['sourceIp']

剪辑

一个更好的方法是去检查

event['requestContext']['identity']['sourceIp']

您还可以从同一个对象获取 User-Agent

event['requestContext']['identity']['userAgent']

请看下面 Cesar 的评论。标题很容易欺骗,用户可以将 X-Forwarded-For设置为任何内容。AFAIK 从 TCP 连接检索上面的 sourceIp

原始答案

截至2017年9月,您可以在 API 网关中创建一个具有 Lambda 代理集成的方法,这将为您提供访问

events['headers']['X-Forwarded-For']

看起来像 1.1.1.1,214.25.52.1

第一个 ip 1.1.1.1是用户的公共 ip 地址。

exports.handler = (event, context) => {
console.log('ip:', event.headers["x-forwarded-for"].split(",")[0].trim());
};

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)
}
export const handler = (event) => {
console.log('ip: ', event.requestContext.identity.sourceIp);
};