如何在AWS Lambda中加载本机库?

时间:2018-05-25 12:19:03

标签: java amazon-web-services aws-lambda serverless-framework

在我的java无服务器项目中,我必须调用本机库进行图像处理(libvips)。我正在使用Gradle创建一个zip文件并将所有依赖项发送到lib文件夹,包括本机库:

task buildZip(type: Zip) {
archiveName = "${project.name}.zip"
from compileJava
from processResources
from('.') {
    include 'lib/**'
    include 'bin/**'
}
into('lib') {
    from configurations.runtime
}
}

在生成的zip文件中,lib文件夹中有所有库(jars / native / etc)。

通过serverless deploy部署该功能后,我无法使用libvips.so加载Native.loadLibrary("/var/task/lib/libvips.so", Object.class)库。显然在/var/task/lib/中只有java依赖项,而不是本机库。

还有另一条AWS存储本地库的路径吗?

修改

抛出异常:

ava.lang.UnsatisfiedLinkError: Unable to load library '/var/task/lib/libvips.so': Native library (var/task/lib/libvips.so) not found in resource path ([file:/var/task/, file:/var/task/lib/aopalliance-repackaged-2.5.0-b42.jar, file:/var/task/lib/asm-all-repackaged-2.5.0-b42.jar, file:/var/task/lib/aws-java-sdk-core-1.11.336.jar, file:/var/task/lib/aws-java-sdk-kms-1.11.336.jar, file:/var/task/lib/aws-java-sdk-s3-1.11.336.jar, file:/var/task/lib/aws-lambda-java-core-1.1.0.jar,....

2 个答案:

答案 0 :(得分:1)

您需要指定java.library.path JVM属性。

修改JVM命令行选项

 JAVA_OPTS = $JAVA_OPS -Djava.library.path= /var/task/lib/ 
 java $JAVA_OPTS ...

或直接在代码中修改

System.setProperty("java.library.path", "/var/task/lib/");
System.loadLibrary("libvips.so");

另外,您可以使用JNA库。 JNA提供了从添加到JVM类路径的JAR存档(资源)中自动解压缩和加载本机库管理器的功能。它包括选择正确的操作系统和CPU架构版本二进制文件。

答案 1 :(得分:0)

并非所有本机库都存在于lambda环境中,您必须使用docker或Ec2创建自定义部署包。

以下是您将如何做到这一点: https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html#with-s3-example-deployment-pkg-java