【发布时间】: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 标头集。
标签: amazon-web-services aws-lambda geolocation aws-api-gateway