【发布时间】:2017-04-28 11:26:24
【问题描述】:
我正在使用 AWS API Gateway 作为我的 rest api 应用程序的 http 代理。 问题是,我似乎无法找到获取客户端 IP 地址或将其从 api 网关传递到我的应用程序的方法。 我看到的唯一方法是使用 lambda 函数,但我不能使用它,因为它必须是 http 集成。
还有其他方法吗?
【问题讨论】:
标签: amazon-web-services aws-api-gateway
我正在使用 AWS API Gateway 作为我的 rest api 应用程序的 http 代理。 问题是,我似乎无法找到获取客户端 IP 地址或将其从 api 网关传递到我的应用程序的方法。 我看到的唯一方法是使用 lambda 函数,但我不能使用它,因为它必须是 http 集成。
还有其他方法吗?
【问题讨论】:
标签: amazon-web-services aws-api-gateway
只需配置请求有效负载映射。你需要的是 $context.identity.sourceIp。根据文档:
$context.identity.sourceIp
向 API 发出请求的 TCP 连接的源 IP 地址 网关。
【讨论】:
您可以在集成响应的映射模板中执行此操作。调用 $context.identity.sourceIp 获取 sourceIp。
如果您已经在使用映射模板,那么您可以在任何方便的时候添加它。如果您当前没有使用映射模板,而只需将 sourceIp 添加到传入的 json 请求正文中,请添加如下映射模板:
#set($allParams = $input.path('$'))
#set($discard=$allParams.put('sourceIp', $context.identity.sourceIp))
$input.json('$'))
【讨论】:
如果您正在使用 API Gateway 的 HTTP API(announced,2019 年 12 月),请注意集成中高级设置下的payload format version。您可以在 1.0 和 2.0 之间进行选择。
以 Kotlin 代码为例,对于 1.0,您可以从 APIGatewayProxyRequestEvent 检索源 IP,如下所示。
event.requestContext.identity.sourceIp
对于 2.0,您可以从 APIGatewayV2HTTPEvent 检索源 IP,如下所示。
event.requestContext.http.sourceIp
【讨论】:
如果您使用"proxy"-style 集成,则客户端 IP 在请求中可用(不需要模板映射)。按照上面链接中的代码示例,深入了解“事件”JSON 对象:
requestContext -> identity -> sourceIp
【讨论】: