在JDK 17 Docker镜像中运行AWS Lambda/Spring Cloud函数



我正在升级Spring Cloud Functions lambda以在JDK 17上运行。Amazon没有为JDK17提供基本映像,所以我没有部署ZIP文件,而是创建了一个运行Docker映像的lambda。对于运行Java映像,我的Dockerfile通常如下所示:

FROM amazoncorretto:17
VOLUME /tmp
COPY ./my-lambda-project/build/libs/my-lambda-project-1.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

它运行首先使用bootRunGradle任务创建的jar。我的Application.java类的主要方法如下:

public static void main(String[] args) {
FunctionalSpringApplication.run(Application.class, args);
}

main方法使用FunctionalSpringApplication而不是SpringApplication.run(为了更快地启动(,并且在lambda配置中,我将函数处理程序指定为org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest

使用Dockerfile方法,我可以使用ENTRYPOINT或CMD的一些组合。有没有一种方法可以让这个docker映像在被推到ECR时使用JDK17运行lambda?

您可以通过创建自己的自定义运行时在AWS Lambda上运行Java的替代版本。我的lambda-java17-layer Github repo向您展示了如何做到这一点。

如果你不喜欢这种方法,并且你想坚持使用容器图像,那么你需要采取一些额外的步骤。

你选择了标准的amazoncorretto基础图像来工作,你需要使用一个管理的Lambda基础图像(除非你想自己做更多的工作(

如果您想将Java 17 lambda函数打包为docker容器,那么您需要使用Java 17基本映像,正如@Mark Sailes上面所说。截至本文撰写之时,Java 8和Java 11有官方支持的AWS基础映像,但Java 17没有。但是,您可以在ECR公共库和DockerHub上使用Java 17、18和19的社区基础映像。

使用社区基本映像与使用官方支持的基本映像完全相同。您应该能够调整您上面的Dockerfile以使用社区Java17基本映像,而不会遇到太多麻烦。例如,以下是Java 17 lambda函数示例中的Dockerfile:

FROM public.ecr.aws/aleph0io/lambda/java:17.0.4-al2
COPY target/hello-lambda.jar "${LAMBDA_TASK_ROOT}/lib/"
CMD [ "com.sigpwned.lambda.hello.HelloLambda::handleRequest" ]

免责声明:我创建了社区Java17基本映像和上面的lambda函数示例。如果你想知道社区基础图片是如何制作的,它们是完全开源的,可以在GitHub上获得。

最新更新