始终缓存AWS API网关GET响应

时间:2017-06-29 21:10:37

标签: amazon-web-services caching aws-api-gateway

  

更新:我想出来了,请看下面的答案帖子。

我有一个AWS API Gateway api,它定义了各种资源和各种GET和POST方法。

一切都很好。 POST正在进行中。 GET返回响应(JSON有效负载),但返回的值似乎是缓存值。

我的GET api调用一个Lambda函数,该函数调用对RDS的查询。 我可以确认我的回复是陈旧的,因为:

  • 当我手动查询RDS时,我得到更新后的值
  • 我启用了Cloud Watch日志,并且没有调用lambda函数(我相信我已正确设置它,因为当我测试调用lambda时,我可以获得Cloud Watch日志)

它刷新了一次,但我认为那是因为我越过了一些(如1小时)缓存阈值或其他东西。

我了解API Gateway在幕后生成CloudFront。 我觉得这就是缓存的作用。但这只是猜测,我没有证据。也许某种默认缓存TTL?

我显然在API Gateway阶段关闭了缓存。 我甚至尝试启用它,将TTL设置为1,刷新缓存,并再次禁用缓存。 该测试的每个阶段仍然返回陈旧的值。

我不知道它是否相关,但还有其他细节:

  • 我启用了CORS(“*”)
  • 我启用了Cognito授权程序
  • 我通过Authorization标头传递了JWT令牌(这一切都正常)

我是否应该传递一些标头来请求未缓存的值? 我去了CloudFront,但这里没有配置。

API网关缓存上的所有其他帖子似乎都是关于缓存不起作用或人们询问缓存密钥特异性。 我还没有看到任何关于价值总是被缓存的东西,无论如何。所以我觉得我错过了一些明显的东西......

非常感谢任何帮助或调试提示!

1 个答案:

答案 0 :(得分:2)

好的,所以我觉得自己是回答自己问题的白痴,但希望有一天能帮助别人。

这不是API网关缓存问题。 问题是pymysql连接& lambda会话缓存问题。

我的Lambda正在使用pymysql来查询MySQL RDS。 根据推荐的性能原因,我重用了lambdas之间的连接(意思是我每次都没有关闭连接)。

解决方案是打电话 conn.commit()

在我做了我的胎儿()之后

发生的事情是我的后续调用返回了缓存的查询结果(称为一致读取。谢谢!@Michael - sqlbot)我相信我可能有多个lambda容器或者其他东西当我暂停一段时间(即忙于阅读stackoverflow帖子)时,lambda将卸载。然后我的下一个API网关尝试将重新初始化一个新的lambda处理程序,并创建一个分支新连接(没有缓存)。所以这就是为什么它似乎“有时工作,然后停止”。

如果我浪费了任何人的时间,请道歉。