是什么使AWS Lambda处理程序具有弹性,可追溯且易于维护?您如何编写这样的代码?
在此博客系列中,我会尝试通过分享我的知识和AWS lambda的最佳实践来回答这些问题,因此您不会犯错误。
i ll提供了一个有效的开源AWS Lambda处理程序 Skeleton Python代码。您可以在**https://github.com/ran-isenberg/aws-lambda-handler-cookbook上找到所有示例。**
这个处理程序体现了无服务器的最佳实践,并有适当的生产就绪处理程序的所有铃铛和哨子。我将涵盖诸如记录,跟踪,输入验证,功能标志,动态配置以及如何安全使用环境变量等问题。
虽然代码示例是用Python编写的,但原理对任何受支持的AWS Lambda处理程序语言有效。
这里的大多数代码示例来自出色的*AWS Lambda Powertools*存储库。我写了此博客系列中提到的几个实用程序,并将其中2个捐赠给parser and feature flags,向AWS Lambda PowerTools。
该博客是该系列中的第一个博客,它的重点是记录。
起点
lambda处理程序 my_handler *接收词典 *事件的输入和lambda 上下文的对象。它返回JSON回应。下面写的是许多AWS代码示例中看到的基本AWS lambda处理程序。
记录器
第一个实用程序可能是其中最直接的。通常,第一个本能是将python的内置打印功能用作记录解决方案。但是,您不应该。 Python具有内置的logging library。 Logger类提供了一个简单的API,可添加可见性并在您的AWS Lambda服务中调试信息。
话虽如此,我强烈建议您改用AWS Lambda Powertools的记录器实现。它是Python的记录库的包装纸,它提供了额外的功能,例如JSON输出配置(以及更多)。
为什么JSON输出格式很重要?
默认情况下,所有AWS lambda日志都发送到AWS CloudWatch(假设您为AWS lambda提供所需的权限)。将原木存储在一个地方非常好。但是,有效的调试需要免费文本搜索功能。
AWS服务(例如AWS CloudWatch Logs Insights)索引日志,并提供简单的自由文本搜索。第三方服务可以做到这一点; Datadog和Logz.io想到了。这些服务可以减轻调试体验,并帮助您更快地发现问题。
但是,只有在使用JSON结构化文档(而不是单线字符串)时,您才能利用这些搜索引擎的全部功能。
让我们回顾下面的示例,其中相同的日志消息以字符串和JSON格式编写。
基于JSON的文档允许您以更具结构化和有条理的方式保留数据,搜索内部层次结构项目( event_list [0] 或 user_data.company ),并具有非-String数据类型( int,bool,dict,list )。反过来,这使您可以创建仪表板和计算的指标,从而为您的AWS Lambda处理程序的当前状态提供更好的可见性和见解。
将所有这些放在一起
下面的示例演示了如何使用AWS lambda powertools logger:
在第8行中,我们创建记录器。在第12行中,我们将 aws request_id 设置为相关ID,,它将自动从该点添加到以下日志中。相关ID允许您找到与多个服务和执行的单个请求相对应的所有日志,只要沿此过程中的服务登录并以相同的方式传递。它极大地简化了单个请求的调试过程。
** aws request_id **是一个唯一的标识符,可以使您从AWS lambda的许多执行中查明特定的lambda执行。 AWS CloudWatch将在同一AWS CloudWatch日志组下编写所有执行日志,因此必须具有唯一的标识符。您可以阅读有关here的更多信息。
第13行以调试级别打印JSON日志,消息字段等于我的处理程序称为。
经验法则
-
我重复说,请勿记录 event everm 参数的内容,或者您的AWS lambda整体收到的任何其他输入。您可能正在记录PII的个人身份信息(I.D号,电话号码等)。您可能会违反 *GDPR *等法规,甚至不知道。这就是为什么只记录您缺少PII数据或在记录之前将其从PII中剥离的参数至关重要的原因。您可以阅读更多有关它的信息。
-
保持日志消息静态。这是您最有可能搜索的信息。当您在日志消息中添加动态(变量值)时,就无法知道在AWS CloudWatch日志洞察中查找的内容。在记录器的额外部分中记录变量的值。在此示例中,收集付款是一个通用的说明,而动态数据则在额外的字典字段中打印出来。请参阅更多示例here。
-
在任何功能的开始和结尾处登录。您拥有的日志越多,就越容易理解错误的根本原因。
-
每次捕获异常时记录错误。添加尽可能多的细节而不暴露PII。
-
对日志消息要具体。您需要能够自行理解消息和上下文,而不必在该日志之前读取其他20个日志。
-
确保始终在Logger额外的部分中使用相同的键,以使查找更容易(选择ID或I.D'并保持一致)。
< < /li> -
重构。如果您遇到一个问题,您可以从单独查看日志中理解,请重构。添加日志或使当前日志更有意义。原木对于生产准备就无价。进行每个日志计数;否则,您会花更多的时间调试,甚至更多的时间重新分配日志。
-
不要过度。
接下来
这是该系列的第一部分。和我一起参加next part,我在那里处理AWS Lambda跟踪。
特别感谢您去:
abioqian29,Noa Gelber,Alexy Grabov,Koby Aharon,Yarara GradeVitch和Mauro Rois。*