Triển khai ứng dụng dựa trên Quarkus sử dụng AWS Lambda với AWS SAM

Quarkus cung cấp cho các Java developers khả năng xây dựng native image dựa trên  GraalVM. Native image là một tệp nhị phân bao gồm mọi thứ: mã nguồn, libraries, và  một smaller virtual machine (VM). Cách tiếp cận này cải thiện thời gian khởi động các AWS Lambda function của bạn, vì nó được tối ưu hóa cho các môi trường dựa trên container. Những công cụ này sử dụng kiến trúc cloud native và serverless architectures với triết lý container-first.

Trong bài đăng trên blog này, bạn tìm hiểu cách tích hợp Quarkus framework với các hàm AWS Lambda bằng cách sử dụng  AWS Serverless Application Model (AWS SAM).

Giảm chi phí hạ tầng và cải thiện độ trễ

Khi bạn phát triển các ứng dụng với Quarkus và GraalVM với native images, file bootstrap được tạo cần nhiều thời gian hơn để biên dịch, nhưng nó sẽ có thời gian chạy nhanh hơn. GraalVM là một JIT compile tạo ra native machine code được tối ưu hoá, đồng thời sử dụng ít bộ nhớ và CPU hơn. Điều này đạt được nhờ một loạt các tối ưu hóa trình biên dịch tiên tiến và các kỹ thuật inlining tích cực và phức tạp. Bằng cách sử dụng Quarkus, bạn cũng có thể giảm chi phí cơ sở hạ tầng của mình vì bạn cần ít tài nguyên hơn.

Với các tính năng Quarkus và AWS SAM, bạn có thể cải thiện hiệu suất độ trễ của các AWS Lambda function dựa trên Java của mình bằng cách giảm thời gian cold-start. Cold-start là thời gian khởi tạo mà một Lambda function thực hiện trước khi chạy mã thực. Sau khi function được khởi tạo lần đầu tiên, các yêu cầu trong tương lai sẽ sử dụng lại cùng một môi trường thực thi mà không phải chịu thời gian cold-start, giúp cải thiện hiệu suất.

Tổng quan giải pháp

Hình 1 trình bày các thành phần AWS và quy trình làm việc của giải pháp của chúng tôi.

Hình 1. Mô hình kiến trúc cho ứng dụng Quarkus (AWS Lambda)

Với AWS SAM, bạn có thể dễ dàng tích hợp các framework bên ngoài bằng cách sử dụng runtime tùy chỉnh và định cấu hình các thuộc tính trong file template và Makefile.

Chuẩn bị

Trong bài hướng dẫn này, bạn cần phải có đủ các điều kiện như sau:

  • Software components: Java 11 JDK (ví dụ như  Amazon Corretto), Maven, và  AWS SAM CLI phiên bản mới nhất.
  • Quyền admin của các dịch vụ sau : AWS Lambda, Amazon CloudWatch, Amazon API Gateway, và AWS Identity and Access Management. Bạn nên áp dụng nguyên tắc quyền tối thiểu trong trường hợp sử dụng của riêng bạn, đó là một best practice được khuyến nghị bởi AWS.

Tạo một AWS Lambda function dựa trên Java

AWS SAM cung cấp các templates để rút ngắn thời gian khi làm các hàm mới. Tạo một  function Java-based bằng cách làm theo các bước sau:

Chạy câu lệnh sau trong terminal của bạn:

sam init -a x86_64 -r java11 -p Zip -d maven -n java11-mvn-default

Trong các parameters này chúng ta chọn kiến trúc x86, java11 làm Java runtime LTS version, Zip làm build artifact và Maven làm  công cụ package và dependency. Chúng ta cũng thiết lập tên dự án.

Hãy chọn tuỳ chọn đầu tiên để sử dụng cho base code của bạn:

          1 – AWS Quick Start Templates

