【问题标题】:AWS Lambda Java, connect to MySQL RDSAWS Lambda Java,连接到 MySQL RDS
【发布时间】:2020-10-30 03:17:21
【问题描述】:

我需要开发一个 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());
}

【问题讨论】:

  • 您是否阅读过任何有关 AWS Lambda 的文档?
  • 如果这段代码进入一个 lambda,每次调用它时,都会从我们的数据库中检索一个连接,对吗?如果是这种情况,我们将不得不支付“单次连接仅一次使用开销”,对吗?甚至最糟糕的是,如果完成了很多并发请愿,我们将会出现某种“连接中断”……对吧?但是 lambda 中的池连接对我来说也没有意义,因为每次新的 lambda 调用都会创建一个新池,对吗?据我所知,lambda 是短暂的函数。我对么?你怎么能应付这样的挑战???

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


【解决方案1】:

第 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. 名称:时间测试

    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. 创建函数

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

【讨论】:

  • 这个答案非常有帮助。我需要添加以下角色策略以最终使其与 Aurora MySQL 一起使用: AmazonRDSFullAccess AWSLambdaVPCAccessExecutionRole 此外,默认安全组在第一次尝试时不起作用。适用于 Lambda 和 RDS 的默认安全组是最开放的起点。
  • 使用 AWSLambdaFullAccess 策略以及为 RDS 和 Lambda 使用相同的 VPC 和子网。在我的情况下,这也需要 CreateNetworkInterface 策略。
【解决方案2】:

是的,您需要在 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 日志中查看实际输出。

【讨论】:

    【解决方案3】:

    您可以使用这种实现方式:

    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;
    
    }
    

    【讨论】:

      【解决方案4】:

      我在您的代码库中特别注意到的一件事是,即使您使用此 Lambda 函数连接到您拥有的特定 RDS,主机名也可能不是 Amazon RDS 的正确主机名。 它必须是您尝试连接的 RDS 的端点,并且您的完整连接 url 如下所示 -

      //jdbc:mysql://hostname (RDS 的端点):port/databasename

      字符串 url = "jdbc:mysql://"+dbHost+":3306/"+dbName;

      由于这些端点可以针对不同的数据库和服务器进行更改,因此您可以将它们作为 Lambda 中的环境变量并使用

      String dbHost = System.getenv("dbHost");

      String dbName = System.getenv("dbName");

      用于 Lambda 支持的更简洁和无状态的设计。

      【讨论】:

        猜你喜欢
        • 2018-05-13
        • 2019-09-01
        • 1970-01-01
        • 2022-10-13
        • 2021-06-10
        • 2017-10-05
        • 2017-07-25
        • 2017-12-27
        • 2017-09-07
        相关资源
        最近更新 更多