繁体   English   中英

在 AWS Lambda 层中找到等效的环境变量?

[英]Finding an equivalent of environment variables in AWS Lambda Layers?

我正在 AWS 上编写无服务器应用程序。

我已将该应用程序分解为多个 CloudFormation 堆栈。 我正在使用 CDK(在 Python 中)创建 CF 堆栈来部署应用程序。

我的 lambda 功能的核心要求当然是记录事件的能力。 为了处理这个(以及应用程序中传递的所有消息),我在我的一个堆栈中创建了一个自定义 EventBridge 总线。 事件总线的名称是堆栈的 output。

因为日志记录功能对于许多 lambda 函数是通用的,所以将日志记录功能放入 lambda 层似乎是合适的。 然后我可以让我的所有 lambda 函数实现该层,并且日志记录将自动对我的所有 lambda 函数可用。

问题是我的日志记录代码需要知道将事件写入哪个 EventBridge 事件总线。 我不想对此进行硬编码,因为我可能会同时部署堆栈的“开发”和/或“测试”和/或“生产”版本,并且每个环境中的日志记录层都需要记录到其环境的日志记录总线。

因为 lambda 图层在父 lambda function 的上下文中运行,所以我无法在该图层上设置环境变量。

我可以在使用该层的所有 lambda 函数上设置一个“LoggingEventBus”环境变量。 但这似乎是重复的并且容易出错。 (虽然这是我目前能想到的最好的解决方案。)

我可以将事件总线存储在 SMS 参数存储中。 但是上帝啊,每当我的应用程序中的任何 function 想要记录任何内容时,都要查找该参数,这简直是荒谬的。 (我又不得不想办法让记录器确定它是否在开发/测试/生产中以查找正确的总线。)

我实际上正在考虑“cdk synth”期间的一些构建过程,该过程修改日志层的源代码并对事件总线名称进行字符串替换,以便在部署代码时实际对名称进行硬编码。 但该解决方案周围有各种危险信号。

理想情况下,图层本身会有某种“环境变量”。 但是这样的事情不存在,而且我承认这样的功能与大多数语言运行时的工作方式不兼容。

其他人是如何解决这个问题的? 在 lambda 层中放置设置是否有“正确”答案?

你是对的,Lambda层没有环境变量的概念。

我可以在使用该层的所有 lambda 函数上设置一个“LoggingEventBus”环境变量。 但这似乎是重复的并且容易出错。

我们还为多个 Lambda 函数共有的一些逻辑(涉及 SNS 主题等)使用图层,我们的做法与您上面建议的非常相似。

唯一的区别是我们只是在环境变量中设置阶段,而不是我们的 SNS 主题的值(或者在您的情况下是 EventBridge 名称)。 然后让Layer根据env中设置的stage来决定使用哪个SNS Topic。

在我们的图层代码中,我们使用这样的配置 -

{
  "Prod": {
    "SNSTopicARN": "ProdARN",
    "OtherConfig": "ProdValue"
  },
  "Dev": {
    "SNSTopicARN": "DevARN",
    "OtherConfig": "DevValue"
  }
}

然后在图层代码中,我们有

config = configJson.get(env.STAGE)

我猜不是容易出错的地方:)

我们可以在层中添加更多数量的配置变量,而无需触及 Lambda 功能部署。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM