使用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)开始。
朝霞的建立
Lambda函数的VPC配置
将在先前的文章”使用AWS Lambda + Quarkus创建REST API”中创建的Lambda函数转换为VPC Lambda。
在Lambda中创建RDS Proxy和Aurora的连接配置,并创建RDS Proxy。
此外,执行以下命令并确认输出的JSON中的Targets[0].TargetHealth.State为AVAILABLE。
aws rds describe-db-proxy-targets --db-proxy-name <プロキシ識別子>(例:proxy-1692683664021-database-1)
对源代码进行修改
接下来,我们将修改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函数的环境变量
将数据库密码设置为QUARKUS_DATASOURCE_PASSWORD,将JDBC URL设置为QUARKUS_DATASOURCE_JDBC_URL。JDBC URL应按照以下方式进行组装。
jdbc:postgresql://<先ほど確認したRDS Proxyのエンドポイント>:5432/postgres
确认访问
最后通过访问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"}