AWS Lambda Java,连接到MySQL RDS

6

我需要开发一个AWS Lambda Java函数,从RDS MySQL数据库中检索一些记录。

我应该使用JDBC吗?我应该使用标准的JDBC示例:

try {
    String url = "jdbc:msql://200.210.220.1:1114/Demo";
    Connection conn = DriverManager.getConnection(url,"","");
    Statement stmt = conn.createStatement();
    ResultSet rs;

    rs = stmt.executeQuery("SELECT Lname FROM Customers WHERE Snum = 2001");
    while ( rs.next() ) {
        String lastName = rs.getString("Lname");
        System.out.println(lastName);
    }
    conn.close();
} catch (Exception e) {
    System.err.println("Got an exception! ");
    System.err.println(e.getMessage());
}

1
你有阅读过 AWS Lambda 的任何文档吗? - Kayaman
2
如果这段代码放在lambda中,每次调用它时,都会从我们的数据库中检索连接,对吗?如果是这样,我们将不得不支付“单连接仅一次使用开销”,对吗?更糟糕的是,如果有大量并发请求,我们将遇到某种形式的“连接耗尽”...对吗?但是,在lambda中使用连接池也对我来说没有意义,因为每次新的lambda调用都会创建一个新的池,对吗?据我所知,lambda是短暂的函数。我说得对吗?你如何应对这种挑战? - Goose
4个回答

18

步骤1:

  1. 登录 IAM 控制台
  2. 角色 -> 创建新角色
  3. 角色名称:lambda-vpc-execution-role
  4. AWS 服务角色 ->

    a) 选择 AWS Lambda

    b) 添加策略 "AWSLambdaFullAccess"

步骤2:

  1. https://github.com/vinayselvaraj/lambda-jdbc-sample 获取代码(请注意,这是一个 Maven 项目)
  2. 右键单击项目,选择 Run as -->5.maven build...

    为目标提供名称package shade:shade

  3. 转到项目文件夹和 target/lamda-0.0.1-SNAPSHOT-shaded.jar

步骤3:

  1. 登录 Lambda 控制台(跳过蓝图)
  2. 创建新的 Lambda
  3. 名称:time-test

    a) 运行环境 - Java

    b) 上传 .zip(.jar) 文件(target/lamda-0.0.1-SNAPSHOT-shaded.jar)

  4. 提供 package.class-name::myhandler -> 处理程序

  5. 角色 -> lambda-vpc-exceution-role

  6. vpc 提供 rds-vpc 详细信息(这应该在同一个 VPC 组中工作)

  7. 创建函数

在操作下拉列表中选择配置测试事件,结果将显示为“执行结果:成功(日志)”


1
这个答案非常有帮助。我需要添加以下角色策略,最终才能让Aurora MySQL正常工作:AmazonRDSFullAccess AWSLambdaVPCAccessExecutionRole此外,默认安全组第一次尝试时并不起作用。将默认安全组应用于Lambda和RDS,是最开放的起点。 - Cubic Compass
使用AWSLambdaFullAccess策略,同时为RDS和Lambda使用相同的VPC和子网。在我的情况下,这还需要CreateNetworkInterface策略。 - np10

1

是的,您需要在Lambda函数类中使用标准JDBC代码。您提供的代码看起来不错。当通过Lamda函数访问RDS或任何其他RDBMS时,您需要做更多的事情-

  1. 为Lambda函数创建一个jar或zip文件
  2. 您的zip文件需要有一个lib文件夹,其中包含JDBC驱动程序文件。Lambda函数文档说这是两种标准方法之一,但对我没有起作用。
  3. 您可以创建一个jar文件,其中放置了驱动程序类。这有效。最好的方法是通过Maven Shade插件完成,该插件会提取JDBC驱动程序并将类打包在一个单独的jar文件中。
  4. 设置处理程序函数并在Lambda部署时指定它
  5. 根据需要定义执行角色和VPC。
  6. 上传和发布您的jar或zip文件。

您可以通过控制台测试Lambda函数,并在CloudWatch日志中查看实际输出。


0
我特别注意到你的代码库中的一件事情是,即使你使用这个Lambda函数连接到你拥有的特定RDS时,主机名可能不是Amazon RDS的正确主机名。
它需要是你要连接的RDS的终端节点,你完整的连接URL应该像下面这样 -
//jdbc:mysql://hostname (RDS的终端节点):port/databasename String url = "jdbc:mysql://"+dbHost+":3306/"+dbName;
由于这些终端节点对于不同的数据库和服务器可能会发生变化,因此您可以将它们作为Lambda中的环境变量,并使用以下方式引用:
String dbHost = System.getenv("dbHost");
String dbName = System.getenv("dbName");
这样设计更加清晰、无状态,符合Lambda的支持。

0
你可以使用类似这样的实现方式:
public static DataSource getDataSource(){

    Utils._logger.log("Get data source");
    MysqlDataSource mysqlDs = null;
    try{
        mysqlDs = new MysqlDataSource();
        mysqlDs.setURL('jdbc:msql://'+'url');
        mysqlDs.setUser('user');
        mysqlDs.setPassword('pwd');
        Utils._logger.log("Object "+mysqlDs.getUrl()+" "+mysqlDs.getUser()+" ");
        return mysqlDs;
    }
    catch(Exception e) {
        Utils._logger.log("No se pudo abrir el archivo de properties");
        e.printStackTrace();
    }
    return mysqlDs;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接