AWS Lambda无法通过JDBC访问RDS

时间:2017-08-29 22:33:02

标签: amazon-web-services java-8 aws-lambda

我使用Java 8

进行了测试Lambda函数设置

到目前为止我已经

  • 鉴于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()

处挂起

1 个答案:

答案 0 :(得分:0)

事实证明我的RDS是通过一个自动创建的安全组启动的,该安全组实际上只是将我的个人IP地址列入白名单...所以感觉我能够从任何地方连接到它

我必须更新我的RDS实例的安全组,以允许来自Lambda的虚拟网络接口可能来自的子网的流量