我正在 AWS 上编写一个无服务器应用程序。
我已将该应用程序分解为许多 CloudFormation 堆栈。我正在使用 CDK(Python 中)创建 CF 堆栈来部署应用程序。
当然,我的 lambda 函数的核心要求是能够记录事件。为了处理这个问题(以及应用程序中传递的所有消息),我在我的堆栈之一中创建了一个自定义 EventBridge 总线。事件总线的名称是堆栈的输出。
由于日志记录功能对于许多 lambda 函数来说都是通用的,因此将日志记录功能放入 lambda 层似乎是合适的。然后,我可以让所有 lambda 函数实现该层,并且日志记录将自动可供我的所有 lambda 函数使用。
问题是我的日志记录代码需要知道将事件写入哪个 EventBridge 事件总线。我不想对此进行硬编码,因为我可能会同时部署堆栈的“开发”和/或“测试”和/或“产品”版本,并且每个环境中的日志记录层需要记录到其环境的日志记录总线。
由于 lambda 层在父 lambda 函数的上下文中运行,因此我无法在该层上设置环境变量。
我可以在使用该层的所有 lambda 函数上设置“LoggingEventBus”环境变量。但这似乎是重复的并且容易出错。 (虽然这是我目前能想到的最好的解决方案。)
我可以将事件总线存储在 SMS 参数存储中。但是天哪,每次我的应用程序中的任何函数想要记录任何内容时查找该参数都是荒谬的。 (我又必须找出一种方法让记录器确定它是否在开发/测试/产品中查找正确的总线。)
我实际上正在考虑“cdk合成器”期间的一些构建过程,该过程修改日志记录层的源代码并对事件总线名称进行字符串替换,以便在部署代码时该名称实际上是硬编码的。但该解决方案存在各种危险信号。
理想情况下,层本身应该有某种“环境变量”。但这样的东西并不存在,而且我承认这样的功能与大多数语言运行时的工作方式不兼容。
其他人是如何解决这个问题的?将设置放入 lambda 层是否有“正确”答案?