首页 > 解决方案 > Java 中的 AWS Lambda 无法使用连接钱包连接到 Oracle RDS

问题描述

我正在尝试从用 java 编写的 Lambda 连接到 AWS Oracle RDS。用于建立连接的连接钱包的二进制文件。

当我从 SQLDeveloper 使用它时,它工作正常。但是当我使用这个java代码时也不会发生同样的情况。

在 SQLDeveloper 中,我使用自定义 jdbc url,即:dbc:oracle:thin:@(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCPS)(HOST =myhost100.mydomain.fr) (PORT = 2499)))( CONNECT_DATA = (SID = MYSID01))(SECURITY = (SSL_SERVER_CERT_DN = "C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=mydb100.xyzabc.eu-west-3.rds .amazonaws.com”)))

因此,代码中也使用了相同的内容。

我也在 jar 中添加了二进制文件。

这是java代码和pom.xml。

它无法连接到 RDS 并最终超时。

RDS 位于私有 VPC 中,这与 lambda 一致,这意味着 VPC、子网和安全组是一致的。

甲骨文版本:19.0.0.0.ru-2021-04.rur-2021-04.r1

爪哇:

package fr.globalhealthcheck;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Map;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;


public class MeteoHandler  implements RequestHandler<Map<String,String>, String>{

    public String handleRequest(Map<String,String> event, Context context)
    {
        LambdaLogger logger = context.getLogger();

        String response = new String("200 OK");
            
        testConnection();

        return response;
    }

    public void testConnection()
    {
        try      
        {
            System.out.println("Before connect");
            System.setProperty("oracle.net.SSL_SERVER_DN_MATCH", "ON");
            System.setProperty("oracle.net.SSL_CYFER_SUITES", "(SSL_RSA_WITH_AES_256_CBC_SHA)");
            System.setProperty("oracle.net.ssl_version1", "1.0");
            System.setProperty("oracle.net.SSL_CLIENT_AUTHENTICATION", "FALSE");
            System.setProperty("oracle.net.wallet_location", "/var/task/cwallet.sso");
            Connection conn = DriverManager.getConnection(
                    "jdbc:oracle:thin:@(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCPS)(HOST =myhost100.mydomain.fr) (PORT = 2499)))(CONNECT_DATA = (SID = MYSID01))(SECURITY = (SSL_SERVER_CERT_DN = \"C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=mydb100.xyzabc.eu-west-3.rds.amazonaws.com\")))", 
                    "myuser", "mypassword");
            System.out.println("After connect");
            if (conn != null) {
                System.out.println("Connected to the database!");
            } else {
                System.out.println("Failed to make connection!");
            }

        } catch (SQLException e) {
            System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
}

马文:

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>fr.globalhealthcheck</groupId>
    <artifactId>global-healthcheck</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>

    <name>global-healthcheck</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> 
            <version>2.8.6</version> </dependency> -->
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-core</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-events</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-log4j2</artifactId>
            <version>1.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc11</artifactId>
            <version>21.1.0.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>${basedir}/lib/binary</directory>
                <filtering>false</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
            </plugin>           
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <archive>
                                <manifest>
                                    <mainClass>
                                        fr.globalhealthcheck.MeteoHandler
                                    </mainClass>
                                </manifest>
                            </archive>
                            <descriptorRefs>
                                <descriptorRef>jar-with-dependencies</descriptorRef>
                            </descriptorRefs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>           
        </plugins>
    </build>
</project>

cwallet.sso 是添加在二进制文件夹中的连接钱包,并在 maven 中引用。

所以我打印了它来验证 lambda 中的路径,也就是 /var/task/cwallet.sso

标签: javamavenaws-lambdaamazon-rdsoracle-wallet

解决方案


您使用的属性之一不正确。oracle.net.SSL_CYFER_SUITES --> oracle.net.SSL_CIPHER_SUITES

您使用的 JDBC 驱动程序版本是什么?此外,您可以查看此博客以了解 12.2 及更低版本。否则,请参阅此页面


推荐阅读