使用AWS Lambda + Quarkus创建访问Aurora数据库的API

首先

以下是在另一篇文章”使用AWS Lambda + Quarkus创建REST API”中创建的API上添加访问Amazon Aurora(PostgreSQL)功能的步骤。

手順包括了Aurora的设置。另外,Lambda访问Aurora将采用通过RDS Proxy的配置。

前提条件

假设在这篇文章中(即使工具版本不一致,仍然可以执行)。

    • 別記事「AWS Lambda + QuarkusでのREST API作成」記載の内容の実施が完了していること

 

    • Quarkus CLI 3.2.3 Final

 

    • Maven 3.8.7

 

    AWS CLI 2.13.10

执行步骤

我们将从创建Aurora(PostgreSQL)开始。

朝霞的建立

2023-08-23 at 00.30.22@2x.png
2023-08-23 at 00.30.34@2x.png
2023-08-23 at 00.30.47@2x.png
2023-08-23 at 00.30.55@2x.png
2023-08-23 at 00.31.05@2x.png
2023-08-23 at 00.31.17@2x.png
2023-08-23 at 00.31.30@2x.png
2023-08-23 at 00.31.39@2x.png
2023-08-23 at 00.31.48@2x.png
2023-08-23 at 00.32.01@2x.png
2023-08-23 at 00.32.11@2x.png
2023-08-23 at 00.32.20@2x.png

Lambda函数的VPC配置

将在先前的文章”使用AWS Lambda + Quarkus创建REST API”中创建的Lambda函数转换为VPC Lambda。

2023-08-23 at 00.34.01@2x.png
2023-08-23 at 00.32.36@2x.png
2023-08-23 at 00.32.45@2x.png
2023-08-23 at 00.32.58@2x.png

在Lambda中创建RDS Proxy和Aurora的连接配置,并创建RDS Proxy。

2023-08-23 at 00.33.08@2x.png
2023-08-23 at 00.33.15@2x.png
2023-08-23 at 00.33.24@2x.png
2023-08-23 at 00.33.31@2x.png
2023-08-23 at 00.33.41@2x.png

此外,执行以下命令并确认输出的JSON中的Targets[0].TargetHealth.State为AVAILABLE。

aws rds describe-db-proxy-targets --db-proxy-name <プロキシ識別子>(例:proxy-1692683664021-database-1)
2023-08-23 at 00.33.51@2x.png

对源代码进行修改

接下来,我们将修改Quarkus的Java代码。我们将访问数据库(PostgreSQL),使用current_timestamp获取当前日期和时间,并将其包含在响应中一并返回。

在Lambda函数的项目中执行以下命令,添加Quarkus的扩展。

# DBコネクションプール
quarkus extension add 'agroal'

# PostgreSQLのJDBCドライバ
quarkus extension add 'jdbc-postgresql'

# Hibernate ORM with Panache(不要かもしれない)
quarkus extension add 'hibernate-orm-panache'

请按以下方式编辑application.properties。在这里,我们指定使用PostgreSQL作为数据库,并指定连接用户名和连接池数量。JDBC URL和密码将在稍后作为Lambda的环境变量进行设置,因此留空。

quarkus.lambda.handler=test

quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=postgres
quarkus.datasource.password=

quarkus.datasource.jdbc.url=
quarkus.datasource.jdbc.max-size=2

我們將在Maven項目中的ProcessingService.java文件中進行以下編輯。我們將從數據源中獲取連接,執行select current_timestamp以從Aurora獲取當前日期和時間,然後將其添加到回應中並返回。

package org.example;

import io.agroal.api.AgroalDataSource;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@ApplicationScoped
public class ProcessingService {

    public static final String CAN_ONLY_GREET_NICKNAMES = "Can only greet nicknames";

    @Inject
    AgroalDataSource defaultDataSource;

    public OutputObject process(InputObject input) {
        if (input.getName().equals("Stuart")) {
            throw new IllegalArgumentException(CAN_ONLY_GREET_NICKNAMES);
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        String result = input.getGreeting() + " " + input.getName() + ", date: " + sdf.format(new Date());

        try (Connection con = defaultDataSource.getConnection()) {
            PreparedStatement ps = con.prepareStatement("select current_timestamp");
            ResultSet rs = ps.executeQuery();
            rs.next();
            System.out.println("Current timestamp: " + rs.getTimestamp(1));
            result += ", Aurora PostgreSQL current timestamp: " + rs.getTimestamp(1);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

        OutputObject out = new OutputObject();
        out.setResult(result);

        return out;
    }
}

我已经完成源代码的修正,现在进行构建。请执行以下命令。由于JUnit测试用例无法正常结束,所以我在这里先跳过了测试。

quarkus build --clean --no-tests

将构建结果部署到Lambda环境中。

sh target/manage.sh update

设置Lambda函数的环境变量

2023-08-23 at 00.34.09@2x.png

将数据库密码设置为QUARKUS_DATASOURCE_PASSWORD,将JDBC URL设置为QUARKUS_DATASOURCE_JDBC_URL。JDBC URL应按照以下方式进行组装。

jdbc:postgresql://<先ほど確認したRDS Proxyのエンドポイント>:5432/postgres
2023-08-23 at 00.34.19@2x.png

确认访问

最后通过访问API来确认其运行情况。请按照以下方式执行curl命令(替换API的端点)。已包含从Aurora获取的当前日期和时间。

❯ curl -X POST -H "Content-Type: application/json" -d '{"name" : "Bill", "greeting" : "hello"}' https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/example
{"result":"hello Bill, date: 2023-08-22 06:51:42.623, Aurora PostgreSQL current timestamp: 2023-08-22 06:51:42.626195","requestId":"6257703d-a50a-4925-9401-1a89b016284f"}
广告
将在 10 秒后关闭
bannerAds