Cuối cùng, với lựa chọn trước đó, bạn có các templates khác nhau để lựa chọn mà tạo base structure cho function của bạn. Trong trường hợp của chúng ta, hãy chọn cái đầu tiên, function này tạo ra một AWS Lambda  function gọi tới là external HTTPS endpoint. Thao tác này sẽ lấy địa chỉ IP và trả lại nó với phản hồi “Hello World” cho người dùng trong JSON:

          1 – Hello World Example

Output sẽ mang lại kết quả như sau, thể hiện trong Hình 2:

Hình 2. Cấu hình dữ liệu đầu vào cho AWS SAM 

Tích hợp Quarkus framework

Sử dụng AWS SAM, bạn có thể dễ dàng tích hợp các non-AWS custom runtimes trong các AWS Lambda function của mình. Với tính năng này, bạn có thể tích hợp Quarkus framework. Làm theo bốn bước tiếp theo:

1. Tạo một Makefile file

Tạo file  “Makefile” trong thư mục “HelloWorldFunction” với code như sau:

  build-HelloWorldFunction:
  mvn clean package -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-mandrel:21.3-java11
  @ unzip ./target/function.zip -d $(ARTIFACTS_DIR)

Với snippet này, bạn đang định cấu hình AWS SAM để tạo bootstrap runtime bằng cách sử dụng Maven instructions cho AWS SAM.

Sử dụng Quarkus, bạn có thể xây dựng tệp Linux executable mà không cần phải cài đặt GraalVM với tùy chọn tiếp theo:

  -Dquarkus.native.container-build=true

Để biết thêm thông tin, bạn có thể truy cập trang web chính thức và tìm hiểu thêm về cách xây dựng native image ( building a native image ) .

2. Cấu hình Maven dependencies

Với tư cách là một dự án của Maven, nó sẽ bao gồm các dependencies cần thiết. Thay đổi file pom.xml trong thư mục “HelloWorldFunction” để loại bỏ các thư viện mặc định:

<dependencies>
  <dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-core</artifactId>
    <version>1.2.1</version>
  </dependency>
  <dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-events</artifactId>
    <version>3.6.0</version>
  </dependency>
</dependencies>

Thêm các Quarkus libraries, profile, và plugins vào bên phải phần pom.xml như được hiển thị trong cấu hình XML sau. Tại thời điểm hiện tại, phiên bản mới nhất của Quarkus là 2.7.1.Final. Chúng tôi thực sự khuyên bạn nên sử dụng các phiên bản mới nhất của các libraries and plugins:

<dependencies>
  <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-amazon-lambda</artifactId>
    <version>2.7.1.Final</version>
  </dependency>
  <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-arc</artifactId>
    <version>2.7.1.Final</version>
  </dependency>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.1</version>
    <scope>test</scope>
  </dependency>
</dependencies>
<build>
  <finalName>function</finalName>
  <plugins>
    <plugin>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-maven-plugin</artifactId>
      <version>2.7.1.Final</version>
      <extensions>true</extensions>
      <executions>
        <execution>
          <goals>
            <goal>build</goal>
            <goal>generate-code</goal>
            <goal>generate-code-tests</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
<profiles>
  <profile>
    <id>native</id>
    <activation>
      <property>
        <name>native</name>
      </property>
    </activation>
    <properties>
      <quarkus.package.type>native</quarkus.package.type>
    </properties>
  </profile>
</profiles>

3. Cấu hình template.yaml sử dụng previous Makefile

Để cấu hình AWS SAM template nhằm sử dụng cấu hình Makefile của riêng bạn bằng cách sử dụng các hướng dẫn của Quarkus và Maven một cách chính xác, hãy chỉnh sửa tệp template.yaml để thêm các thuộc tính sau:

Resources:
  HelloWorldFunction:
    Metadata:
      BuildMethod: makefile
    Properties:
      Runtime: provided

4. Thêm một file properties để bật tính năng cấu hình SSL 

Cuối cùng, tạo một tệp application.properties trong thư mục: ../HelloWorldFunction/src/main/resources/ với thuộc tính sau:

