AWS LAMBDA无法通过JDBC

AWS LAMBDA无法通过JDBC

问题描述:

访问RDS我有使用Java 8AWS LAMBDA无法通过JDBC

测试lambda函数设置到目前为止,我有

  • 给出的lambda函数连接lambda函数的执行角色AWSLambdaVPCAccessExecutionRole
  • 到我在我的帐户上唯一的VPC,并选择VPC内的所有子网,以便它可以访问我的RDS实例在这种情况下开放给t他是公开的,我可以通过我的笔记本电脑访问它(即拉姆达代码实际上运行在分配给Lambda远程主机不VPC内)

  • 安全组是最宽松的可能(即所有所有CIDR块的流量)

不过,我仍然无法访问我的RDS实例运行在AWS上的lambda函数时(但相同的代码工作在我的笔记本电脑,从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

的RDS实例都有一个安全组的到来。 SG上的入站规则是什么?另外,http://docs.aws.amazon.com/lambda/latest/dg/vpc-rds.html提供了这个教程。 – jarmod

原来我RDS与那真的只是白名单我个人的IP地址自动创建的安全组推出挂......所以感觉好像我能连接到它的“任何地方”

我不得不更新我的RDS实例的安全组,以允许从子网流量在LAMBDA的虚拟网络接口可以从

+0

您可以删除分配给Lambda函数的SG中的所有规则。没有理由分配任何东西给SG,它什么都不做。 Lambda函数应用SG的原因是您可以在其他SG规则中引用该函数。在分配给RDS实例的SG中,您可以轻松创建允许来自特定SG的任何成员的入站访问的规则,而不是将您的子网中的所有IP列出,在这种情况下SG将分配给您的Lambda函数。从EC2控制台的安全组视图编辑规则,开始键入“sg”以获取可供选择的SG列表。 –