01 背景
在测试aws的一个agentcore sample的时候,有脚本创建了secret的vpc endpoint,这个endpoint只允许了特定的sg访问,这就导致了lambda服务无法获取到secret,从而导致数据库无法连接。
02 影响
这时的 lambda 报错出现了2种情况,一种是每个调用都报错,正常输出报错日志到cloudwatch,异常信息就是无法连接数据库。
而另一种情况比较特别,lambda显示错误为:Snapshot regeneration failed due to the following error <FunctionError : An error occurred during function initialization.>. Please publish a new function version after resolving this error.,明明这个 lambda 是正常运行了一段时间的,怎么突然就变成初始化失败了。
当然,这里不同报错是发生在不同 lambda 上的。
03 分析
由于这些 lambda 启用了 snapstart,所以当启动的时候没有获取到secret,后面调用都是在这个没有拿到secret的基础上运行。当前这个版本就废了,也是需要使用新版本才行的。
第一种情况挺好理解,当前版本在启动的时候刚好没有读到 secret。
再看另一种情况,下图可以看到,原本正常的服务在13点刻戛然而止,日志也不再生成了。
为什么会突然不行,虽然snapshot可以缓解冷启动,但是当并发上来的时候,仍然会冷启动,这就导致会有新实例读不到secret,同时在项目启动过程中,有代码去连了数据库等资源,导致异常了,初始化失败。正常工作的lambda 实例也能维持一段时间,等到最后一个实例退出,它才真的挂掉。