如何在 AWS Lambda 中运行 IronPDF for Java

This article was translated from English: Does it need improvement?
Translated
View the article in English

重要:必要设置

  • 不支持 Zip 部署,因为 IronPDF 需要在运行时执行二进制文件。
  • 必须将 PackageType 设置为 Image。因为 IronPDF for Java 仅支持 Docker 部署。
  • 你必须使用 AmazonLinux2 docker 映像。
  • 必须设置 IronPdfEngineWorkingDirectory:
Setting.setIronPdfEngineWorkingDirectory(Paths.get("/tmp/"));
JAVA

必须,因为这是 AWS 允许的唯一执行环境路径。

  • 增加 /tmp 大小,默认值为 512 MB。请至少设置为 1024 MB。
  • 在项目中加入 ironpdf-engine-linux-x64 依赖项:
 <dependency>
    <groupId>com.ironsoftware</groupId>
    <artifactId>ironpdf-engine-linux-x64</artifactId>
    <version>2022.xx.x</version>
</dependency>
XML
  • 由于启动缓慢,将 Lambda 超时设置为 330 秒。
  • 将 Lambda 内存大小至少设置为 1024 MB。

IntelliJ IDEA的AWS工具包快速入门 (AWS SAM)

1.安装工具:

* IntelliJ IDEA - [https://www.jetbrains.com/idea/download/](https://www.jetbrains.com/idea/download/)

* AWS 工具包 [https://docs.aws.amazon.com/toolkit-for-jetbrains/latest/userguide/setup-toolkit.html](https://docs.aws.amazon.com/toolkit-for-jetbrains/latest/userguide/setup-toolkit.html)

* SAM CLI - [安装 SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)

* Docker - [安装 Docker 社区版](https://hub.docker.com/search/?type=edition&offering=community)

您可能还需要以下材料进行本地测试:

* Java8 [安装 Java SE 开发工具包 8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)

* Maven - [安装 Maven](https://maven.apache.org/install.html)

2.创建项目。 (文件"->"新建"->"项目..."。)

如何在 AWS Lambda 中运行 IronPDF for Java - 图 1

3.配置:

* 软件包类型:"图像

* 运行时:`java8` 或 `java11

* SAM 模板 : `Maven
如何在 AWS Lambda 中运行 IronPDF for Java - 图 2

  1. 将以下依赖项添加到 pom.xml
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>2.0.3</version>
</dependency>

<dependency>
    <groupId>com.ironsoftware</groupId>
    <artifactId>ironpdf-engine-linux-x64</artifactId>
    <version>2022.11.1</version>
</dependency>

<dependency>
    <groupId>io.perfmark</groupId>
    <artifactId>perfmark-api</artifactId>
    <version>0.26.0</version>
</dependency>

<dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-okhttp</artifactId>
    <version>1.50.2</version>
</dependency>

<dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-netty-shaded</artifactId>
    <version>1.50.2</version>
</dependency>
XML
  1. App.java 中的 handleRequest 函数代码改为:
import com.ironsoftware.ironpdf.*;
public APIGatewayProxyResponseEvent handleRequest(final APIGatewayProxyRequestEvent input, final Context context) {
        APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
        Settings.setDebug(true); //optional
        Settings.setIronPdfEngineWorkingDirectory(Paths.get("/tmp/")); //requried!
        try {
            context.getLogger().log("RENDER PDF");
            PdfDocument pdf = PdfDocument.renderUrlAsPdf("https://www.google.com");
            context.getLogger().log("RENDER PDF SUCCESS");
            pdf.saveAs("/tmp/my-first-pdf.pdf");
            //Done! Now you can do anything with the pdf such as upload this pdf to S3.
            //return something..
            Map<String, String> headers = new HashMap<>();
            headers.put("Content-Type", "application/json");
            headers.put("X-Custom-Header", "application/json");
            APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent()
                    .withHeaders(headers);
            return response
                    .withStatusCode(200)
                    .withBody("ENJOY IRON-PDF!");
        } catch (Exception e) {
            return response
                    .withBody("{" + e.getMessage() + "}")
                    .withStatusCode(500);
        }
    }
JAVA
  1. template.yaml 中设置 Lambda 配置:
Globals:
  Function:
    Timeout: 400
    MemorySize: 2048
    EphemeralStorage:
      Size: 1024
#don't touch the other config    
YAML

7.将 Dockerfile 更新如下:

  • 注意:Java8 请使用 java8.al2 映像,因为它使用 AmazonLinux2,但 java8 使用旧的 AmazonLinux
FROM public.ecr.aws/sam/build-java8.al2:latest as build-image
WORKDIR "/task"
COPY src/ src/
COPY pom.xml ./
RUN mvn -q clean install
RUN mvn dependency:copy-dependencies -DincludeScope=compile
FROM public.ecr.aws/lambda/java:8.al2
RUN yum update -y
RUN yum install -y pango.x86_64
RUN yum install -y libXcomposite.x86_64
RUN yum install -y libXcursor.x86_64
RUN yum install -y libXdamage.x86_64
RUN yum install -y libXext.x86_64
RUN yum install -y libXi.x86_64
RUN yum install -y libXtst.x86_64
RUN yum install -y cups-libs.x86_64
RUN yum install -y libXScrnSaver.x86_64
RUN yum install -y libXrandr.x86_64
RUN yum install -y GConf2.x86_64
RUN yum install -y alsa-lib.x86_64
RUN yum install -y atk.x86_64
RUN yum install -y gtk3.x86_64
RUN yum install -y ipa-gothic-fonts
RUN yum install -y xorg-x11-fonts-100dpi
RUN yum install -y xorg-x11-fonts-75dpi
RUN yum install -y xorg-x11-utils
RUN yum install -y xorg-x11-fonts-cyrillic
RUN yum install -y xorg-x11-fonts-Type1
RUN yum install -y xorg-x11-fonts-misc
RUN yum install -y glibc-devel.x86_64
RUN yum install -y at-spi2-atk.x86_64
RUN yum install -y mesa-libgbm.x86_64
RUN yum install -y libxkbcommon
RUN yum install -y amazon-linux-extras
RUN amazon-linux-extras install epel -y
RUN yum install -y libgdiplus
RUN chmod 777 /tmp/
COPY --from=build-image /task/target/classes /var/task/
COPY --from=build-image /task/target/dependency /var/task/lib
# Command can be overwritten by providing a different command in the template directly.
CMD ["helloworld.App::handleRequest"]
  1. 一起建造:
sam build -u
  1. 用以下设备部署
sam deploy --guided
  1. 在 AWS Lambda 中使用 IronPDF! 现在,您的功能已启动: https://console.aws.amazon.com/lambda/home