2017-08-29 115 views
0

訪問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

回答

0

原來我RDS與那真的只是白名單我個人的IP地址自動創建的安全組推出掛......所以感覺好像我能連接到它的「任何地方」

我不得不更新我的RDS實例的安全組,以允許從子網流量在LAMBDA的虛擬網絡接口可以從

+0

您可以刪除分配給Lambda函數的SG中的所有規則。沒有理由分配任何東西給SG,它什麼都不做。 Lambda函數應用SG的原因是您可以在其他SG規則中引用該函數。在分配給RDS實例的SG中,您可以輕鬆創建允許來自特定SG的任何成員的入站訪問的規則,而不是將您的子網中的所有IP列出,在這種情況下SG將分配給您的Lambda函數。從EC2控制檯的安全組視圖編輯規則,開始鍵入「sg」以獲取可供選擇的SG列表。 –