

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 JDBC 搭配 AWS Secrets Manager 秘密中的登入資料連線至 SQL 資料庫
<a name="retrieving-secrets_jdbc"></a>

在 Java 應用程式中，您可以使用 Secrets Manager SQL Connection 驅動程式，使用存放在 Secrets Manager 中的登入資料連線至 MySQL、PostgreSQL、Oracle、MSSQLServer、Db2 和 Redshift 資料庫。每個驅動程式都會包裝基本 JDBC 驅動程式，因此您可以使用 JDBC 呼叫來存取資料庫。但是，並非傳遞用於連線的使用者名稱和密碼，而是提供機密的 ID。該驅動程式調用機密管理員擷取機密值，然後使用機密中的憑證連線至資料庫。驅動程式還使用 [Java 用戶端快取庫](retrieving-secrets_cache-java.md)快取憑證，因此未來的連線不需要呼叫 Secrets Manager。預設快取每小時重新整理一次機密，並在輪換機密時重新整理一次。若要設定快取，請參閱 [SecretCacheConfiguration](retrieving-secrets_cache-java-ref_SecretCacheConfiguration.md)。

您可以從 [GitHub](https://github.com/aws/aws-secretsmanager-jdbc ) 下載開放原始碼。

使用機密管理員 SQL 連線驅動程式：
+ 您的應用程式必須使用 Java 8 或更高版本。
+ 您的機密必須為下列之一：
  + [預期 JSON 結構中的資料庫機密](reference_secret_json_structure.md)。若要查看該格式，請在機密管理員控制台中檢視您的機密，然後選擇 **Retrieve secret value** (擷取機密值)。或者，在 中 AWS CLI呼叫 [get-secret-value](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/get-secret-value.html)。
  + Amazon RDS [受管機密](integrating_how-services-use-secrets_RDS.md)。對於此類型的機密，您必須在建立連線時指定端點和連接埠。
  + Amazon Redshift [受管秘密](integrating_how-services-use-secrets_RS.md)。對於此類型的機密，您必須在建立連線時指定端點和連接埠。

如果要將您的資料庫複製到其他區域，以連線到另一個區域中的複副本資料庫，請在建立連線時指定區域端點和端口。您可以將區域連線資訊作為額外的金鑰/值對、SSM 參數儲存參數或程式碼設定中儲存至機密中。

若要將驅動程式新增至您的專案中，請在 Maven 建置檔案 `pom.xml` 中，為驅動程式新增以下相依性。如需詳細資訊，請參閱 Maven Central Repository 網站上的 [Secrets Manager SQL 連線庫](https://search.maven.org/artifact/com.amazonaws.secretsmanager/aws-secretsmanager-jdbc)。

```
<dependency>
    <groupId>com.amazonaws.secretsmanager</groupId>
    <artifactId>aws-secretsmanager-jdbc</artifactId>
    <version>1.0.12</version>
</dependency>
```

此驅動程式使用[https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/credentials.html](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/credentials.html)。如果您在 Amazon EKS 上執行驅動程式，則其可能會取得正在執行之節點的憑證，而不是服務帳戶角色。為瞭解決此問題，請將 `com.amazonaws:aws-java-sdk-sts` 的版本 1 新增至 Gradle 或 Maven 專案檔案作為相依性。

若要在 `secretsmanager.properties` 檔案中設定 AWS PrivateLink DNS 端點 URL 和區域：

```
drivers.vpcEndpointUrl = endpoint URL
drivers.vpcEndpointRegion = endpoint region
```

若要覆寫主要區域，請設定 `AWS_SECRET_JDBC_REGION` 環境變數或對 `secretsmanager.properties` 檔案進行下列變更：

```
drivers.region = region
```

**必要許可：**
+ `secretsmanager:DescribeSecret`
+ `secretsmanager:GetSecretValue`

如需詳細資訊，請參閱[許可參考](auth-and-access.md#reference_iam-permissions)。

**Topics**
+ [建立與資料庫的連線](#retrieving-secrets_jdbc_example)
+ [透過指定端點和連接埠來建立連線](#retrieving-secrets_jdbc_example_replica)
+ [使用 c3p0 連線集區建立連線](#retrieving-secrets_jdbc_example_c3po)
+ [使用 c3p0 連線集區透過指定端點和連接埠來建立連線](#retrieving-secrets_jdbc_example_c3p0_replica)

## 建立與資料庫的連線
<a name="retrieving-secrets_jdbc_example"></a>

以下範例顯示如何使用機密中的憑證和連線資訊建立與資料庫的連線。連線後，您就可使用 JDBC 呼叫來存取資料庫。如需詳細資訊，請參閱 Java 文件網站上的 [JDBC 基礎知識](https://docs.oracle.com/javase/tutorial/jdbc/basics/index.html)。

------
#### [ MySQL ]

```
// Load the JDBC driver
Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver" ).newInstance();

// Retrieve the connection info from the secret using the secret ARN
String URL = "secretId";

// Populate the user property with the secret ARN to retrieve user and password from the secret
Properties info = new Properties( );
info.put( "user", "secretId" );

// Establish the connection
conn = DriverManager.getConnection(URL, info);
```

------
#### [ PostgreSQL ]

```
// Load the JDBC driver
Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerPostgreSQLDriver" ).newInstance();

// Retrieve the connection info from the secret using the secret ARN
String URL = "secretId";

// Populate the user property with the secret ARN to retrieve user and password from the secret
Properties info = new Properties( );
info.put( "user", "secretId" );

// Establish the connection
conn = DriverManager.getConnection(URL, info);
```

------
#### [ Oracle ]

```
// Load the JDBC driver
Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerOracleDriver" ).newInstance();

// Retrieve the connection info from the secret using the secret ARN
String URL = "secretId";

// Populate the user property with the secret ARN to retrieve user and password from the secret
Properties info = new Properties( );
info.put( "user", "secretId" );

// Establish the connection
conn = DriverManager.getConnection(URL, info);
```

------
#### [ MSSQLServer ]

```
// Load the JDBC driver
Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerMSSQLServerDriver" ).newInstance();

// Retrieve the connection info from the secret using the secret ARN
String URL = "secretId";

// Populate the user property with the secret ARN to retrieve user and password from the secret
Properties info = new Properties( );
info.put( "user", "secretId" );

// Establish the connection
conn = DriverManager.getConnection(URL, info);
```

------
#### [ Db2 ]

```
// Load the JDBC driver
Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerDb2Driver" ).newInstance();

// Retrieve the connection info from the secret using the secret ARN
String URL = "secretId";

// Populate the user property with the secret ARN to retrieve user and password from the secret
Properties info = new Properties( );
info.put( "user", "secretId" );

// Establish the connection
conn = DriverManager.getConnection(URL, info);
```

------
#### [ Redshift ]

```
// Load the JDBC driver
Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerRedshiftDriver" ).newInstance();

// Retrieve the connection info from the secret using the secret ARN
String URL = "secretId";

// Populate the user property with the secret ARN to retrieve user and password from the secret
Properties info = new Properties( );
info.put( "user", "secretId" );

// Establish the connection
conn = DriverManager.getConnection(URL, info);
```

------

## 透過指定端點和連接埠來建立連線
<a name="retrieving-secrets_jdbc_example_replica"></a>

下列範例顯示如何使用機密中的憑證與您指定的端點和連接埠建立資料庫的連線。

[Amazon RDS 受管機密](integrating_how-services-use-secrets_RDS.md)不包括資料庫的端點和連接埠。若要使用 Amazon RDS 管理之機密中的主要憑證連線至資料庫，請在程式碼中指定這些憑證。

[複製到其他區域的機密](replicate-secrets.md)可以改善區域資料庫連線的延遲，但其不包含與來源機密不同的連線資訊。每個複本都是來源機密的副本。若要在機密中儲存區域連線資訊，請為區域的端點和端口資訊新增更多金鑰/值對。

連線後，您就可使用 JDBC 呼叫來存取資料庫。如需詳細資訊，請參閱 Java 文件網站上的 [JDBC 基礎知識](https://docs.oracle.com/javase/tutorial/jdbc/basics/index.html)。

------
#### [ MySQL ]

```
// Load the JDBC driver
Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver" ).newInstance();

// Set the endpoint and port. You can also retrieve it from a key/value pair in the secret.
String URL = "jdbc-secretsmanager:mysql://example.com:3306";

// Populate the user property with the secret ARN to retrieve user and password from the secret
Properties info = new Properties( );
info.put( "user", "secretId" );

// Establish the connection
conn = DriverManager.getConnection(URL, info);
```

------
#### [ PostgreSQL ]

```
// Load the JDBC driver
Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerPostgreSQLDriver" ).newInstance();

// Set the endpoint and port. You can also retrieve it from a key/value pair in the secret.
String URL = "jdbc-secretsmanager:postgresql://example.com:5432/database";

// Populate the user property with the secret ARN to retrieve user and password from the secret
Properties info = new Properties( );
info.put( "user", "secretId" );

// Establish the connection
conn = DriverManager.getConnection(URL, info);
```

------
#### [ Oracle ]

```
// Load the JDBC driver
Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerOracleDriver" ).newInstance();

// Set the endpoint and port. You can also retrieve it from a key/value pair in the secret.
String URL = "jdbc-secretsmanager:oracle:thin:@example.com:1521/ORCL";

// Populate the user property with the secret ARN to retrieve user and password from the secret
Properties info = new Properties( );
info.put( "user", "secretId" );

// Establish the connection
conn = DriverManager.getConnection(URL, info);
```

------
#### [ MSSQLServer ]

```
// Load the JDBC driver
Class.forName( "com.amazonaws.secretsmanager.sql.AWSSecretsManagerMSSQLServerDriver" ).newInstance();

// Set the endpoint and port. You can also retrieve it from a key/value pair in the secret.
String URL = "jdbc-secretsmanager:sqlserver://example.com:1433";

// Populate the user property with the secret ARN to retrieve user and password from the secret
Properties info = new Properties( );
info.put( "user", "secretId" );

// Establish the connection
conn = DriverManager.getConnection(URL, info);
```

------
#### [ Db2 ]

```
// Load the JDBC driver
Class.forName( "com.amazonaws.com.rproxy.goskope.com.amazonaws.secretsmanager.sql.AWSSecretsManagerDb2Driver" ).newInstance();

// Set the endpoint and port. You can also retrieve it from a key/value pair in the secret.
String URL = "jdbc-secretsmanager:db2://example.com:50000";

// Populate the user property with the secret ARN to retrieve user and password from the secret
Properties info = new Properties( );
info.put( "user", "secretId" );

// Establish the connection
conn = DriverManager.getConnection(URL, info);
```

------
#### [ Redshift ]

```
// Load the JDBC driver
Class.forName( "com.amazonaws.com.rproxy.goskope.com.amazonaws.secretsmanager.sql.AWSSecretsManagerRedshiftDriver" ).newInstance();

// Set the endpoint and port. You can also retrieve it from a key/value pair in the secret.
String URL = "jdbc-secretsmanager:redshift://example.com:5439";

// Populate the user property with the secret ARN to retrieve user and password from the secret
Properties info = new Properties( );
info.put( "user", "secretId" );

// Establish the connection
conn = DriverManager.getConnection(URL, info);
```

------

## 使用 c3p0 連線集區建立連線
<a name="retrieving-secrets_jdbc_example_c3po"></a>

下列範例顯示如何使用 `c3p0.properties` 檔案建立連線集區，此檔案使用驅動程式透過機密擷取憑證和連線資訊。對於 `user` 和 `jdbcUrl`，輸入機密 ID 以設定連線集區。然後，您可以從集區中擷取連線並將其用作任何其他資料庫連線。如需詳細資訊，請參閱 Java 文件網站上的 [JDBC 基礎知識](https://docs.oracle.com/javase/tutorial/jdbc/basics/index.html)。

如需 c3p0 的詳細資訊，請參閱 Machinery For Change 網站上的 [c3p0](https://www.mchange.com/projects/c3p0/)。

------
#### [ MySQL ]

```
c3p0.user=secretId
c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver
c3p0.jdbcUrl=secretId
```

------
#### [ PostgreSQL ]

```
c3p0.user=secretId
c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerPostgreSQLDriver
c3p0.jdbcUrl=secretId
```

------
#### [ Oracle ]

```
c3p0.user=secretId
c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerOracleDriver
c3p0.jdbcUrl=secretId
```

------
#### [ MSSQLServer ]

```
c3p0.user=secretId
c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerMSSQLServerDriver
c3p0.jdbcUrl=secretId
```

------
#### [ Db2 ]

```
c3p0.user=secretId
c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerDb2Driver
c3p0.jdbcUrl=secretId
```

------
#### [ Redshift ]

```
c3p0.user=secretId
c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerRedshiftDriver
c3p0.jdbcUrl=secretId
```

------

## 使用 c3p0 連線集區透過指定端點和連接埠來建立連線
<a name="retrieving-secrets_jdbc_example_c3p0_replica"></a>

下列範例說明如何使用 檔案建立連線集區，該`c3p0.properties`檔案使用 驅動程式，以您指定的端點和連接埠擷取秘密中的登入資料。然後，您可以從集區中擷取連線並將其用作任何其他資料庫連線。如需詳細資訊，請參閱 Java 文件網站上的 [JDBC 基礎知識](https://docs.oracle.com/javase/tutorial/jdbc/basics/index.html)。

[Amazon RDS 受管機密](integrating_how-services-use-secrets_RDS.md)不包括資料庫的端點和連接埠。若要使用 Amazon RDS 管理之機密中的主要憑證連線至資料庫，請在程式碼中指定這些憑證。

[複製到其他區域的機密](replicate-secrets.md)可以改善區域資料庫連線的延遲，但其不包含與來源機密不同的連線資訊。每個複本都是來源機密的副本。若要在機密中儲存區域連線資訊，請為區域的端點和端口資訊新增更多金鑰/值對。

------
#### [ MySQL ]

```
c3p0.user=secretId
c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver
c3p0.jdbcUrl=jdbc-secretsmanager:mysql://example.com:3306
```

------
#### [ PostgreSQL ]

```
c3p0.user=secretId
c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerPostgreSQLDriver
c3p0.jdbcUrl=jdbc-secretsmanager:postgresql://example.com:5432/database
```

------
#### [ Oracle ]

```
c3p0.user=secretId
c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerOracleDriver
c3p0.jdbcUrl=jdbc-secretsmanager:oracle:thin:@example.com:1521/ORCL
```

------
#### [ MSSQLServer ]

```
c3p0.user=secretId
c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerMSSQLServerDriver
c3p0.jdbcUrl=jdbc-secretsmanager:sqlserver://example.com:1433
```

------
#### [ Db2 ]

```
c3p0.user=secretId
c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerDb2Driver
c3p0.jdbcUrl=jdbc-secretsmanager:db2://example.com:50000
```

------
#### [ Redshift ]

```
c3p0.user=secretId
c3p0.driverClass=com.amazonaws.secretsmanager.sql.AWSSecretsManagerRedshiftDriver
c3p0.jdbcUrl=jdbc-secretsmanager:redshift://example.com:5439
```

------