【问题标题】:How to view the actual java dependencies / library on AWS Lambda runtimes如何在 AWS Lambda 运行时查看实际的 Java 依赖项/库
【发布时间】:2020-10-12 06:15:19
【问题描述】:

我有自定义逻辑,它定义了杰克逊应该如何序列化和反序列化 AWS lambda 函数中的域对象。 AWS lambda 函数使用 AWS lambda 运行时 java 11(amazon-corretto-11) 部署在 AWS 上。 序列化在本地测试时工作正常,但在 AWS 中没有。

如何找出在 AWS lambda 运行时中实际使用的 java 依赖项以及依赖项的哪个版本?

在我的具体情况下,我想知道的是 jackson 依赖项的版本。

【问题讨论】:

    标签: java aws-lambda


    【解决方案1】:

    与其尝试对运行时进行逆向工程(这可能几乎不可行),不如尝试专注于您的问题:运行时提供的序列化不起作用。

    您可以做的是重构您的处理程序函数以接受不是您的类的对象(这样,反序列化发生在运行时并且您获得 POJO),而是原始请求(使用来自 @987654322 的 APIGatewayProxyRequestEvent @ 如果您使用的是 API 网关)或 InputStream。这样,您将获得原始有效负载,然后您可以根据需要对其进行解析。在AWS Lambda function handler in Java 中阅读更多信息。您还需要在部署包中包含您的依赖项(谷歌为“fat jar”)。

    【讨论】:

      【解决方案2】:

      @madhead:s answere 应该是前进的方向。但我认为有一种方法可以通过一点点逆向工程来了解哪些依赖关系。

      但首先,作为@jccampos mentions

      您不应依赖序列化框架的任何其他功能 比如注解。如果需要自定义序列化 行为,您可以使用原始字节流来使用您自己的 序列化。

      据我了解,该文本来自https://docs.aws.amazon.com/lambda/latest/dg/java-programming-model-req-resp.html

      让 AWS Lambda 环境处理序列化和反序列化时,您无法控制。反序列化将发生在您的 lambda 函数之外,但在 lambda 环境中。 AWS Lambda 环境将使用它自己的依赖项,该依赖项未打包在您的 lambda 函数中。这就是为什么 InputStream 是更好的选择,因为您可以控制在淡化时使用哪个库。

      AWS 在反序列化时使用它自己定制的 Jackson 版本,并将其打包在 com.amazonaws.thirdparty.jackson 中。如果您对正在使用的版本感兴趣,您可以下载 maven 项目aws-java-sdk-bundle,其中包含包含第三方库的 jar(并提取 jar 以查找第三方库的版本)。我猜想 lambda 环境使用了该依赖项的较新版本之一(也许有些可以帮助通过来源确认这一点)。

      最后,我尝试将 aws-java-sdk-bundle 包含为 maven 中提供的范围,然后从 lambda 中打印出 com.amazonaws.thirdparty.jackson.databind.ObjectReader 的包信息。它导致 NoClassDefFoudError 应该表明第三方杰克逊依赖项只能从 lambda 函数之外的 AWS lambda 环境访问。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        • 2012-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多