我使用Java 8
进行了测试Lambda函数设置到目前为止我已经
了AWSLambdaVPCAccessExecutionRole
将Lambda函数附加到我帐户中唯一的VPC上,并选择了VPC中的所有子网,以便它可以访问
在这种情况下,我的RDS实例向公众开放,我可以通过我的笔记本电脑访问它(即Lambda代码实际上运行在不在VPC内的远程主机上)
分配给Lambda
的安全组是最宽松的可能(即所有CIDR块上的所有流量)
但是,在AWS上运行Lambda函数时,我仍然无法访问我的RDS实例(但是从我的笔记本电脑上运行相同的代码时,从main()
函数运行)
示例代码
public class Application implements RequestHandler<Object, Boolean> {
private Logger logger = Logger.getLogger(Application.class);
public Boolean handleRequest(Object object, Context context) {
try {
Class.forName("com.mysql.jdbc.Driver");
logger.info("Calling DriverManager.getConnection()");
Connection con = DriverManager.getConnection(
"jdbc:mysql://...endpoint...defaultdb",
"awsops",
"..."
);
Statement stmt = con.createStatement();
logger.info("Test Started!");
ResultSet result = stmt.executeQuery("SELECT\n" +
" last_name, COUNT(*)\n" +
"FROM\n" +
" users\n" +
"GROUP BY\n" +
" last_name\n" +
"HAVING COUNT(*) > 1");
if (result.next()) {
logger.info(result.getString("last_name"));
}
return true;
} catch (Exception e) {
logger.info(e.getLocalizedMessage());
}
return false;
}
}
你能帮我理解我可能做错了吗?
CloudWatch日志显示该函数在DriverManager.getConnection()
答案 0 :(得分:0)
事实证明我的RDS是通过一个自动创建的安全组启动的,该安全组实际上只是将我的个人IP地址列入白名单...所以感觉我能够从任何地方连接到它
我必须更新我的RDS实例的安全组,以允许来自Lambda的虚拟网络接口可能来自的子网的流量