AWS Java Lambda连接RDS Postgres数据库的代码示例及配置指南
pom.xml 依赖配置
<dependencies> <!-- AWS Lambda核心依赖 --> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.21</version> </dependency> <!-- PostgreSQL JDBC驱动 --> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.6.0</version> </dependency> <!-- 可选:如果从AWS Secrets Manager动态拉取凭据,添加以下两个依赖 --> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-secretsmanager</artifactId> <version>1.12.510</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency> </dependencies>
无服务器连接PostgreSQL前置配置
- Lambda执行角色必须绑定
AWSLambdaVPCAccessExecutionRole托管策略,确保Lambda可以访问PostgreSQL集群所在的VPC、子网资源 - PostgreSQL所在安全组需要放行Lambda安全组的5432端口入站流量
- 数据库连接初始化放在静态代码块中,复用Lambda执行环境的复用特性,避免每次请求都新建连接,降低冷启动开销
- 禁止硬编码数据库凭据,建议将凭据存储在AWS Secrets Manager中,运行时动态获取
Java Lambda代码示例
import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import java.sql.*; import java.util.*; public class PostgresLambdaHandler implements RequestHandler<Map<String, Object>, Object> { // 静态连接对象,复用执行环境的连接,仅冷启动时初始化一次 private static Connection connection; static { try { Class.forName("org.postgresql.Driver"); // 连接URL格式:jdbc:postgresql://<集群端点>:5432/<DB名称> // 集群端点可在AWS RDS控制台对应集群详情页获取,和你持有的集群标识符对应 String dbUrl = "jdbc:postgresql://你的Postgres集群端点:5432/你的DB名称"; // 此处仅为示例,生产环境请从Secrets Manager拉取账号密码 String username = "你的数据库账号"; String password = "你的数据库密码"; connection = DriverManager.getConnection(dbUrl, username, password); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); throw new RuntimeException("数据库连接初始化失败: " + e.getMessage()); } } @Override public Object handleRequest(Map<String, Object> input, Context context) { String operation = (String) input.get("operation"); try { if ("query".equals(operation)) { return queryData((String) input.get("queryParam")); } else if ("insert".equals(operation)) { return insertData((Map<String, Object>) input.get("insertData")); } else { return Collections.singletonMap("error", "不支持的操作类型"); } } catch (SQLException e) { context.getLogger().log("数据库操作异常: " + e.getMessage()); return Collections.singletonMap("error", "数据库操作失败: " + e.getMessage()); } } // 查询操作示例 private List<Map<String, Object>> queryData(String param) throws SQLException { List<Map<String, Object>> resultList = new ArrayList<>(); // 替换为实际业务表名和查询条件 String sql = "SELECT id, name, create_time FROM your_table WHERE condition = ?"; try (PreparedStatement pstmt = connection.prepareStatement(sql)) { pstmt.setString(1, param); ResultSet rs = pstmt.executeQuery(); ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount(); while (rs.next()) { Map<String, Object> row = new HashMap<>(); for (int i = 1; i <= columnCount; i++) { row.put(metaData.getColumnName(i), rs.getObject(i)); } resultList.add(row); } } return resultList; } // 插入操作示例 private Map<String, Object> insertData(Map<String, Object> data) throws SQLException { // 替换为实际业务表名和插入字段 String sql = "INSERT INTO your_table(name, value) VALUES (?, ?) RETURNING id"; try (PreparedStatement pstmt = connection.prepareStatement(sql)) { pstmt.setString(1, (String) data.get("name")); pstmt.setString(2, (String) data.get("value")); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { return Collections.singletonMap("insertedId", rs.getInt(1)); } } return Collections.singletonMap("status", "插入失败"); } }
补充说明
- 如果使用RDS Proxy做连接池管理,只需将连接URL替换为RDS Proxy的端点即可,进一步降低连接数占用,避免数据库连接溢出
- Lambda超时时间建议设置在10秒以上,预留足够的数据库连接初始化时间
- 执行异常时的日志可在CloudWatch控制台查询,用于定位连接、权限、语法等问题
内容的提问来源于stack exchange,提问作者intelviji
相关产品推荐
相关产品推荐

