java - 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
解决方案
推荐阅读
- javascript - animationend 在 css 上触发,但不在 javascript 上触发
- sql - 来自不同表的日期范围之间的平均列
- python - 如何使用 tktinker 制作日历
- java - 我的 JLabel 不显示来自相机的图像
- flutter - 使用 Google Signin Flutter 获取 PlatformException(exception, Unknown signInOption, null)
- javascript - 地址的正则表达式
- javascript - 如何在单引号之间添加两个变量
- javascript - 如何使用 Angular 将页面推送到 Ionic 中的 ion-nav 元素?
- c - 合并txt文件中的字符串
- android - 无视差或视差较小的重叠滚动