quarkus.ssl.native=true

property này là cần thiết vì function mẫu sử dụng kết nối an toàn đến https://checkip.amazonaws.com . Nó sẽ lấy nội dung phản hồi trong mẫu bạn đã chọn trước đó.

Giờ đây, bạn có thể xây dựng và triển khai hàm Quarkus đầu tiên của mình bằng các lệnh AWS SAM sau:

sam build

Thao tác này sẽ tạo Zip artifact bằng cách sử dụng Maven tool và sẽ build the native image để triển khai trên AWS Lambda dựa trên cấu hình Makefile trước đó của bạn. Cuối cùng, chạy lệnh AWS SAM sau để triển khai function của bạn:

sam deploy -–guided

Lần đầu tiên bạn deploy một ứng dụng AWS SAM, bạn có thể tùy chỉnh một số tham số như Stack name, AWS Region và nhiều hơn thế nữa (xem Hình 3). Bạn cũng có thể chọn một trong những tham số  mặc định. Để biết thêm thông tin về các tùy chọn triển khai AWS SAM, hãy đọc AWS SAM documentation.

Hình 3.  Cấu hình đầu vào cho việc deploy Lambda function

Cấu hình này cho phép bạn định cấu hình các quyền IAM cần thiết để deploy tài nguyên AWS SAM cho code mẫu này. Sau khi hoàn thành nhiệm vụ, bạn có thể nhìn thấy AWS CloudFormation Stack và các tài nguyên được tạo bởi AWS SAM.

Bây giờ bạn đã tạo và triển khai một  HTTPS API Gateway endpoint với ứng dụng Quarkus trên AWS Lambda mà bạn có thể thực hiện chạy kiểm tra.

Kiểm tra Quarkus function

Cuối cùng, hãy kiểm tra Quarkus function của bạn trong AWS Management Console bằng cách chọn new function trong danh sách các function của  AWS Lambda. Sử dụng tính năng kiểm tra có trong bảng điều khiển, như trong Hình 4:

Hình 4. Thực thi test mẫu trong Lambda

Bạn sẽ nhận được phản hồi cho request vào Lambda function của mình và một bản tóm tắt. Điều này bao gồm thông tin như thời lượng hoặc các tài nguyên cần thiết trong Quarkus function mới của bạn. Để biết thêm thông tin về việc kiểm tra ứng dụng trên AWS SAM, bạn có thể đọc Testing and debugging serverless applications.. Bạn cũng có thể truy cập trang web chính thức để đọc thêm AWS SAM with Quarkus.

Dọn dẹp tài nguyên

Để tránh phát sinh các khoản phí trong tương lai, hãy xóa các tài nguyên đã tạo trong AWS Lambda stack của bạn. Bạn có thể xóa tài nguyên bằng lệnh sau:

sam delete

Kết luận

Trong bài viết  này, chúng tôi đã trình bày cách tích hợp các Java frameworks như Quarkus trên AWS Lambda bằng cách sử dụng custom runtimes với AWS SAM. Điều này cho phép bạn cấu hình  custom build configurations hoặc các frameworks ưa thích của bạn. Các công cụ này sẽ trau dồi kinh nghiệm cho các developer, các công cụ tiêu chuẩn được sử dụng để phát triển các ứng dụng serverless với các yêu cầu trong tương lai, cho thấy tính linh hoạt mạnh mẽ cho các developers.

Quarkus native image được tạo và áp dụng trong AWS Lambda function làm giảm kích thước Java footprint. Bạn có thể sử dụng các kĩ năng về Java của mình để phát triển các ứng dụng không cần máy chủ mà không cần phải thay đổi ngôn ngữ lập trình. Đây là một lợi thế lớn khi các nguồn lực tính toán hoặc vấn đề cold-start rất quan trọng đối với các yêu cầu kinh doanh hoặc kỹ thuật.


Bài được dịch từ bài viết trên AWS Blogs, bạn có thể xem bài viết gốc tại đây.