

# 通过 RDS Proxy 连接到数据库
<a name="rds-proxy-connecting"></a>

通过代理或通过连接到数据库来连接到 RDS 数据库实例的方式通常是相同的。有关更多信息，请参阅 [代理终端节点概述](rds-proxy-endpoints.md#rds-proxy-endpoints-overview)。

**Topics**
+ [使用数据库凭证连接到数据库](#rds-proxy-connecting-native)
+ [使用 IAM 身份验证连接到数据库](#rds-proxy-connecting-iam)
+ [连接到 Microsoft SQL Server 的注意事项](#rds-proxy-connecting-sqlserver)
+ [连接到 PostgreSQL 的注意事项](#rds-proxy-connecting-postgresql)

## 使用数据库凭证连接到数据库
<a name="rds-proxy-connecting-native"></a>

 执行以下步骤，使用数据库凭证连接到代理：

1.  查找代理端点。在 AWS 管理控制台 中，您可以在相应代理的详细信息页面上找到端点。通过 AWS CLI，您可以使用 [describe-db-proxies](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxies.html) 命令。下面的示例演示如何操作。

   ```
   # Add --output text to get output as a simple tab-separated list.
   $ aws rds describe-db-proxies --query '*[*].{DBProxyName:DBProxyName,Endpoint:Endpoint}'
   [
       [
           {
               "Endpoint": "the-proxy.proxy-demo.us-east-1.rds.amazonaws.com",
               "DBProxyName": "the-proxy"
           },
           {
               "Endpoint": "the-proxy-other-secret.proxy-demo.us-east-1.rds.amazonaws.com",
               "DBProxyName": "the-proxy-other-secret"
           },
           {
               "Endpoint": "the-proxy-rds-secret.proxy-demo.us-east-1.rds.amazonaws.com",
               "DBProxyName": "the-proxy-rds-secret"
           },
           {
               "Endpoint": "the-proxy-t3.proxy-demo.us-east-1.rds.amazonaws.com",
               "DBProxyName": "the-proxy-t3"
           }
       ]
   ]
   ```

1.  在客户端应用程序的连接字符串中指定该端点作为主机参数。例如，指定代理端点作为 `mysql -h` 选项或 `psql -h` 选项的值。

1.  提供您通常使用的相同数据库用户名和密码。

## 使用 IAM 身份验证连接到数据库
<a name="rds-proxy-connecting-iam"></a>

 在对 RDS 代理使用 IAM 身份验证时，客户端与代理之间的身份验证有两种选择：
+ 将数据库用户设置为使用常规用户名和密码进行身份验证。RDS 代理从 Secrets Manager 中检索用户名和密码凭证。从RDS 代理至底层数据库的连接不经由 IAM。
+ 还可以使用端到端 IAM 身份验证，通过代理使用 IAM 连接到数据库，而无需提供数据库凭证。

 要使用 IAM 身份验证连接到 RDS 代理，请使用与对 RDS 数据库实例使用 IAM 身份验证相同的常规连接过程。有关使用 IAM 的一般信息，请参阅[Amazon RDS 中的安全性](UsingWithRDS.md)。如果使用端到端 IAM 身份验证，请向您的数据库用户提供 IAM 身份验证插件。请参阅[使用 IAM 身份验证创建数据库账户](UsingWithRDS.IAMDBAuth.DBAccounts.md)。

 RDS Proxy 在 IAM 用法方面的主要区别包括：
+ 使用标准 IAM 身份验证时，数据库用户在数据库中拥有常规凭证。您可以设置包含这些用户名和密码的 Secrets Manager 密钥，并授权 RDS Proxy 从 Secrets Manager 中检索凭证。IAM 身份验证应用于您的客户端程序与代理之间的连接。然后，代理使用从 Secrets Manager 中检索的用户名和密码凭证对数据库进行身份验证。
+ 使用端到端 IAM 身份验证时，无需为数据库凭证配置 Secrets Manager 密钥。IAM 身份验证适用于客户端与代理及代理与数据库之间的连接。
+ 指定代理端点，而不是实例、集群或读取器端点。有关代理端点的详细信息，请参阅 [使用 IAM 身份验证连接到数据库实例](UsingWithRDS.IAMDBAuth.Connecting.md)。
+ 当使用 IAM 身份验证连接到代理时，确保您使用传输层安全性 (TLS)/安全套接字层 (SSL)。

您可以通过修改 IAM 策略授予特定用户对代理的访问权限。下面是一个示例。

```
"Resource": "arn:aws:rds-db:us-east-2:1234567890:dbuser:prx-ABCDEFGHIJKL01234/db_user"
```

**提示**  
为 RDS 代理连接配置 IAM 身份验证时，请遵循以下重要准则以避免连接问题：  
在为同一数据库用户或角色维护常规密码身份验证时，请勿授予 `rds_iam` 角色。
请记住，当客户端使用 IAM 身份验证连接到 RDS 代理时，RDS 代理始终通过 Secrets Manager 使用密码身份验证连接到数据库。
如果您经常遇到连接终止和重新连接的情况，请撤销用户或角色的所有现有 `rds_iam` 授权，仅使用密码身份验证。
确保您的密码策略符合 SCRAM-SHA-256 安全字符要求。
对同一个数据库用户混用 IAM 和密码身份验证方法可能会导致连接不稳定。

## 连接到 Microsoft SQL Server 的注意事项
<a name="rds-proxy-connecting-sqlserver"></a>

要使用 IAM 身份验证连接到代理，请勿使用密码字段。相反，您可以在令牌字段中为每种类型的数据库驱动程序提供相应的令牌属性。例如，对 JDBC 使用 `accessToken` 属性，或对 ODBC 使用 `sql_copt_ss_access_token` 属性。或者对于 .NET SqlClient 驱动程序使用 `AccessToken` 属性。您不能对不支持令牌属性的客户端使用 IAM 身份验证。

在某些情况下，代理无法共享数据库连接，而是将从客户端应用程序到代理的连接固定到专用的数据库连接。有关这些条件的更多信息，请参阅 [避免固定 RDS 代理](rds-proxy-pinning.md)。

## 连接到 PostgreSQL 的注意事项
<a name="rds-proxy-connecting-postgresql"></a>

如果您创建新的 PostgreSQL 数据库用户来连接到 RDS 代理，请确保授予该用户对数据库的 `CONNECT` 权限。否则，用户将无法建立连接。有关更多信息，请参阅 [使用 RDS 代理时向 PostgreSQL 数据库添加新数据库用户](rds-proxy-new-db-user.md#rds-proxy-new-db-user-pg)。

当客户端启动到 PostgreSQL 数据库的连接时，它会发送一条启动消息。此消息包含参数名称/值字符串对。有关详细信息，请参阅 PostgreSQL 文档中的 [PostgreSQL 消息格式](https://www.postgresql.org/docs/current/protocol-message-formats.html)中的 `StartupMessage`。

当您通过 RDS 代理进行连接时，启动消息可以包含以下当前识别的参数：
+  `user` 
+  `database`

 启动消息还可以包含以下其他运行时参数：
+ `[application\$1name](https://www.postgresql.org/docs/current/runtime-config-logging.html#GUC-APPLICATION-NAME) `
+ `[client\$1encoding](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-CLIENT-ENCODING) `
+ `[DateStyle](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-DATESTYLE) `
+ `[TimeZone](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-TIMEZONE) `
+  `[extra\$1float\$1digits](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-EXTRA-FLOAT-DIGITS) `
+  `[ search\$1path ](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-SEARCH-PATH)` 

 有关 PostgreSQL 消息收发的更多信息，请参阅 PostgreSQL 文档中的[前端/后端协议](https://www.postgresql.org/docs/current/protocol.html)。

 对于 PostgreSQL，如果您使用 JDBC，我们建议您执行以下操作以避免固定：
+ 将 JDBC 连接参数 `assumeMinServerVersion` 至少设置为 `9.0` 以避免固定。这可阻止 JDBC 驱动程序在运行 `SET extra_float_digits = 3` 时，在连接启动期间执行额外的往返行程。
+ 将 JDBC 连接参数 `ApplicationName` 设置为 `any/your-application-name` 以避免固定。这样做会阻止 JDBC 驱动程序在运行 `SET application_name = "PostgreSQL JDBC Driver"` 时，在连接启动期间执行额外的往返行程。请注意，JDBC 参数为 `ApplicationName`，但 PostgreSQL `StartupMessage` 参数为 `application_name`。

有关更多信息，请参阅 [避免固定 RDS 代理](rds-proxy-pinning.md)。有关使用 JDBC 进行连接的更多信息，请参阅 PostgreSQL 文档中的[连接到数据库](https://jdbc.postgresql.org/documentation/setup/)。