我在 AWS 中创建了一个可公开访问的 PostgreSQL RDS,并使用以下代码连接到它:
try {
DriverManager.registerDriver(new org.postgresql.Driver());
String url = "jdbc:postgresql://" + DATABASE_SERVER_NAME + ":" + DATABASE_PORT_NUMBER + "/" + DATABASE_NAME + "?user=" + DATABASE_USER + "&password=" + DATABASE_PASSWORD;
try (Connection connection = DriverManager.getConnection(url)) {
try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM \"" + PHANTOM_LOAD_STORE_DATABASE_TABLE_NAME + "\"")) {
try (ResultSet resultSet = statement.executeQuery()) {
while (resultSet.next()) {
System.out.println(resultSet.getString("userid"));
}
}
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
当它在本地运行时,它会成功连接到数据库服务器。
当它在 AWS Lambda 中运行时,它无法连接并出现以下错误:
org.postgresql.util.PSQLException: The connection attempt failed.
...
Caused by: java.net.SocketTimeoutException: connect timed out
lambda 不在 VPC 中,并且具有角色策略 arn:aws:iam::aws:policy/AmazonRDSDataFullAccess
。
有人可以告诉我我做错了什么吗?
最佳答案
尽管创建了可公开访问的 RDS 数据库,但它有一个安全组规则,仅允许来 self 的 IP(创建数据库的 IP)的传入请求。编辑其安全组的传入规则以允许来自任何地方的请求,从而允许 lambda 连接到数据库。
策略 arn:aws:iam::aws:policy/AmazonRDSDataFullAccess
似乎没有必要。
感谢this answer帮助我解决这个问题。
关于java - AWS Lambda 连接到可公开访问的 AWS RDS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55022037/