如何查看AWS Lambda运行时上的实际Java依赖项/库

时间:2020-06-22 11:36:38

标签: java aws-lambda

我有自定义逻辑,该逻辑定义了jackson如何在AWS lambda函数中序列化和反序列化域对象。 使用lambda运行时java 11(amazon-corretto-11)将AWS lambda函数部署在AWS上。 在本地测试而不在AWS中进行测试时,序列化工作正常。

您如何找出AWS lambda运行时中实际使用的Java依赖项和哪个版本的依赖项?

在我的特定情况下,这是我想找出的杰克逊依赖项的版本。

2 个答案:

答案 0 :(得分:2)

与其尝试对运行时进行逆向工程(这可能很难实现),请着重解决您的问题:运行时提供的序列化无效。

您可以做的是重构处理程序函数,使其不接受类的对象(这样,反序列化将在运行时发生,并且您会获得POJO),而是原始请求(使用APIGatewayProxyRequestEvent com.amazonaws:aws-lambda-java-events(如果使用的是API Gateway)或InputStream。这样,您将获得原始有效负载,然后可以根据需要对其进行解析。在AWS Lambda function handler in Java中了解更多信息。您还需要在部署程序包中添加依赖项(Google表示“胖子”)。

答案 1 :(得分:1)

@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在反序列化时使用其自己的杰克逊定制版本,并且在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环境访问第三方jackson依赖项。