我正在尝试使用Micronaut,GraalVM和Docker在Java中创建和部署AWS Lambda函数。我正在遵循this tutorial来使用GraalVM运行时创建AWS lambda。
我已经使用micronaut
命令$ mn create-app my-app --features aws-api-gateway-graal
创建了Java项目。然后在代码或配置文件中没有任何更改的情况下,尝试使用GraalVM本机映像构建Docker映像。在构建graalvm本机映像时,在docker构建的步骤中,我得到以下警告:
警告:中止独立映像构建。不允许实例 在以下位置初始化或重新初始化的类的图像堆 映像运行时com.amazonaws.serverless.proxy.model.ContainerConfig。 尝试将此类标记为用于构建时初始化 --initialize-at-build-time = com.amazonaws.serverless.proxy.model.ContainerConfig
Detailed message: Trace: field io.micronaut.function.aws.proxy.AbstractLambdaContainerHandler.config
警告:使用-H:+ ReportExceptionStackTraces打印基础的堆栈跟踪 例外*
警告:图像“服务器”是一个后备图像,需要使用JDK 执行(使用--no-fallback抑制生成后备图像)。
构建后,按照引导中的说明,将带有引导程序文件的docker映像导出到function.zip文件。然后,我将function.zip文件上传到我创建的AWS lambda函数中,当我尝试测试函数时,出现此错误:
{ "errorType": "Runtime.ExitError", "errorMessage": "RequestId: 888854d7-0e0e-42b4-a138-9a003c3455e1 Error: Runtime exited with error: exit status 1" }
START RequestId:888854d7-0e0e-42b4-a138-9a003c3455e1版本: $ LATEST
错误:没有bin / java和环境变量JAVA_HOME
END RequestId:888854d7-0e0e-42b4-a138-9a003c3455e1
REPORT RequestId: 888854d7-0e0e-42b4-a138-9a003c3455e1时长:415.09 ms已结算 持续时间:500 ms内存大小:128 MB已使用的最大内存:16 MB
RequestId:888854d7-0e0e-42b4-a138-9a003c3455e1错误:已退出运行时 出现错误:退出状态为1
Runtime.ExitError
我不知道怎么了。我还没有找到解决这个问题的方法。
答案 0 :(得分:0)
此类调用defaultConfig
类的静态方法ContainerConfig
。
io.micronaut.function.aws.proxy.AbstractLambdaContainerHandler
com.amazonaws.serverless.proxy.internal.LambdaContainerHandler
要解决此问题,我们需要在运行时而不是编译时初始化该类。
我对GraalVM完全陌生,目前无法解释其原因。
我的native-image
配置。
native-image
--delay-class-initialization-to-runtime=io.micronaut.function.aws.proxy.AbstractLambdaContainerHandler,com.amazonaws.serverless.proxy.internal.LambdaContainerHandler
--no-fallback
--no-server
-cp build/libs/yourJarName.jar