【问题标题】:Create and deploy Micronaut AWS Lambda GraalVM Native Image CRUD Application to handle APIGatewayV2HttpEvent by delegating to Controller创建和部署 Micronaut AWS Lambda GraalVM Native Image CRUD 应用程序以通过委托给 Controller 来处理 APIGatewayV2HttpEvent
【发布时间】: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


    【解决方案1】:

    如果您使用的是 apiGateway,我认为您应该做一个代理 lambda 应用程序(而不是使用 MicronautRequestHandler)。

    你只需要声明一个应用程序和一些控制器。

    看 : https://guides.micronaut.io/latest/mn-application-aws-lambda-graalvm-maven-java.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 2014-04-12
      • 2018-12-29
      • 1970-01-01
      • 2021-05-20
      • 2012-08-14
      • 2016-09-20
      相关资源
      最近更新 更多