【问题标题】:Is it possible to parameterize log4j version?是否可以参数化 log4j 版本?
【发布时间】:2022-01-22 06:28:58
【问题描述】:

我们有数百个使用 log4j 的微服务。

由于漏洞,我们需要在一周内第三次升级 log4j 版本。

有没有办法参数化正在使用的 log4j 版本(并且可能将版本作为参数存储在 AWs Parameter Store 上?)

这样我可以在一个地方更改版本,新版本将应用于所有微服务,同时重建它们?

【问题讨论】:

  • 可能有,但没有任何关于您如何构建所有这些微服务(任何类型的 CI/CD 技术?),以及您使用的依赖管理工具(maven、gradle 等)的详细信息.) 无法为您的问题提供实际答案。
  • 我们使用的是 lombok maven
  • Lombok 不是构建工具,它是一个库,就像 log4j。是的,您使用的是 maven,但您的构建管道是什么样的?您使用的是 Jenkins 还是 AWS CodeBuild/CodeDeploy?或者也许是别的什么?您的构建管道如何连接到 AWS?

标签: amazon-web-services security log4j


【解决方案1】:

这是可能,但不是实用

Java 旨在在运行时加载代码。如果您实现自己的 ClassLoader,则可以从任何地方(包括通过网络)检索类定义。

但是,没有简单的方法将您自己的类加载器集成到您可能使用的任何部署框架中(除非您使用自己的 main() 从命令行运行 Java)。并且必须尽早配置日志记录,尤其是在 AWS 开发工具包之前(这取决于有一个日志框架来记录其操作)。因此,您还必须编写自己的类服务器才能在 Parameter Store 中指定库版本。

另一种解决方案是将您的依赖项定义为“已提供”,这意味着您的构建过程不会将它们与 JAR 或 WAR 一起打包:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>${log4j2.version}</version>
    <scope>provided</scope>
</dependency>

然后,您需要在部署平台上安装这些依赖项的“祝福”版本。

对于 Lambda,这很简单:创建一个 layer。要推出新的依赖项,您需要创建层的新版本并更新所有函数以使用它。

如果您使用的是 EC2,那么您将“预烘焙”具有所有“标准”依赖项的 AMI。对于 ECS 或 EKS,您将创建一个包含依赖项的基础映像。您如何实际使用这些依赖项取决于您如何进行部署,但大多数框架允许您指定一个添加到类路径的目录。

虽然这可以减轻部署修补程序的一些痛苦,但它可能会带来新的痛苦。如果您的所有服务都具有相同的基本依赖项,那么您必须验证升级依赖项不会破坏向后兼容性。要获得新功能,您必须一次升级所有服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2020-12-07
    相关资源
    最近更新 更多