使用 AWS API Gateway 和 Lambda 的地理定位服务
Posted
技术标签:
【中文标题】使用 AWS API Gateway 和 Lambda 的地理定位服务【英文标题】:Geolocation service with AWS API Gateway and Lambda 【发布时间】:2020-10-12 13:19:55 【问题描述】:我们正在努力做的事情
我们正在尝试使用 API Gateway 和 Lambda 设置一个非常简单的地理定位服务。
与https://ipstack.com/ 非常相似,但我们不希望使用外部服务,因为我们认为在某些司法管辖区,将非匿名 IP 地址发送到我们无法控制的服务(之前征得用户同意)。
想要一个简单的 api https://location.my-site.com 返回国家/地区(用于 GDPR、cookie 等目的)。
现在看来,API Gateway 后面有个轻量级的 Cloudfront 会产生“Cloudfront-Viewer-Country”的头部,这样就很简单了,就可以实现我们所需要的。即 lambda 接收 Cloudfront-Viewer-Country 并将其发送回去。
我们的尝试
我见过像这样的解决方案:Build a Geolocation API using AWS Lambda and MaxMind,但我很难理解为什么部署 RDS 和维护 MaxMind 数据库对我们来说是有意义的,如果 Cloudfront-Viewer-Country 已经提供它的话。
我看到了这个问题:Accessing cloudfront-viewer-country header in AWS API Gateway using HTTP Proxy?,并尝试实施来自Michael - sqlbot 的答案。但我似乎无法访问标题。
我也尝试了post 中的建议,但我似乎也无法访问 Cloudfront-Viewer-Country 的值。
我们正在做什么(连同“我们已经尝试过的事情”)
要访问并检查标头是否可用,我正在使用以下 python lambda 函数
import json
def lambda_handler(event, context):
response =
'status': '200',
'statusDescription': 'Found',
'headers':
'location' : [
'event': json.dumps(event)
]
return response
问题是什么
但事件 json 转储不包含 Cloudfront-Viewer-Country。
我怀疑我做错了什么,但我真的想不通。任何指针将不胜感激。
谢谢
【问题讨论】:
您是否在 API Gateway 中使用 Lambda 代理集成类型?或者您正在使用自定义集成映射?如果您使用的是 Lambda 代理并且标头不存在,那么我怀疑您需要在 API Gateway 中启用缓存才能将 CloudFront 分发部署在 API Gateway 前面。 我正在使用自定义集成映射。我还尝试了 Lambda 代理集成,它为我提供了“最多信息”但不起作用(根据建议启用缓存但也不起作用)我还尝试了 http api 网关,但我没有看到任何选项添加标题 您链接的帖子说他们启用了缓存以获取标题。您确定它不适用于启用缓存 + 代理集成吗? 非常感谢 Mark B 的帮助。我无法让它与启用缓存+代理集成一起使用。我终于设法让它工作了......问题是试图使用端点类型=区域......边缘优化工作(没有缓存,去图......)。我只让 CloudFront-Viewer-Country 工作,但没有 other geolocation data,这对 CCPA 会有所帮助。 您可能需要在 API 前面放置一个单独的 CloudFront 分配,而不仅仅是启用 API 缓存,以获取完整的 CloudFront 标头集。 【参考方案1】:我可以通过设置 Endpoint Type = Edge 优化来访问 Cloudfront-Viewer-Country。
我无法让它与 Endpoint Type = Regional 或 http api 网关一起使用。
【讨论】:
因为 edge 将 CDN 置于 API 之上。如果您不需要 API Gateway 之上的 CDN 服务,那么您应该使用区域并以其他方式获取 IP 位置信息。当 AWS Cloudfront 位于任何请求的前面时,它将放置此标头。不管 down 是 Api Gateway 还是别的什么。以上是关于使用 AWS API Gateway 和 Lambda 的地理定位服务的主要内容,如果未能解决你的问题,请参考以下文章
Google Cloud Api Gateway 是不是提供请求签名和验证 sdk,例如使用 Signature 4 签署 AWS API Gateway 请求?
AWS Lambda 和 Gateway API - 使用 cloudformation 的蓝/绿部署