【发布时间】:2022-08-09 16:54:08
【问题描述】:
我正在尝试(通过 Docker)部署一个 CRUD Micronaut AWS Lambda(功能/应用程序?),它应该处理 APIGatewayV2HTTPEvent 请求并应该编译成本机映像,但是找不到简洁的指南来做到这一点,所以我正在尝试从不同来源收集信息并将它们混合在一起以实现我想要的。
这个想法是有一个类似于这个的处理程序:
@Introspected
public class BookRequestHandler extends MicronautRequestHandler<Book, BookSaved> {
@Override
public BookSaved execute(Book input) {
BookSaved bookSaved = new BookSaved();
bookSaved.setName(input.getName());
bookSaved.setIsbn(UUID.randomUUID().toString());
return bookSaved;
}
}
通过将APIGatewayV2HttpEvent 委托给BookController 来处理APIGatewayV2HttpEvent,而不是让多个BookRequestHandler(即多个Lambda)处理每种类型的端点。
我通过以下命令创建了样板应用程序:
mn create-app example.micronaut.micronautguide --features=graalvm,aws-lambda --build=maven --lang=java
我看到pom.xml 中指定的应用程序的入口点是:
<exec.mainClass>io.micronaut.function.aws.runtime.MicronautLambdaRuntime</exec.mainClass>
我在 Terraform 的 Lambda 定义中指定了与上述相同的入口点。
当我构建 dockerfile 并尝试运行时
RUN /usr/lib/graalvm/bin/native-image --no-server -cp target/api-*.jar
我得到:
│ Error: Main entry point class
│ \'io.micronaut.function.aws.runtime.MicronautLambdaRuntime\' not found.
这是有道理的,因为该类不在target 文件夹中
Dockerfile:
FROM maven:3.6.3-openjdk-11 as builder
COPY . /home/application
WORKDIR /home/application
RUN mvn -e package
FROM amazonlinux:2018.03.0.20191014.0 as graalvm
ENV LANG=en_US.UTF-8
RUN yum install -y gcc gcc-c++ libc6-dev zlib1g-dev curl bash zlib zlib-devel zip
ENV GRAAL_VERSION 20.1.0
ENV JDK_VERSION java11
ENV GRAAL_FILENAME graalvm-ce-${JDK_VERSION}-linux-amd64-${GRAAL_VERSION}.tar.gz
RUN curl -4 -L https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-${GRAAL_VERSION}/${GRAAL_FILENAME} -o /tmp/${GRAAL_FILENAME}
RUN tar -zxvf /tmp/${GRAAL_FILENAME} -C /tmp \\
&& mv /tmp/graalvm-ce-${JDK_VERSION}-${GRAAL_VERSION} /usr/lib/graalvm
RUN rm -rf /tmp/*
CMD [\"/usr/lib/graalvm/bin/native-image\"]
FROM graalvm
COPY --from=builder /home/application/ /home/application/
WORKDIR /home/application
RUN /usr/lib/graalvm/bin/gu install native-image
RUN /usr/lib/graalvm/bin/native-image --no-server -cp target/api-*.jar
RUN chmod 777 bootstrap
RUN chmod 777 api
RUN zip -j function.zip bootstrap api
EXPOSE 8080
ENTRYPOINT [\"/home/application/api\"]
所以一个广泛的问题是:是否有可能创建本地图像 CRUD Lambda 函数作为后端服务器,通过将APIGatewayV2HttpEvent 请求委托给控制器(基本上是一个单一的 API 处理程序委托给控制器)来处理它们?
Micronaut version: 3.4.2
Lambda runtime: \"provided.al2\"
很抱歉提出了明确的问题,非常感谢!
标签: docker aws-lambda micronaut graalvm-native-image