

# Amazon RDS 代理
<a name="rds-proxy"></a>

通过使用 Amazon RDS 代理，您可以允许您的应用程序池化和共享数据库连接，以提高其扩展能力。RDS 代理通过在保留应用程序连接的同时自动连接到备用数据库实例，使应用程序能够更好地抵御数据库故障。通过使用 RDS 代理，您可以对连接到代理的客户端强制执行 AWS Identity and Access Management（IAM）身份验证，代理可以使用 IAM 数据库身份验证或存储在 AWS Secrets Manager 中的凭证连接到数据库。

![\[关于应用程序如何连接到 RDS 代理的概述\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Proxy-Overview.png)


 使用 RDS 代理，您可以处理不可预测的数据库流量突增。否则，这些突增情况可能会由于超额订阅连接或快速创建新连接而导致问题。RDS 代理建立数据库连接池，并重用该池中的连接。这种方法可避免每次打开新数据库连接所产生的内存和 CPU 开销。要防止数据库超额订阅，您可以控制创建的数据库连接数。

 RDS 代理对无法立即从连接池提供服务的应用程序连接进行排队或限制。尽管延迟可能会增加，但您的应用程序可以继续扩展，而不会导致数据库突然出现故障或不堪重负。如果连接请求超出您指定的限制，则 RDS 代理会拒绝应用程序连接（即，减轻负载）。与此同时，它为 RDS 可通过可用容量提供服务的负载维护可预测的性能。

![\[关于应用程序如何连接到 RDS 代理以及所涉及的连接类型的详细概述。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/Proxy-detail.png)


 您可以减少处理凭证的开销，并为每个新连接建立安全连接。RDS 代理可以代表数据库处理其中的一些工作。

 RDS 代理与它支持的引擎版本完全兼容。您可以在不更改代码的情况下为大多数应用程序启用 RDS 代理。

**Topics**
+ [区域和版本可用性](#rds-proxy.RegionVersionAvailability)
+ [RDS 代理的配额和限制](#rds-proxy.limitations)
+ [规划在哪里使用 RDS Proxy](rds-proxy-planning.md)
+ [RDS 代理概念和术语](rds-proxy.howitworks.md)
+ [开始使用 RDS 代理](rds-proxy-setup.md)
+ [管理 RDS 代理](rds-proxy-managing.md)
+ [使用 Amazon RDS Proxy 终端节点](rds-proxy-endpoints.md)
+ [使用 Amazon CloudWatch 监控 RDS Proxy 指标](rds-proxy.monitoring.md)
+ [使用 RDS 代理事件](rds-proxy.events.md)
+ [RDS 代理故障排除](rds-proxy.troubleshooting.md)
+ [将 RDS Proxy 与 AWS CloudFormation 一起使用](rds-proxy-cfn.md)

## 区域和版本可用性
<a name="rds-proxy.RegionVersionAvailability"></a>

功能可用性和支持因每个数据库引擎的特定版本以及 AWS 区域而异。有关使用 RDS 代理的 Amazon RDS 的版本和区域可用性的更多信息，请参阅 [支持 Amazon RDS 代理的区域和数据库引擎](Concepts.RDS_Fea_Regions_DB-eng.Feature.RDSProxy.md)。

## RDS 代理的配额和限制
<a name="rds-proxy.limitations"></a>

 以下配额和限制适用于 RDS 代理：
+  每个 AWS 账户 ID 限制为 20 个代理。如果您的应用程序需要更多代理，请通过 AWS 管理控制台中的**服务配额**页面申请增加代理。在**服务配额**页面中，选择 **Amazon Relational Database Service（Amazon RDS）**，然后找到**代理**以申请增加配额。AWS 可以自动增加您的配额，或者等待 支持 审核您的申请。
+ 每个代理最多可以关联 200 个 Secrets Manager 密钥，因此在使用密钥时，连接数量最多限制为 200 个不同的用户账户。
+  每个代理都有一个默认端点，该端点仅在从代理的已配置子网中选择的两个可用区中进行预调配。如果配置了两个以上可用区中的子网，则将选择任意两个可用区。
+  可以为每个代理添加最多 20 个额外的代理端点。这些额外的端点将在其创建期间指定的所有可用区中进行预调配。您可以创建、查看、修改和删除这些端点。
+ 对于复制配置中的 RDS 数据库实例，您只能将代理与写入器数据库实例关联，而不能与只读副本关联。
+ 您的 RDS 代理必须与数据库位于同一 Virtual Private Cloud (VPC) 中。代理无法公开访问，但数据库可以。例如，如果在本地主机上进行数据库原型设计，则无法连接到代理，除非设置必要的网络要求来允许连接到代理。这是因为您的本地主机不在代理的 VPC 范围内。
+  您不能将 RDS 代理用于其租户设置为 `dedicated` 的 VPC。
+  如果 VPC 具有启用了 `Enforce Mode` 的加密控制，则您不能在其中使用 RDS 代理。
+ 对于 IPv6 端点网络类型，请将您的 VPC 和子网配置为仅支持 IPv6。对于 IPv4 和 IPv6 目标连接网络类型，请将您的 VPC 和子网配置为支持双栈模式。
+ 如果您将 RDS 代理与启用了 IAM 身份验证的 RDS 数据库实例结合使用，则代理可使用 IAM 身份验证或存储在 Secrets Manager 中的凭证连接到数据库。连接到代理的客户端必须使用 IAM 凭证进行身份验证。有关详细的配置说明，请参阅[设置 RDS 代理的数据库凭证](rds-proxy-secrets-arns.md)和[为 RDS 代理配置 IAM 身份验证](rds-proxy-iam-setup.md)
+  使用 SSL 主机名验证时，不能将 RDS 代理与自定义 DNS 一起使用。
+  每个代理都可以与单个目标数据库实例相关联。不过，您可以将多个代理与同一个数据库实例关联。
+ 文本大小大于 16 KB 的任何语句都会导致代理将会话固定到当前连接。
+ 某些区域在创建代理时需要考虑可用区（AZ）限制。美国东部（弗吉尼亚州北部）区域在 `use1-az3` 可用区中不支持 RDS 代理。美国西部（加利福尼亚北部）区域在 `usw1-az2` 可用区中不支持 RDS 代理。如果在创建代理时选择子网，请确保不要在上述可用区中选择子网。
+ 目前，RDS 代理不支持任何全局条件上下文键。

  有关全局条件上下文键的更多信息，请参阅《IAM 用户指南**》中的 [AWS 全局条件上下文键](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。
+ 不能将 RDS 代理与 RDS Custom for SQL Server 一起使用。
+ 要将任何数据库参数组修改反映到您的代理，需要重启实例，即使您选择立即应用更改也不例外。对于集群级参数，需要在集群范围内重启。
+ 当注册代理目标时，您的代理会自动创建 `rdsproxyadmin` 数据库用户。这是受保护的用户，对于代理功能至关重要。您应该避免以任何身份篡改 `rdsproxyadmin` 用户。删除或修改 `rdsproxyadmin` 用户或其权限可能导致应用程序完全无法使用代理。

有关每个数据库引擎的更多信息，请参阅下面几节：
+ [RDS for MariaDB S 的额外限制](#rds-proxy.limitations-mdb)
+ [RDS for Microsoft SQL Server 的额外限制](#rds-proxy.limitations-ms)
+ [RDS for MySQL 的额外限制](#rds-proxy.limitations-my)
+ [RDS for PostgreSQL 的额外限制](#rds-proxy.limitations-pg)

### RDS for MariaDB S 的额外限制
<a name="rds-proxy.limitations-mdb"></a>

 以下附加限制应用于适用于 RDS for MariaDB 数据库的 RDS 代理：
+  目前，所有代理均在端口 3306 上侦听 MariaDB。代理仍使用您在数据库设置中指定的端口连接到您的数据库。
+ 不能将 RDS 代理与 Amazon EC2 实例中自行管理的 MariaDB 数据库结合使用。
+ 您不能将 RDS 代理与已将数据库参数组中的 `read_only` 参数设置为 `1` 的 RDS for MariaDB 数据库实例一起使用。
+ RDS 代理不支持 MariaDB 压缩模式。例如，它不支持 `mysql` 命令的 `--compress` 或 `-C` 选项使用的压缩。
+ 某些 SQL 语句和函数可以更改连接状态而不会引起固定。有关最新的固定行为，请参阅 [避免固定 RDS 代理](rds-proxy-pinning.md)。
+ RDS 代理不支持 MariaDB `auth_ed25519` 插件。
+ RDS 代理对于 MariaDB 数据库不支持传输层安全性协议（TLS）版本 1.3。
+ 当 RDS 代理重用相同的数据库连接运行其他查询时，处理 `GET DIAGNOSTIC` 命令的数据库连接可能会返回不准确的信息。当 RDS 代理多路复用数据库连接时，可能会发生这种情况。有关更多信息，请参阅 [RDS 代理概念概述](rds-proxy.howitworks.md#rds-proxy-overview)。
+ 对于 MariaDB，RDS 代理目前不支持 `ClientPasswordAuthType` 的 `caching_sha2_password` 选项。

**重要**  
 对于与 MariaDB 数据库关联的代理，请勿在初始化查询中将配置参数 `sql_auto_is_null` 设置为 `true` 或非零值。否则，可能会导致不正确的应用程序行为。

### RDS for Microsoft SQL Server 的额外限制
<a name="rds-proxy.limitations-ms"></a>

 以下附加限制应用于适用于 RDS for Microsoft SQL Server 数据库的 RDS 代理：
+ 您需要为代理创建的 Secrets Manager 密钥数量取决于您的数据库实例使用的排序规则。例如，假设您的数据库实例使用区分大小写的排序规则。如果您的应用程序同时接受“Admin”和“admin”，则代理需要两个单独的密钥。有关 SQL Server 中的排序规则的更多信息，请参阅 [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver16) 文档。
+ RDS 代理不支持使用 Active Directory 的连接。
+ 您不能对不支持令牌属性的客户端使用 IAM 身份验证。有关更多信息，请参阅[连接到 Microsoft SQL Server 的注意事项](rds-proxy-connecting.md#rds-proxy-connecting-sqlserver)。
+ `@@IDENTITY`、`@@ROWCOUNT` 和 `SCOPE_IDENTITY` 的结果并非始终准确。作为一种解决方法，可在同一会话语句中检索它们的值，以确保它们返回正确的信息。
+ 如果连接使用多个活动结果集（MARS），则 RDS 代理不会运行初始化查询。有关 MARS 的更多信息，请参阅 [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/relational-databases/native-client/features/using-multiple-active-result-sets-mars?view=sql-server-ver16) 文档。
+ 目前，RDS 代理不支持在主要版本 *SQL Server 2022* 上运行的 RDS for SQL Server 数据库实例。
+ RDS 代理不支持在 *SQL Server 2014* 主版本上运行的 RDS for SQL Server 数据库实例。
+ RDS 代理不支持无法在一个 TLS 记录中处理多条响应消息的客户端应用程序。
+ RDS 代理不支持适用于 RDS for SQL Server 的端到端 IAM 身份验证。

### RDS for MySQL 的额外限制
<a name="rds-proxy.limitations-my"></a>

 以下附加限制应用于适用于 RDS for MySQL 数据库的 RDS 代理：
+ RDS 代理对 `caching_sha2_password` 身份验证的支持需要安全（TLS）连接。
+ 对 `caching_sha2_password` 的 RDS 代理支持已知与某些 go-sql 驱动程序版本存在兼容性问题。
+ 使用 MySQL 8.4 C 驱动程序时，如果预编译语句中的参数计数超过占位符计数，`mysql_stmt_bind_named_param` API 可能会形成格式错误的数据包。这会导致错误的响应。有关更多信息，请参阅 [MySQL 错误报告](https://bugs.mysql.com/bug.php?id=116860&thanks=4)。
+ 目前，所有代理均在端口 3306 上侦听 MySQL。代理仍使用您在数据库设置中指定的端口连接到您的数据库。
+  不能将 RDS 代理与 EC2 实例中自管理的 MySQL 数据库一起使用。
+  您不能将 RDS 代理与数据库参数组中的 `read_only` 参数设置为 `1` 的 RDS for MySQL 数据库实例一起使用。
+ RDS 代理不支持 MySQL 压缩模式。例如，它不支持 `mysql` 命令的 `--compress` 或 `-C` 选项使用的压缩。
+ 当 RDS 代理重用相同的数据库连接运行其他查询时，处理 `GET DIAGNOSTIC` 命令的数据库连接可能会返回不准确的信息。当 RDS 代理多路复用数据库连接时，可能会发生这种情况。
+ 某些 SQL 语句和函数（如 `SET LOCAL`）可以更改连接状态而不会引起固定。有关最新的固定行为，请参阅 [避免固定 RDS 代理](rds-proxy-pinning.md)。
+ 不支持在多语句查询中使用 `ROW_COUNT()` 函数。
+ RDS 代理不支持无法在一个 TLS 记录中处理多条响应消息的客户端应用程序。
+ RDS 代理不支持 MySQL 双密码。
+ 当您在 RDS 数据库参数组中配置 `init_connect` 参数来设置会话状态变量时，RDS 代理可能无法按预期工作。相反，请将代理的初始化查询设置为在使用代理连接到数据库时运行会话初始化语句。

**重要**  
 对于与 MySQL 数据库关联的代理，请勿在初始化查询中将配置参数 `sql_auto_is_null` 设置为 `true` 或非零值。否则，可能会导致不正确的应用程序行为。

### RDS for PostgreSQL 的额外限制
<a name="rds-proxy.limitations-pg"></a>

 以下附加限制应用于适用于 RDS for PostgreSQL 数据库的 RDS 代理：
+ RDS 代理不支持 PostgreSQL 的会话固定筛选条件。
+  目前，所有代理均在端口 5432 上侦听 PostgreSQL。
+ 对于 PostgreSQL，RDS 代理目前不支持通过发出 `CancelRequest` 来取消来自客户端的查询。例如，使用 Ctrl\$1C 取消交互式 psql 会话中长时间运行的查询时，就会出现这种情况。
+  PostgreSQL 函数 [lastval](https://www.postgresql.org/docs/current/functions-sequence.html) 的结果并不总是准确的。作为解决方法，请将 [INSERT](https://www.postgresql.org/docs/current/sql-insert.html) 语句与 `RETURNING` 子句一起使用。
+ RDS 代理目前不支持流式复制模式。
+ 在 RDS for PostgreSQL 16 中，对 `scram_iterations` 值的修改只会影响代理和数据库之间的身份验证过程。具体而言，如果您将 `ClientPasswordAuthType` 配置为 `scram-sha-256`，则对 `scram_iterations` 值所做的任何自定义都不会影响客户端到代理密码身份验证。相反，客户端到代理密码身份验证的迭代值固定为 4096。
+ 默认 `postgres` 数据库必须存在于 RDS for PostgreSQL 实例上，RDS 代理才能正常运行。即使您的应用程序使用不同的数据库，也不要删除此数据库。
+ 如果您使用 `ALTER ROLE` 通过 `SET ROLE` 更改用户角色，但后续以该用户身份连接到代理时若遇到固定问题，则这些后续连接可能不会使用此角色设置。为防止出现这种情况，在使用代理时，请在代理的初始化查询中使用 `SET ROLE`。有关更多信息，请参阅 [为 Amazon RDS 创建代理](rds-proxy-creating.md)中的**初始化查询**。

**重要**  
对于适用于 PostgreSQL 数据库的现有代理，如果您将数据库身份验证修改为仅使用 `SCRAM`，代理将在长达 60 秒的时间内不可用。要避免此问题，请执行以下操作之一：  
确保数据库同时允许 `SCRAM` 和 `MD5` 身份验证。
要仅使用 `SCRAM` 身份验证，请创建一个新代理，将应用程序流量迁移到新代理，然后删除先前与数据库关联的代理。

# 规划在哪里使用 RDS Proxy
<a name="rds-proxy-planning"></a>

 您可以确定哪些数据库实例、集群和应用程序可能从使用 RDS Proxy 中受益匪浅。为此，请考虑以下因素：
+  任何出现“连接过多”错误的数据库实例都很适合与代理相关联。这通常以 `ConnectionAttempts` CloudWatch 指标的值较高为特征。代理允许应用程序打开许多客户端连接，而代理管理与数据库实例的少量长期连接。
+  对于使用较小 AWS 实例类（如 T2 或 T3）的数据库实例，使用代理可以帮助避免内存不足情况。它还可以帮助减少建立连接时的 CPU 开销。处理大量连接时可能会发生这些情况。
+  您可以监控某些 Amazon CloudWatch 指标，以确定数据库实例是否接近某些类型的限制。这些限制针对连接数以及与连接管理关联的内存。您还可以监控某些 CloudWatch 指标，以确定数据库实例是否正在处理许多短期连接。打开和关闭此类连接可能会给数据库带来性能开销。有关要监控的指标的信息，请参阅 [使用 Amazon CloudWatch 监控 RDS Proxy 指标使用 CloudWatch 监控 RDS Proxy](rds-proxy.monitoring.md)。
+  AWS Lambda 函数也可以很好地使用代理。这些函数进行频繁的短数据库连接，可受益于 RDS Proxy 提供的连接池。您可以利用已为 Lambda 函数提供的任何 IAM 身份验证，而不是在 Lambda 应用程序代码中管理数据库凭证。
+  代理服务器非常适合那些通常需要打开和关闭大量数据库连接，并且没有内置的连接池机制的应用程序。
+  长时间保持大量连接打开的应用程序通常可以很好地使用代理。诸如软件即服务 (SaaS) 或电子商务等行业中的应用程序通常会使连接保持打开状态，从而最大限度地减少数据库请求的延迟。通过 RDS 代理，与直接连接到数据库实例相比，应用程序可以将更多连接保持为打开状态。
+  由于为所有数据库实例设置 IAM 身份验证和 Secrets Manager 较为复杂，因此，您可能尚未采用此类身份验证。代理可以为特定应用程序的客户端连接强制执行身份验证策略。您可以利用已为 Lambda 函数提供的任何 IAM 身份验证，而不是在 Lambda 应用程序代码中管理数据库凭证。
+  RDS 代理可以帮助使应用程序更具弹性，对数据库故障更透明。RDS 代理绕过域名系统（DNS）缓存，以将 Amazon RDS 多可用区数据库实例的故障转移时间缩短多达 66%。RDS 代理还会自动将流量路由到新的数据库实例，同时保留应用程序连接。这使得失效转移对应用程序更加透明。

# RDS 代理概念和术语
<a name="rds-proxy.howitworks"></a>

 您可以通过使用 RDS 代理来简化 Amazon RDS 数据库实例的连接管理。

 RDS 代理处理客户端应用程序和数据库之间的网络流量。为实现这一点，它首先了解数据库协议。然后，它会根据应用程序中的 SQL 操作和数据库中的结果集来调整其行为。

 RDS 代理减少了数据库上的连接管理的内存和 CPU 开销。当应用程序打开多个同时连接时，数据库所需的内存和 CPU 资源较少。而且也不需要应用程序中的逻辑来关闭和重新打开长时间处于空闲状态的连接。同样，在出现数据库问题时，需要较少的应用程序逻辑来重新建立连接。

 RDS 代理的基础设施高度可用，部署在多个可用区 (AZ) 上。RDS 代理的计算、内存和存储独立于您的 RDS 数据库实例。这种分离有助于减少数据库服务器的开销，使它们能够将资源用于处理数据库工作负载。RDS 代理计算资源是无服务器的，根据您的数据库工作负载自动进行扩展。

**Topics**
+ [RDS 代理概念概述](#rds-proxy-overview)
+ [连接池](#rds-proxy-connection-pooling)
+ [RDS 代理安全性](#rds-proxy-security)
+ [失效转移](#rds-proxy-failover)
+ [事务](#rds-proxy-transactions)

## RDS 代理概念概述
<a name="rds-proxy-overview"></a>

 RDS 代理处理基础设施以执行连接池和以下各节中所述的其他功能。您可以在**代理**页面上看到 RDS 控制台中表示的代理。

每个代理处理与单个 RDS 数据库实例的连接。对于 RDS 多可用区实例或集群，代理自动确定当前的写入器实例。

 代理保持打开状态且可供数据库应用程序用于形成*连接池*的连接。

 默认情况下，RDS 代理可在会话中的每个事务之后重用连接。这种事务级别的重用称为*多路复用*。当 RDS 代理临时从连接池中删除某个连接以重用该连接时，该操作称为*借用*连接。如果这样做是安全的，RDS 代理会将该连接返回到连接池。

 在某些情况下，RDS 代理不能确定在当前会话之外重用数据库连接是否安全。在这些情况下，它将会话保持在同一个连接上，直到会话结束。此回退行为称为*固定*。

代理具有默认端点。使用 Amazon RDS 数据库实例时，您将连接到该端点。您可以这样做，而不是连接到与实例直接连接的读/写端点。对于 RDS 数据库集群，您还可以创建其它读/写和只读端点。有关更多信息，请参阅 [代理终端节点概述](rds-proxy-endpoints.md#rds-proxy-endpoints-overview)。

 例如，您仍可连接到集群端点以实现读/写连接，而无需连接池。您仍可连接到读取器端点以实现负载均衡的只读连接。您仍可连接到实例端点，以便对集群中的特定数据库实例进行诊断和故障排除。如果您使用其他 AWS 服务（例如 AWS Lambda）连接到 RDS 数据库，请将其连接设置更改为使用代理端点。例如，指定代理端点，以允许 Lambda 函数在利用 RDS 代理功能的同时访问数据库。

 每个代理都包含一个目标组。该*目标组*包含代理可连接到的 RDS 数据库实例。与代理关联的 RDS 数据库实例称为该代理的*目标*。为方便起见，当您通过控制台创建代理时，RDS 代理也会创建相应的目标组并自动注册关联的目标。

 *引擎系列*是使用相同数据库协议的相关数据库引擎集。您可以为创建的每个代理选择引擎系列。

## 连接池
<a name="rds-proxy-connection-pooling"></a>

每个代理都为其关联的 RDS 数据库 的写入器和读取器实例建立连接池。*连接池* 是一项优化操作，可减少与打开和关闭连接相关的开销，并可保持许多连接同时打开。该开销包括处理每个新连接所需的内存。关闭每个连接并打开一个新连接还涉及 CPU 开销。示例包括传输层安全性协议/安全套接字层（TLS/SSL）握手、身份验证、协商功能等。连接池可简化应用程序逻辑。无需编写应用程序代码，即可最大限度地减少同时打开的连接数量。

 每个代理还执行连接多路复用，也称为连接重用。对于*多路复用*，RDS 代理使用一个底层数据库连接对事务执行所有操作。然后，RDS 可以对下一个事务使用不同的连接。您可以同时打开许多到代理的连接，而代理可确保打开的到数据库实例或集群的连接数量较少。这样做可进一步减少数据库服务器上连接的内存开销。这项技术还降低了出现“连接过多”错误的可能性。

## RDS 代理安全性
<a name="rds-proxy-security"></a>

 RDS 代理使用现有的 RDS 安全机制，如 TLS/SSL 和 AWS Identity and Access Management (IAM)。有关这些安全功能的一般信息，请参阅 [Amazon RDS 中的安全性](UsingWithRDS.md)。此外，请务必熟悉 RDS 如何处理身份验证、授权和其它安全领域。

 RDS 代理可作为客户端应用程序和底层数据库之间的附加安全层。例如，即使底层数据库实例支持旧版 TLS，您也可以使用 TLS 1.3 连接到代理。即使代理使用数据库用户和密码身份验证方法连接到数据库，您也可以使用 IAM 角色连接到代理。通过采用这项技术，您可以对数据库应用程序强制执行强身份验证要求，而无需对数据库实例本身进行成本高昂的迁移。

您可以使用以下方法对 RDS 代理进行身份验证：
+ **数据库凭证**
+ **标准 IAM 身份验证**
+ **端到端 IAM 身份验证**

### 将 IAM 与 RDS 代理结合使用
<a name="rds-proxy-security.IAM"></a>

RDS 代理提供两种 IAM 身份验证方法：
+ **标准 IAM 身份验证**：当代理使用存储在 Secrets Manager 中的凭证连接到数据库时，对与代理的连接强制执行 IAM 身份验证。这会对数据库访问强制执行 IAM 身份验证，即使数据库使用本机密码身份验证。代理从 Secrets Manager 检索数据库凭证，并代表您的应用程序处理对数据库的身份验证。
+ **端到端 IAM 身份验证**：强制通过代理对从应用程序直接到数据库的连接使用 IAM 身份验证。端到端 IAM 身份验证可简化您的安全配置，避免在 Secrets Manager 中管理数据库凭证。这一额外的安全层强制实施了从客户端应用程序到数据库的基于 IAM 的访问控制。

要使用标准 IAM 身份验证，请将您的代理配置为使用 Secrets Manager 密钥进行身份验证，并为客户端连接启用 IAM 身份验证。您的应用程序使用 IAM 对代理进行身份验证，而代理使用从 Secrets Manager 中检索的凭证对数据库进行身份验证。

要使用端到端 IAM 身份验证，请在创建或修改代理时将您的代理配置为在设置默认身份验证方案时使用 IAM 身份验证。

对于端到端 IAM 身份验证，您必须更新与代理关联的 IAM 角色才能授予 `rds-db:connect` 权限。使用端到端 IAM 身份验证时，无需通过 Secrets Manager 密钥向代理注册个别数据库用户。

### 将 TLS/SSL 与 RDS 代理结合使用
<a name="rds-proxy-security.tls"></a>

 您可以使用 TLS/SSL 协议连接到 RDS Proxy。

**注意**  
 RDS 代理使用来自 AWS Certificate Manager (ACM) 的证书。如果您正在使用 RDS Proxy，则无需下载 Amazon RDS 证书或更新使用 RDS 代理连接的应用程序。

要对代理与数据库之间的所有连接强制执行 TLS，您可以在 AWS 管理控制台中创建或修改代理时，指定**需要传输层安全性**设置。

RDS 代理还可以确保您的会话在客户端与 RDS 代理端点之间使用 TLS/SSL。要让 RDS 代理这样做，请在客户端上指定此要求。没有为使用 RDS 代理的数据库 SSL 连接设置 SSL 会话变量。
+  对于 RDS for MySQL，在运行 `mysql` 命令时使用 `--ssl-mode` 参数在客户端上指定此要求。
+  对于 Amazon RDS PostgreSQL，在运行 `psql` 命令时将 `sslmode=require` 指定为 `conninfo` 字符串的一部分。

RDS 代理支持 TLS 协议版本 1.0、1.1、1.2 和 1.3。您可以使用比底层数据库中使用的更高版本的 TLS 连接到代理。

默认情况下，客户端程序会与 RDS 代理建立加密连接，并通过 `--ssl-mode` 选项进行进一步控制。从服务器端，RDS 代理支持所有 SSL 模式。

 对于客户端，SSL 模式如下：

**PREFERRED**  
 SSL 是首选项，但不是必需项。

**DISABLED**  
 不允许使用 SSL。

**REQUIRED**  
 强制 SSL。

**VERIFY\$1CA**  
 强制 SSL 并验证证书颁发机构 (CA)。

**VERIFY\$1IDENTITY**  
 强制 SSL 并验证 CA 和 CA 主机名。

 将客户端与 `--ssl-mode``VERIFY_CA` 或 `VERIFY_IDENTITY` 结合使用时，以 `--ssl-ca` 格式指定指向 CA 的 `.pem` 选项。对于要使用的 `.pem` 文件，请从 [Amazon Trust Services](https://www.amazontrust.com/repository/) 下载所有根 CA PEM，然后把它们放入一个 `.pem` 文件。

 RDS 代理使用通配符证书，这些证书应用到域及其子域。如果您使用 `mysql` 客户端以 SSL 模式 `VERIFY_IDENTITY` 进行连接，则您当前必须使用与 MySQL 8.0 兼容的 `mysql` 命令。

## 失效转移
<a name="rds-proxy-failover"></a>

 *失效转移*是一项高可用性功能，可在原始实例变得不可用时将数据库实例替换为另一个数据库实例。可能会因为数据库实例出现问题而发生失效转移。失效转移也可能是正常维护程序的一部分，例如在数据库升级期间。失效转移适用于多可用区配置中的 RDS 数据库实例。

 通过代理进行连接可使您的应用程序对数据库失效转移更具弹性。当原始数据库实例变得不可用时，RDS 代理将连接到备用数据库，而不删除空闲应用程序连接。这有助于加快和简化失效转移过程。这与典型的重启或数据库问题相比，对应用程序造成的干扰更小。

 如果没有 RDS Proxy，失效转移会导致短暂中断。在中断期间，您无法在失效转移中对该数据库执行写入操作。任何现有数据库连接都会中断，您的应用程序必须重新打开这些连接。当一个只读数据库实例被提升以替代不可用的数据库实例时，数据库将可用于新连接和写入操作。

 在数据库失效转移期间，RDS Proxy 将继续接受相同 IP 地址的连接，并自动将连接定向到新的主数据库实例。通过 RDS 代理连接的客户端不会受到以下情况的影响：
+  失效转移时的域名系统 (DNS) 传播延迟。
+  本地 DNS 缓存。
+  连接超时。
+  不确定哪个数据库实例是当前的写入器。
+  等待来自以前写入器的查询响应，该写入器在未关闭连接的情况下变得不可用。

 对于维护自身连接池的应用程序，完成 RDS Proxy 意味着大多数连接在失效转移或其他中断期间保持活动状态。只有处于事务或 SQL 语句中间的连接才会被取消。RDS 代理会立即接受新连接。当数据库写入器不可用时，RDS 代理将对传入的请求进行排队。

 对于不维护自身连接池的应用程序，RDS 代理提供更快的连接速度和更多的打开连接。它减轻了频繁从数据库重新连接而产生的昂贵开销。这是通过重用 RDS 代理连接池中维护的数据库连接来实现。此方法对于 TLS 连接尤其重要，因为这些连接的设置成本很高。

## 事务
<a name="rds-proxy-transactions"></a>

 单个事务中的所有语句始终使用相同的底层数据库连接。当事务结束时，连接可供另一会话使用。使用事务作为粒度单位会产生以下后果：
+  开启 RDS for MySQL `autocommit` 设置后，每个单独的语句之后都会发生连接重用。
+  相反，关闭 `autocommit` 设置后，您在会话中发出的第一个语句会开始新的事务。例如，假设您输入 `SELECT`、`INSERT`、`UPDATE` 序列和其他数据操作语言（DML）语句。在这种情况下，在您发出 `COMMIT`、`ROLLBACK` 或以其他方式结束事务之前，不会发生连接重用。
+  输入数据定义语言 (DDL) 语句会导致事务在该语句完成后结束。

 RDS 代理通过数据库客户端应用程序使用的网络协议检测事务何时结束。事务检测不依赖于关键字，例如 SQL 语句文本中显示的 `COMMIT` 或 `ROLLBACK`。

 在某些情况下，RDS 代理可能会检测到使得无法将会话移动到其他连接的数据库请求。在这些情况下，它会在会话的剩余时间关闭该连接的多路复用。当 RDS 代理不能确定多路复用是否适用于会话时，这一规则也适用。该操作称为*固定*。有关检测和最小化固定的方法，请参阅 [避免固定 RDS 代理](rds-proxy-pinning.md)。

# 开始使用 RDS 代理
<a name="rds-proxy-setup"></a>

使用以下页面中的信息来设置、管理 [Amazon RDS 代理](rds-proxy.md)以及设置相关的安全选项。这些安全选项控制哪些人可以访问每个代理，以及每个代理如何连接到数据库实例。

如果您不熟悉 RDS 代理，我们建议您按照我们展示页面的顺序进行操作。

**Topics**
+ [设置 RDS 代理的网络先决条件](rds-proxy-network-prereqs.md)
+ [设置 RDS 代理的数据库凭证](rds-proxy-secrets-arns.md)
+ [为 RDS 代理配置 IAM 身份验证](rds-proxy-iam-setup.md)
+ [为 Amazon RDS 创建代理](rds-proxy-creating.md)
+ [查看代理](rds-proxy-viewing.md)
+ [通过 RDS Proxy 连接到数据库](rds-proxy-connecting.md)

# 设置 RDS 代理的网络先决条件
<a name="rds-proxy-network-prereqs"></a>

 使用 RDS 代理需要您在 RDS 数据库实例和 RDS 代理之间拥有通用的虚拟私有云（VPC）。此 VPC 应至少有两个位于不同可用区中的子网。您的账户可以拥有这些子网，或与其他账户共享它们。有关 VPC 共享的信息，请参阅[使用共享 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-sharing.html)。

要支持 IPv6，需要进行额外的网络配置：
+ **IPv6 端点网络类型** - 您的 VPC 和子网必须配置为支持 IPv6。这包括将 IPv6 CIDR 数据块分配给 VPC 和子网。
+ **双栈端点网络类型** – 您的 VPC 和子网必须支持 IPv4 和 IPv6 寻址。
+ **IPv6 目标连接网络类型** – 必须将数据库配置为双栈模式，才能支持来自代理的 IPv6 连接。

您的客户端应用程序资源（例如 Amazon EC2、Lambda 或 Amazon ECS）可以与代理位于同一 VPC 中。它们也可以位于与代理不同的 VPC 中。如果已成功连接到任何 RDS 数据库实例，则您已拥有所需的网络资源。

**Topics**
+ [获取有关您的子网的信息](#rds-proxy-network-prereqs.subnet-info)
+ [计划 IP 地址容量](#rds-proxy-network-prereqs.plan-ip-address)

## 获取有关您的子网的信息
<a name="rds-proxy-network-prereqs.subnet-info"></a>

要创建代理，必须提供代理在其中运行的子网和 VPC。以下 Linux 示例展示了检查 AWS 账户 拥有的 VPC 和子网的 AWS CLI 命令。尤其是，在使用 CLI 创建代理时，您可以将子网 ID 作为参数传递。

```
aws ec2 describe-vpcs
aws ec2 describe-internet-gateways
aws ec2 describe-subnets --query '*[].[VpcId,SubnetId]' --output text | sort
```

以下 Linux 示例展示了用于确定与特定 RDS 数据库实例对应的子网 ID 的 AWS CLI 命令。找到数据库实例的 VPC ID。检查 VPC 以查找其子网。以下 Linux 示例展示了操作步骤。

```
$ #From the DB instance, trace through the DBSubnetGroup and Subnets to find the subnet IDs.
$ aws rds describe-db-instances --db-instance-identifier my_instance_id --query '*[].[DBSubnetGroup]|[0]|[0]|[Subnets]|[0]|[*].SubnetIdentifier' --output text
```

```
subnet_id_1
subnet_id_2
subnet_id_3
...
```

```
$ #From the DB instance, find the VPC.
$ aws rds describe-db-instances --db-instance-identifier my_instance_id --query '*[].[DBSubnetGroup]|[0]|[0].VpcId' --output text
```

```
my_vpc_id
```

```
$ aws ec2 describe-subnets --filters Name=vpc-id,Values=my_vpc_id --query '*[].[SubnetId]' --output text
```

```
subnet_id_1
subnet_id_2
subnet_id_3
subnet_id_4
subnet_id_5
subnet_id_6
```

## 计划 IP 地址容量
<a name="rds-proxy-network-prereqs.plan-ip-address"></a>

RDS 代理会根据向它注册的数据库实例的大小和数量，视需要自动调整其容量。某些操作可能还需要更多代理容量，例如增加注册数据库的大小或内部 RDS 代理维护操作。在这些操作期间，您的代理可能需要更多 IP 地址来预调配额外的容量。这些额外的地址使您的代理可以在不影响工作负载的情况下进行扩展。您的子网中缺少可用的 IP 地址会阻止代理纵向扩展。这可能导致查询延迟更长或客户端连接故障。当您的子网中没有足够的可用 IP 地址时，RDS 会通过事件 `RDS-EVENT-0243` 通知您。有关此事件的信息，请参阅 [使用 RDS 代理事件使用 RDS Proxy 事件](rds-proxy.events.md)。

**注意**  
在 VPC 中，每个 RDS 代理消耗的 IP 地址不会超过 215 个。

根据数据库实例类大小，您应在子网中为代理保留以下最少可用的 IP 地址数。


|  数据库实例类  |  最少可用 IP 地址数  | 
| --- | --- | 
|  db.\$1.xlarge 或更小   |  10  | 
|  db.\$1.2xlarge   |  15  | 
|  db.\$1.4xlarge   |  25  | 
|  db.\$1.8xlarge   |  45  | 
|  db.\$1.12xlarge   |  60  | 
|  db.\$1.16xlarge   |  75  | 
|  db.\$1.24xlarge   |  110  | 

这些建议的 IP 地址数是针对仅具有默认端点的代理的估计数。具有更多端点或只读副本的代理可能需要更多可用的 IP 地址。对于每个其他端点，建议您另外预留三个 IP 地址。对于每个只读副本，建议您根据该只读副本的大小，保留表中指定的额外 IP 地址。

# 设置 RDS 代理的数据库凭证
<a name="rds-proxy-secrets-arns"></a>

Amazon RDS 中的 RDS 代理使用 AWS Secrets Manager 安全地存储和管理数据库凭证。您无需在应用程序中嵌入凭证，而是将代理与包含必要身份验证详细信息的 Secrets Manager 密钥相关联。您可以在 RDS 数据库实例上，为代理连接到的每个数据库用户账户分别创建 Secrets Manager 密钥。

或者，您可以将 RDS 代理配置为使用端到端 IAM 身份验证，这样就无需在 Secrets Manager 中存储数据库凭证。RDS 代理对客户端到代理和代理到数据库的连接都使用 IAM 身份验证。这提供了一个完全集成的基于 IAM 的身份验证解决方案，无需管理密钥或密码。有关添加新 IAM 数据库用户的信息，请参阅[使用 IAM 身份验证创建数据库账户](UsingWithRDS.IAMDBAuth.DBAccounts.md)。

**Topics**
+ [创建与 RDS 代理结合使用的密钥](#rds-proxy-secrets-create)

## 创建与 RDS 代理结合使用的密钥
<a name="rds-proxy-secrets-create"></a>

在创建代理之前，必须先创建至少一个用于存储数据库凭证的密钥。

### 控制台
<a name="rds-proxy-secrets-create-console"></a>

**创建密钥**

1. 通过 [https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/) 打开 Secrets Manager 控制台。

1. 选择**存储新密钥**。

1. 选择 **Amazon RDS 数据库的凭证**。

1. 输入用户名和密码。您输入的凭证必须与关联的 RDS 数据库中存在的数据库用户的凭证相匹配。RDS 代理使用这些凭证代表应用程序对数据库进行身份验证和建立连接。

   如果不匹配，您可以更新密钥来与数据库密码匹配。在更新密钥之前，尝试使用该密钥通过代理进行连接会失败，但使用其它有效密钥的连接仍然有效。
**注意**  
对于 RDS For SQL Server，无论数据库实例排序规则设置如何，RDS 代理都需要在 Secrets Manager 中设置一个区分大小写的密钥。如果应用程序支持用户名使用不同的大小写，例如“Admin”和“admin”，则必须为每个用户名创建单独的密钥。RDS 代理不支持在客户端和代理之间进行不区分大小写的用户名身份验证。  
有关 SQL Server 中的排序规则的更多信息，请参阅 [Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver16) 文档。

1. 对于**数据库**，选择密钥将访问的 Amazon RDS 数据库。

1. 填写密钥的其它设置，然后选择**存储**。有关全面的说明，请参阅《AWS Secrets Manager User Guide》**中的 [Creating an AWS Secrets Manager secret](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)。

### AWS CLI
<a name="rds-proxy-secrets-create-cli"></a>

通过 AWS CLI 创建代理时，请指定相应密钥的 Amazon 资源名称（ARN）。请为代理可以访问的所有数据库用户账户执行此操作。在 AWS 管理控制台 中，根据描述性名称选择密钥。
+ 要创建与 RDS 代理结合使用的 Secrets Manager 密钥，请使用 [create-secret](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/create-secret.html) 命令：

  ```
  aws secretsmanager create-secret \
    --name "secret_name" \
    --description "secret_description" \
    --region region_name \
    --secret-string '{"username":"db_user","password":"db_user_password"}'
  ```
+ 您也可以创建自定义密钥来加密 Secrets Manager 密钥。以下命令创建一个密钥示例。

  ```
  aws kms create-key --description "test-key" --policy '{
    "Id":"kms-policy",
    "Version": "2012-10-17",		 	 	 
    "Statement":
      [
        {
          "Sid":"Enable IAM User Permissions",
          "Effect":"Allow",
          "Principal":{"AWS":"arn:aws:iam::account_id:root"},
          "Action":"kms:*","Resource":"*"
        },
        {
          "Sid":"Allow access for Key Administrators",
          "Effect":"Allow",
          "Principal":
            {
              "AWS":
                ["$USER_ARN","arn:aws:iam:account_id::role/Admin"]
            },
          "Action":
            [
              "kms:Create*",
              "kms:Describe*",
              "kms:Enable*",
              "kms:List*",
              "kms:Put*",
              "kms:Update*",
              "kms:Revoke*",
              "kms:Disable*",
              "kms:Get*",
              "kms:Delete*",
              "kms:TagResource",
              "kms:UntagResource",
              "kms:ScheduleKeyDeletion",
              "kms:CancelKeyDeletion"
            ],
          "Resource":"*"
        },
        {
          "Sid":"Allow use of the key",
          "Effect":"Allow",
          "Principal":{"AWS":"$ROLE_ARN"},
          "Action":["kms:Decrypt","kms:DescribeKey"],
          "Resource":"*"
        }
      ]
  }'
  ```

 例如，以下命令为两个数据库用户创建 Secrets Manager 密钥：

```
aws secretsmanager create-secret \
  --name secret_name_1 --description "db admin user" \
  --secret-string '{"username":"admin","password":"choose_your_own_password"}'

aws secretsmanager create-secret \
  --name secret_name_2 --description "application user" \
  --secret-string '{"username":"app-user","password":"choose_your_own_password"}'
```

要创建使用自定义 AWS KMS 密钥加密的这些密钥，请使用以下命令：

```
aws secretsmanager create-secret \
  --name secret_name_1 --description "db admin user" \
  --secret-string '{"username":"admin","password":"choose_your_own_password"}' \
  --kms-key-id arn:aws:kms:us-east-2:account_id:key/key_id

aws secretsmanager create-secret \
  --name secret_name_2 --description "application user" \
  --secret-string '{"username":"app-user","password":"choose_your_own_password"}' \
  --kms-key-id arn:aws:kms:us-east-2:account_id:key/key_id
```

要查看您的 AWS 账户拥有的密钥，请使用 [list-secrets](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/list-secrets.html) 命令：

```
aws secretsmanager list-secrets
```

使用 CLI 创建代理时，将一个或多个密钥的 Amazon Resource Name (ARN) 传递给了 `--auth` 参数。以下示例展示了如何准备报告，其中仅包含 AWS 账户所拥有的每个密钥的名称和 ARN。此示例使用了 `--output table` 版本 2 中提供的 AWS CLI 参数。如果您使用的是 AWS CLI 版本 1，请改用 `--output text`。

```
aws secretsmanager list-secrets --query '*[].[Name,ARN]' --output table
```

要确认密钥包含格式正确的凭证，请使用 [get-secret-value](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/get-secret-value.html) 命令。将 `your_secret_name` 替换为密钥的短名称或 ARN。

```
aws secretsmanager get-secret-value --secret-id your_secret_name
```

输出包含一行 JSON 编码值，类似于以下内容：

```
...
"SecretString": "{\"username\":\"your_username\",\"password\":\"your_password\"}",
...
```

# 为 RDS 代理配置 IAM 身份验证
<a name="rds-proxy-iam-setup"></a>

要在 Amazon RDS 中为 RDS 代理设置 AWS Identity and Access Management（IAM）身份验证，请创建并配置用于授予必要权限的 IAM 策略。

本主题提供了为 RDS 代理配置 IAM 身份验证的步骤，包括创建所需的 IAM 策略并将其附加到 IAM 角色。

**提示**  
仅当您想创建自己的 IAM 角色时，才需要执行此过程。否则，RDS 可以在您设置代理时自动创建所需的角色，因此您可以跳过这些步骤。

## 先决条件
<a name="rds-proxy-iam-setup-prereqs"></a>

在为 RDS 代理设置 IAM 身份验证之前，请确保您具有以下各项：
+ **AWS Secrets Manager**：至少一个包含数据库凭证的存储密钥。有关创建密钥的说明，请参阅[设置 RDS 代理的数据库凭证](rds-proxy-secrets-arns.md)。

  如果您使用端到端 IAM 身份验证，则不需要这样做。
+ **IAM 权限**：具有在 AWS Secrets Manager 中创建和管理 IAM 策略、角色和密钥的权限的 IAM 角色或用户。

## 创建端到端 IAM 策略
<a name="rds-proxy-iam-setup-e2e-steps"></a>

使用端到端 IAM 身份验证时，RDS 代理使用 IAM 身份验证连接到您的数据库，而不是从 Secrets Manager 检索凭证。这需要为您的 IAM 角色配置您想要与代理一起使用的数据库账户的 `rds-db:connect` 权限。

要使用 IAM 对 RDS 代理进行数据库身份验证，请创建一个 IAM 角色，并附加授予必要数据库连接权限的策略。

### 控制台
<a name="rds-proxy-iam-e2e-console"></a>

**使用代理创建用于端到端 IAM 身份验证的角色**

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 为该角色创建权限策略。有关一般步骤，请参阅[创建 IAM 策略（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)。

   将此策略粘贴到 JSON 编辑器中，并进行以下更改：
   + 替换您自己的账户 ID。
   + 将 `us-east-2` 替换为代理必须位于的区域。
   + 用您想使用的 ID 和用户名替换数据库资源 ID 和用户名。RDS 实例和 Aurora clusters的资源 ID 格式有所不同。

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "rds-db:connect",
               "Resource": [
                   "arn:aws:rds-db:us-east-2:account_id:dbuser:db_instance_resource_id/db_user_name_1",
                   "arn:aws:rds-db:us-east-2:account_id:dbuser:db_instance_resource_id/db_user_name_2"
               ]
           }
       ]
   }
   ```

1. 创建角色并向其附加权限策略。有关一般步骤，请参阅[创建向 AWS 服务委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

   对于**可信实体类型**，选择 **AWS 服务**。在**用例**下，选择 **RDS**，然后为用例选择 **RDS - 向数据库添加角色**。

1. 对于**权限策略**，选择您创建的策略。

1. 对于**选择可信实体**，为该角色输入以下信任策略：

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "",
         "Effect": "Allow",
         "Principal": {
           "Service": "rds.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

### AWS CLI
<a name="rds-proxy-iam-e2e-cli"></a>

要使用 AWS CLI 创建角色，请发送以下请求：

```
aws iam create-role \
  --role-name my_e2e_iam_role_name \

  --assume-role-policy-document '{"Version":"2012-10-17",		 	 	 "Statement":[{"Effect":"Allow","Principal":{"Service":["rds.amazonaws.com"]},"Action":"sts:AssumeRole"}]}'
```

然后，将策略附加到该角色：

```
aws iam put-role-policy \
  --role-name my_e2e_iam_role_name \
  --policy-name e2e_iam_db_connect_policy \
  --policy-document '{

    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "rds-db:connect",
            "Resource": [
                "arn:aws:rds-db:us-east-2:account_id:dbuser:db_instance_resource_id/db_user_name_1",
                "arn:aws:rds-db:us-east-2:account_id:dbuser:db_instance_resource_id/db_user_name_2"
            ]
        }
    ]
}'
```

为端到端 IAM 身份验证配置 IAM 角色和权限后，即可创建 `DefaultAuthScheme` 设置为 `IAM_AUTH` 的代理。此代理使用 IAM 直接对数据库进行身份验证，无需使用 Secrets Manager 密钥。有关说明，请参阅[为 Amazon RDS 创建代理](rds-proxy-creating.md)。

使用端到端 IAM 身份验证时，请确保按照[使用 IAM 身份验证创建数据库账户](UsingWithRDS.IAMDBAuth.DBAccounts.md)中所述为数据库用户配置了 IAM 身份验证。

## 创建用于访问 Secrets Manager 的 IAM 策略
<a name="rds-proxy-iam-setup-steps"></a>

要支持 RDS 代理从 Secrets Manager 检索数据库凭证，请创建一个 IAM 角色，并使用授予必要权限的策略。

## 控制台
<a name="rds-proxy-iam-console"></a>

**创建用于访问您的密钥以便与代理一起使用的角色**

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 为该角色创建权限策略。有关一般步骤，请参阅[创建 IAM 策略（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)。

   将此策略粘贴到 JSON 编辑器中，并进行以下更改：
   + 替换您自己的账户 ID。
   + 将 `us-east-2` 替换为代理所在的区域。
   + 将密钥名称替换为您创建的名称。有关更多信息，请参阅 [Specifying KMS keys in IAM policy statements](https://docs.aws.amazon.com/kms/latest/developerguide/cmks-in-iam-policies.html)。
   + 将 KMS 密钥 ID 替换为您用于加密 Secrets Manager 密钥（默认密钥或您自己的密钥）的密钥 ID。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "secretsmanager:GetSecretValue",
               "Resource": [
                   "arn:aws:secretsmanager:us-east-2:111122223333:secret:secret_name_1",
                   "arn:aws:secretsmanager:us-east-2:111122223333:secret:secret_name_2"
               ]
           },
           {
               "Effect": "Allow",
               "Action": "kms:Decrypt",
               "Resource": "arn:aws:kms:us-east-2:111122223333:key/key_id",
               "Condition": {
                   "StringEquals": {
                       "kms:ViaService": "secretsmanager.us-east-2.amazonaws.com"
                   }
               }
           }
       ]
   }
   ```

------

1. 创建角色并向其附加权限策略。有关一般步骤，请参阅[创建向 AWS 服务委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

   对于**可信实体类型**，选择 **AWS 服务**。在**用例**下，选择 **RDS**，然后为用例选择 **RDS - 向数据库添加角色**。

1. 对于**权限策略**，选择您创建的策略。

1. 对于**选择可信实体**，为该角色输入以下信任策略：

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "",
         "Effect": "Allow",
         "Principal": {
           "Service": "rds.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

------

## AWS CLI
<a name="rds-proxy-iam-cli"></a>

要使用 AWS CLI 创建角色，请发送以下请求：

```
aws iam create-role \
  --role-name my_role_name \
  --assume-role-policy-document '{"Version": "2012-10-17",		 	 	 "Statement":[{"Effect":"Allow","Principal":{"Service":["rds.amazonaws.com"]},"Action":"sts:AssumeRole"}]}'
```

然后，将策略附加到该角色：

```
aws iam put-role-policy \
  --role-name my_role_name \
  --policy-name secret_reader_policy \
  --policy-document '{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": [
                "arn:aws:secretsmanager:us-east-2:account_id:secret:secret_name_1",
                "arn:aws:secretsmanager:us-east-2:account_id:secret:secret_name_2"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "kms:Decrypt",
            "Resource": "arn:aws:kms:us-east-2:account_id:key/key_id",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "secretsmanager.us-east-2.amazonaws.com"
                }
            }
        }
    ]
}'
```

配置了 IAM 角色和权限后，您现在可以创建代理并将其与该角色关联。这可让代理安全地从 AWS Secrets Manager 中检索数据库凭证，并为您的应用程序启用 IAM 身份验证。有关说明，请参阅[为 Amazon RDS 创建代理](rds-proxy-creating.md)。

# 为 Amazon RDS 创建代理
<a name="rds-proxy-creating"></a>

您可以将代理与 RDS for MariaDB、RDS for Microsoft SQL Server、RDS for MySQL 或 RDS for PostgreSQL 数据库实例相关联。

## 控制台
<a name="rds-proxy-creating.console"></a>

**创建代理**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择 **Proxies (代理)**。

1. 选择 **Create proxy (创建代理)**。

1. 为代理配置以下设置。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/rds-proxy-creating.html)

1.  选择 **Create proxy (创建代理)**。

## AWS CLI
<a name="rds-proxy-creating.CLI"></a>

 要使用 AWS CLI 创建代理，请使用以下必需的参数调用 [create-db-proxy](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-proxy.html) 命令：
+ `--db-proxy-name`
+ `--engine-family`
+ `--role-arn`
+ `--vpc-subnet-ids`

`--engine-family` 值区分大小写。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds create-db-proxy \
    --db-proxy-name proxy_name \
    --engine-family { MYSQL | POSTGRESQL | SQLSERVER } \
    --role-arn iam_role \
    --vpc-subnet-ids space_separated_list \
    [--default-auth-scheme { NONE | IAM_AUTH }] \
    [--auth ProxyAuthenticationConfig_JSON_string] \
    [--vpc-security-group-ids space_separated_list] \
    [--require-tls | --no-require-tls] \
    [--idle-client-timeout value] \
    [--debug-logging | --no-debug-logging] \
    [--endpoint-network-type { IPV4 | IPV6 | DUAL }] \
    [--target-connection-network-type { IPV4 | IPV6 }] \
    [--tags comma_separated_list]
```
对于：Windows  

```
aws rds create-db-proxy ^
    --db-proxy-name proxy_name ^
    --engine-family { MYSQL | POSTGRESQL | SQLSERVER } ^
    --role-arn iam_role ^
    --vpc-subnet-ids space_separated_list ^
    [--default-auth-scheme { NONE | IAM_AUTH }] ^
    [--auth ProxyAuthenticationConfig_JSON_string] ^
    [--vpc-security-group-ids space_separated_list] ^
    [--require-tls | --no-require-tls] ^
    [--idle-client-timeout value] ^
    [--debug-logging | --no-debug-logging] ^
    [--endpoint-network-type { IPV4 | IPV6 | DUAL }] ^
    [--target-connection-network-type { IPV4 | IPV6 }] ^
    [--tags comma_separated_list]
```

以下是 `--auth` 选项的 JSON 值的示例。此示例对每个密钥应用不同的客户端身份验证类型。

```
[
  {
    "Description": "proxy description 1",
    "AuthScheme": "SECRETS",
    "SecretArn": "arn:aws:secretsmanager:us-west-2:123456789123:secret/1234abcd-12ab-34cd-56ef-1234567890ab",
    "IAMAuth": "DISABLED",
    "ClientPasswordAuthType": "POSTGRES_SCRAM_SHA_256"
  },
  
  {
    "Description": "proxy description 2",
    "AuthScheme": "SECRETS",
    "SecretArn": "arn:aws:secretsmanager:us-west-2:111122223333:secret/1234abcd-12ab-34cd-56ef-1234567890cd",
    "IAMAuth": "DISABLED",
    "ClientPasswordAuthType": "POSTGRES_MD5"
    
  },
  
  {
    "Description": "proxy description 3",
    "AuthScheme": "SECRETS",
    "SecretArn": "arn:aws:secretsmanager:us-west-2:111122221111:secret/1234abcd-12ab-34cd-56ef-1234567890ef",
    "IAMAuth": "REQUIRED"
  }
  
]
```

`--endpoint-network-type` 参数指定客户端用于连接代理的代理端点的 IP 版本。有效值为：
+ `IPV4` – 代理端点仅使用 IPv4 地址（默认）。
+ `IPV6` – 代理端点仅使用 IPv6 地址。
+ `DUAL` – 代理端点支持 IPv4 和 IPv6 地址。

`--target-connection-network-type` 参数指定代理用于连接到目标数据库的 IP 版本。有效值为：
+ `IPV4` – 代理使用 IPv4 地址连接到数据库（默认）。
+ `IPV6` – 代理使用 IPv6 地址连接到数据库。

要使用 IPv6 或双栈端点网络类型，必须将您的 VPC 和子网配置为支持所选网络类型。要使用 IPv6 目标连接网络类型，您的数据库必须支持双栈模式。

**提示**  
 如果您尚不知道要用于 `--vpc-subnet-ids` 参数的子网 ID，请参阅 [设置 RDS 代理的网络先决条件](rds-proxy-network-prereqs.md) 获取有关如何查找它们的示例。

**注意**  
安全组必须允许访问代理连接到的数据库。同一安全组用于从应用程序到代理的入口以及从代理到数据库的出口。例如，假设您对数据库和代理使用同一安全组。在这种情况下，请确保您指定该安全组中的资源可以与同一安全组中的其他资源进行通信。  
使用共享 VPC 时，您不能使用 VPC 的默认安全组，也不能使用属于其他账户的安全组。选择属于您账户的安全组。如果不存在，请创建一个。有关此限制的详细信息，请参阅[使用共享 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-sharing.html#vpc-share-limitations)。

 要为代理创建正确的关联，您还可以使用 [register-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/register-db-proxy-targets.html) 命令。指定目标组名称 `default`。创建每个代理时，RDS Proxy 会自动创建一个此名称的目标组。

```
aws rds register-db-proxy-targets
    --db-proxy-name value
    [--target-group-name target_group_name]
    [--db-instance-identifiers space_separated_list]  # rds db instances, or
    [--db-cluster-identifiers cluster_id]        # rds db cluster (all instances)
```

## RDS API
<a name="rds-proxy-creating.API"></a>

 要创建 RDS 代理，请调用 Amazon RDS API 操作 [CreateDBProxy](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBProxy.html)。传递具有 [AuthConfig](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_AuthConfig.html) 数据结构的参数。

 创建每个代理时，RDS Proxy 会自动创建一个名为 `default` 的目标组。通过调用函数 [RegisterDBProxyTargets](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RegisterDBProxyTargets.html)，将 RDS 数据库实例与目标组关联。

**重要**  
当您选择 **IAM 身份验证**作为默认身份验证方案时：  
在代理成功连接之前，您必须在目标数据库实例或集群上启用 IAM 数据库身份验证。
如果选择**创建 IAM 角色**，则必须填写**用于 IAM 身份验证的数据库账户**字段。
如果选择现有 IAM 角色，则控制台不会自动更新具有数据库连接权限的角色。请检查该角色是否具有必要的 `rds-db:connect` 权限。

# 查看代理
<a name="rds-proxy-viewing"></a>

 创建一个或多个 RDS 代理后，您可以在 AWS 管理控制台、AWS CLI 或 RDS API 中查看和管理它们。您可以查看其配置详细信息，监控性能，并根据需要确定要修改或删除哪些代理。

要使数据库应用程序能够通过代理路由流量，必须在连接字符串中指定代理端点。

## 控制台
<a name="rds-proxy-viewing.console"></a>

**在控制台中查看代理**

1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择 **Proxies (代理)**。

1. 选择代理名称以查看其详细信息。

1. 在详细信息页面上，**目标组**部分显示了代理与特定 RDS 数据库实例关联的方式。您可以导航到默认目标组页面，以便更深入地查看此关联，包括在创建代理期间定义的配置设置。这些设置包括最大连接百分比、连接借用超时、引擎系列和会话绑定筛选条件。

## CLI
<a name="rds-proxy-viewing.cli"></a>

 要使用 CLI 查看您的代理，请使用 [describe-db-proxies](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxies.html) 命令。默认情况下，该请求会返回由您的 AWS 账户拥有的所有代理。要查看单个代理的详细信息，请通过 `--db-proxy-name` 参数指定其名称。

```
aws rds describe-db-proxies [--db-proxy-name proxy_name]
```

 要查看与代理关联的其它信息，请使用以下命令。

```
aws rds describe-db-proxy-target-groups  --db-proxy-name proxy_name

aws rds describe-db-proxy-targets --db-proxy-name proxy_name
```

 使用以下命令序列查看有关与代理关联的内容的更多详细信息：

1.  要获取代理列表，请运行 [describe-db-proxies](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxies.html)。

1.  要显示连接参数（如代理可以使用的最大连接百分比），请运行 [describe-db-proxy-target-groups](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxy-target-groups.html) `--db-proxy-name`。使用代理的名称作为参数值。

1.  要查看与返回的目标组关联的 RDS 数据库实例的详细信息，请运行 [describe-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxy-targets.html)。

## RDS API
<a name="rds-proxy-viewing.api"></a>

 要使用 RDS API 查看您的代理，请使用 [DescribeDBProxies](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBProxies.html) 操作。该操作将返回 [DBProxy](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DBProxy.html) 数据类型的值。

 要查看代理连接设置的详细信息，请将此返回值中的代理标识符与 [DescribeDBProxyTargetGroups](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBProxyTargetGroups.html) 操作一起使用。该操作将返回 [DBProxyTargetGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DBProxyTargetGroup.html) 数据类型的值。

 要查看与代理关联的 RDS 实例或 Aurora 数据库集群，请使用 [DescribeDBProxyTargets](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBProxyTargets.html) 操作。该操作将返回 [DBProxyTarget](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DBProxyTarget.html) 数据类型的值。

# 通过 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/)。

# 管理 RDS 代理
<a name="rds-proxy-managing"></a>

 本节提供有关如何管理 RDS 代理操作和配置的信息。这些过程可帮助您的应用程序最有效地利用数据库连接，并实现最大程度的连接重用。您越多地利用连接重用，就可以节省越多的 CPU 和内存开销。这进而减少了应用程序的延迟，使数据库能够将更多资源用于处理应用程序请求。

**Topics**
+ [修改 RDS 代理](rds-proxy-modifying-proxy.md)
+ [使用 RDS 代理时添加新数据库用户](rds-proxy-new-db-user.md)
+ [从 RDS 代理的标准 IAM 身份验证迁移至端到端 IAM 身份验证](rds-proxy-iam-migration.md)
+ [RDS 代理连接注意事项](rds-proxy-connections.md)
+ [避免固定 RDS 代理](rds-proxy-pinning.md)
+ [删除 RDS 代理](rds-proxy-deleting.md)

# 修改 RDS 代理
<a name="rds-proxy-modifying-proxy"></a>

 您可以在创建代理后更改与代理关联的特定设置。可通过修改代理本身和/或其关联的目标组来执行此操作。每个代理都有一个关联的目标组。

## AWS 管理控制台
<a name="rds-proxy-modifying-proxy.console"></a>

**重要**  
**客户端身份验证类型**和 **IAM 身份验证**字段中的值适用于与此代理关联的所有 Secrets Manager 密钥。要为每个密钥指定不同的值，请使用 AWS CLI 或改用 API 来修改代理。

**修改代理的设置**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1.  在导航窗格中，选择 **Proxies (代理)**。

1.  在代理列表中，选择要修改其设置的代理或转到其详细信息页面。

1.  对于 **Actions (操作)**，选择 **Modify (修改)**。

1.  输入或选择要修改的属性。您可以指定如下内容：
   +  **代理标识符** – 通过输入新标识符来重命名代理。
   +  **空闲客户端连接超时** - 输入空闲客户端连接超时的时间段。
   +  **IAM 角色** – 更改用于从 Secrets Manager 中检索密钥的 IAM 角色。
**注意**  
如果将**默认身份验证方案**设置为 **IAM 身份验证**，则无法创建新的 IAM 角色。
   +  **Secrets Manager 密钥** - 添加或删除 SSecrets Manager 密钥。这些密钥对应于数据库用户名和密码。
   +  **客户端身份验证类型** - 更改客户端与代理的连接的身份验证类型。
   +  **IAM authentication**（IAM 身份验证）– 要求或禁止对与代理的连接进行 IAM 身份验证。
   +  **默认身份验证方案** - 更改代理用于客户端与代理之间连接以及代理与底层数据库之间连接的默认身份验证方案。
   +  **需要传输层安全性** - 打开或关闭传输层安全性 (TLS) 的要求。
   +  **VPC 安全组** - 添加或删除供代理使用的 VPC 安全组。
   +  **启用增强型日志记录** - 启用或禁用增强型日志记录。

1.  选择**修改**。

如果您找不到要更改的列出设置，请使用以下过程更新代理的目标组。与代理关联的*目标组*控制与物理数据库连接相关的设置。每个代理都有一个名为 `default` 的关联目标组，该目标组与代理一起自动创建。您无法重命名默认目标组。

 您只能从代理详细信息页面修改目标组，而不能从 **Proxies (代理)** 页面上的列表中进行修改。

**修改代理目标组的设置**

1.  在 **Proxies (代理)** 页面上，转到代理的详细信息页面。

1.  对于 **Target groups (目标组)**，选择 `default` 链接。目前，所有代理都有一个名为 `default` 的目标组。

1.  在**默认**目标组的详细信息页面上，选择 **Modify (修改)**。

1.  为您可以修改的属性选择新设置：
   +  **数据库** – 选择不同的 RDS 数据库实例或集群。
   +  **连接池最大连接数** – 调整代理可使用的最大可用连接的百分比。
   +  **会话固定筛选条件** -（可选）选择会话固定筛选条件。这绕过了跨客户端多路复用数据库连接的默认安全措施。目前，PostgreSQL 不支持该设置。唯一的选择是 `EXCLUDE_VARIABLE_SETS`。

     启用此设置可能会导致一个连接的会话变量影响其它连接。如果您的查询依赖于在当前事务之外设置的会话变量值，则可能会导致错误或正确性问题。在确认您的应用程序可以安全地跨客户端连接共享数据库连接之后，请考虑使用此选项。

     可以认为以下模式是安全的：
     + `SET` 语句，其中有效会话变量值没有更改，即没有更改会话变量。
     + 您可以更改会话变量值并在同一个事务中执行一条语句。

     有关更多信息，请参阅 [避免固定 RDS 代理](rds-proxy-pinning.md)。
   +  **连接借用超时** - 调整连接借用超时间隔。当最大连接数已用于代理时，此设置适用。该设置确定在返回超时错误之前代理等待连接可用的时间。
   + **初始化查询**。（可选）添加初始化查询或修改当前查询。您可以为代理指定一个或多个 SQL 语句，以便在打开每个新数据库连接时运行。此设置通常与 `SET` 语句一起使用，以确保每个连接具有完全相同的设置。确保您添加的查询有效。要在单个 `SET` 语句中包含多个变量，请使用逗号分隔符。例如：

     ```
     SET variable1=value1, variable2=value2
     ```

     对于多个语句，请使用分号作为分隔符。

    不能更改某些属性，例如，目标组标识符和数据库引擎。

1.  选择 **Modify target group (修改目标组)**。

## AWS CLI
<a name="rds-proxy-modifying-proxy.cli"></a>

 要使用 AWS CLI 修改代理，请使用 [modify-db-proxy](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy.html)、[modify-db-proxy-target-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy-target-group.html)、[deregister-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/deregister-db-proxy-targets.html) 和 [register-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/register-db-proxy-targets.html) 命令。

 使用 `modify-db-proxy` 命令，您可以更改以下属性：
+  代理使用的一组 Secrets Manager 密钥。
+  是否需要 TLS。
+  空闲客户端超时。
+  是否记录 SQL 语句中的其他信息以进行调试。
+  用于检索 Secrets Manager 密钥的 IAM 角色。
+  代理使用的安全组。
+ 与代理关联的默认身份验证方案。

 以下示例演示了如何重命名现有代理。

```
aws rds modify-db-proxy --db-proxy-name the-proxy --new-db-proxy-name the_new_name
```

要修改与连接相关的设置或重命名目标组，请使用 `modify-db-proxy-target-group` 命令。目前，所有代理都有一个名为 `default` 的目标组。在您使用此目标组时，请指定代理的名称，并指定 `default` 作为目标组的名称。您无法重命名默认目标组。

 以下示例演示了如何首先检查代理的 `MaxIdleConnectionsPercent` 设置，然后使用目标组对其进行更改。

```
aws rds describe-db-proxy-target-groups --db-proxy-name the-proxy

{
    "TargetGroups": [
        {
            "Status": "available",
            "UpdatedDate": "2019-11-30T16:49:30.342Z",
            "ConnectionPoolConfig": {
                "MaxIdleConnectionsPercent": 50,
                "ConnectionBorrowTimeout": 120,
                "MaxConnectionsPercent": 100,
                "SessionPinningFilters": []
            },
            "TargetGroupName": "default",
            "CreatedDate": "2019-11-30T16:49:27.940Z",
            "DBProxyName": "the-proxy",
            "IsDefault": true
        }
    ]
}

aws rds modify-db-proxy-target-group --db-proxy-name the-proxy --target-group-name default --connection-pool-config '
{ "MaxIdleConnectionsPercent": 75 }'

{
    "DBProxyTargetGroup": {
        "Status": "available",
        "UpdatedDate": "2019-12-02T04:09:50.420Z",
        "ConnectionPoolConfig": {
            "MaxIdleConnectionsPercent": 75,
            "ConnectionBorrowTimeout": 120,
            "MaxConnectionsPercent": 100,
            "SessionPinningFilters": []
        },
        "TargetGroupName": "default",
        "CreatedDate": "2019-11-30T16:49:27.940Z",
        "DBProxyName": "the-proxy",
        "IsDefault": true
    }
}
```

 使用 `deregister-db-proxy-targets` 和 `register-db-proxy-targets` 命令，您可以通过相应的目标组来更改代理关联的 RDS 数据库实例。目前，每个代理都可以连接到一个 RDS 数据库实例。目标组可跟踪多可用区配置中所有 RDS 数据库实例的连接详细信息。

 以下示例首先介绍了与名为 `cluster-56-2020-02-25-1399` 的 Aurora MySQL 集群关联的代理。该示例演示了如何更改代理，以便连接到名为 `provisioned-cluster` 的不同集群。

 使用 RDS 数据库实例时，请指定 `--db-instance-identifier` 选项。

 以下示例修改 Aurora MySQL 代理。Aurora PostgreSQL 代理具有端口 5432。

```
aws rds describe-db-proxy-targets --db-proxy-name the-proxy

{
    "Targets": [
        {
            "Endpoint": "instance-9814.demo.us-east-1.rds.amazonaws.com",
            "Type": "RDS_INSTANCE",
            "Port": 3306,
            "RdsResourceId": "instance-9814"
        },
        {
            "Endpoint": "instance-8898.demo.us-east-1.rds.amazonaws.com",
            "Type": "RDS_INSTANCE",
            "Port": 3306,
            "RdsResourceId": "instance-8898"
        },
        {
            "Endpoint": "instance-1018.demo.us-east-1.rds.amazonaws.com",
            "Type": "RDS_INSTANCE",
            "Port": 3306,
            "RdsResourceId": "instance-1018"
        },
        {
            "Type": "TRACKED_CLUSTER",
            "Port": 0,
            "RdsResourceId": "cluster-56-2020-02-25-1399"
        },
        {
            "Endpoint": "instance-4330.demo.us-east-1.rds.amazonaws.com",
            "Type": "RDS_INSTANCE",
            "Port": 3306,
            "RdsResourceId": "instance-4330"
        }
    ]
}

aws rds deregister-db-proxy-targets --db-proxy-name the-proxy --db-cluster-identifier cluster-56-2020-02-25-1399

aws rds describe-db-proxy-targets --db-proxy-name the-proxy

{
    "Targets": []
}

aws rds register-db-proxy-targets --db-proxy-name the-proxy --db-cluster-identifier provisioned-cluster

{
    "DBProxyTargets": [
        {
            "Type": "TRACKED_CLUSTER",
            "Port": 0,
            "RdsResourceId": "provisioned-cluster"
        },
        {
            "Endpoint": "gkldje.demo.us-east-1.rds.amazonaws.com",
            "Type": "RDS_INSTANCE",
            "Port": 3306,
            "RdsResourceId": "gkldje"
        },
        {
            "Endpoint": "provisioned-1.demo.us-east-1.rds.amazonaws.com",
            "Type": "RDS_INSTANCE",
            "Port": 3306,
            "RdsResourceId": "provisioned-1"
        }
    ]
}
```

## RDS API
<a name="rds-proxy-modifying-proxy.api"></a>

 要使用 RDS API 修改代理，请使用 [ModifyDBProxy](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxy.html)、[ModifyDBProxyTargetGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxyTargetGroup.html)、[DeregisterDBProxyTargets](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DeregisterDBProxyTargets.html) 和 [RegisterDBProxyTargets](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RegisterDBProxyTargets.html) 操作。

 使用 `ModifyDBProxy`，您可以更改以下属性：
+  代理使用的一组 Secrets Manager 密钥。
+  是否需要 TLS。
+  空闲客户端超时。
+  是否记录 SQL 语句中的其他信息以进行调试。
+  用于检索 Secrets Manager 密钥的 IAM 角色。
+  代理使用的安全组。

使用 `ModifyDBProxyTargetGroup`，您可以修改与连接相关的设置。目前，所有代理都有一个名为 `default` 的目标组。在您使用此目标组时，请指定代理的名称，并指定 `default` 作为目标组的名称。您无法重命名默认目标组。

 使用 `DeregisterDBProxyTargets` 和 `RegisterDBProxyTargets`，您可以通过相应的目标组来更改代理关联的 RDS 数据库实例。目前，每个代理都可以连接到一个 RDS 数据库实例。目标组可跟踪多可用区配置中的所有 RDS 数据库实例的连接详细信息。

# 使用 RDS 代理时添加新数据库用户
<a name="rds-proxy-new-db-user"></a>

在某些情况下，您可能会将新数据库用户添加到与代理关联的 RDS 数据库实例或集群。根据您是使用 Secrets Manager 密钥进行标准身份验证，还是端到端 IAM 身份验证，选择相应的操作。

如果使用标准 IAM 身份验证，请按照以下说明进行操作：

1. 使用 [设置 RDS 代理的数据库凭证](rds-proxy-secrets-arns.md) 中描述的过程创建新 Secrets Manager 密钥。

1. 更新 IAM 角色以授予 RDS Proxy 对新 Secrets Manager 密钥的访问权限。为此，请更新 IAM 角色策略的资源部分。

1. 修改 RDS 代理，以在 **Secrets Manager 密钥**下添加新的 Secrets Manager 密钥。

1.  如果新用户取代了现有用户，请更新存储在代理的 Secrets Manager 密钥中的现有用户的凭证。

如果使用端到端 IAM 身份验证，则需要创建数据库用户并配置 IAM 权限。为此，请运行以下步骤：

1. 在您的数据库中创建一个与您要用于身份验证的 IAM 用户或角色名称相匹配的新数据库用户。

1. 确保数据库用户在数据库中配置了 IAM 身份验证插件。请参阅[使用 IAM 身份验证创建数据库账户](UsingWithRDS.IAMDBAuth.DBAccounts.md)。

1. 更新 IAM 策略以向 IAM 用户或角色授予 `rds-db:connect` 权限，如[创建端到端 IAM 策略](rds-proxy-iam-setup.md#rds-proxy-iam-setup-e2e-steps)中所述。

1. 确保您的代理配置为使用 IAM 身份验证作为默认身份验证方案。

使用端到端 IAM 身份验证时，您无需管理 Secrets Manager 密钥中的数据库凭证，因为 IAM 凭证用于从客户端到代理以及从代理到数据库的身份验证。

## 使用 RDS 代理时向 PostgreSQL 数据库添加新数据库用户
<a name="rds-proxy-new-db-user-pg"></a>

将新用户添加到 PostgreSQL 数据库时，如果有，请运行以下命令：

```
REVOKE CONNECT ON DATABASE postgres FROM PUBLIC;
```

向 `rdsproxyadmin` 用户授予 `CONNECT` 权限，以便用户可以监控目标数据库上的连接。

```
GRANT CONNECT ON DATABASE postgres TO rdsproxyadmin;
```

还可以通过将上述命令中的 `rdsproxyadmin` 更改为其他目标数据库用户，来允许该数据库用户执行运行状况检查。

## 使用 RDS 代理时更改数据库用户的密码
<a name="rds-proxy-changing-db-user-password"></a>

在某些情况下，您可能会更改与代理关联的 RDS 数据库实例中的数据库用户的密码。如果是这样，请使用新密码更新相应的 Secrets Manager 密钥。

如果您使用端到端 IAM 身份验证，则无需更新 Secrets Manager 密钥中的任何密码。

# 从 RDS 代理的标准 IAM 身份验证迁移至端到端 IAM 身份验证
<a name="rds-proxy-iam-migration"></a>

 如果您当前在 RDS 代理中使用标准 IAM 身份验证（客户端使用 IAM 身份验证连接到代理，而代理通过密钥连接到数据库），您可以迁移至端到端 IAM 身份验证，使客户端到代理以及代理到数据库的连接都使用 IAM 身份验证。

**迁移至端到端 IAM 身份验证**

1. **更新 RDS 代理 IAM 角色权限**

   创建同时包含 Secrets Manager 和 `rds:db-connect` 权限的更新代理权限策略：

   ```
   # Create updated proxy permission policy
   cat > updated-proxy-policy.json ≪ EOF
   ```

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "GetSecretsValue",
         "Action": [
           "secretsmanager:GetSecretValue"
         ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName-1234f"
         ]
       },
       {
         "Sid": "RdsDBConnect",
         "Action": [
           "rds-db:connect"
         ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:rds-db:us-east-1:123456789012:dbuser:cluster-ABCDEFGHIJKL01234/jane_doe"
         ]
       }
     ]
   }
   ```

   更新代理角色策略：

   ```
   aws iam put-role-policy \
               --role-name RDSProxyRole \
               --policy-name UpdatedProxyPermissions \
               --policy-document file://updated-proxy-policy.json
   ```

1. 修改您的 RDS 代理以实现端到端 IAM 身份验证

   ```
   aws rds modify-db-proxy \
     --db-proxy-name my-database-proxy \
     --default-auth-scheme IAM_AUTH \
     --region us-east-1
   ```

   继续操作之前，请验证 RDS 代理状态是否为**可用**且 `DefaultAuthScheme` 为 `IAM_AUTH`，以确保迁移期间零停机。

   ```
   aws rds describe-db-proxies --db-proxy-name my-database-proxy --region us-east-1
   ```

   预期输出：

   ```
   {
     "DBProxies": [
       {
         "DBProxyName": "my-database-proxy",
         "DBProxyArn": "arn:aws:rds:us-east-1:123456789012:db-proxy:prx-0123456789abcdef",
         "Status": "available",
         ...
         "DefaultAuthScheme": "IAM_AUTH"
       }
     ]
   }
   ```

1. 在数据库上启用 IAM 身份验证

   ```
   aws rds modify-db-cluster \
     --db-cluster-identifier my-database-cluster \
     --enable-iam-database-authentication \
     --region us-east-1
   ```

1. 为 IAM 身份验证配置数据库用户

   对于 RDS for PostgreSQL：

   ```
   GRANT rds_iam TO jane_doe;
   ```

   对于 RDS for MySQL 和 RDS for MariaDB：

   ```
   ALTER USER 'jane_doe' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';
   ALTER USER 'jane_doe'@'%' REQUIRE SSL;
   ```

1. 无需更改客户端应用程序代码。连接过程保持不变：

   对于 RDS for PostgreSQL：

   ```
   # Generate authentication token
   export PGPASSWORD=$(aws rds generate-db-auth-token \
     --hostname my-database-proxy.proxy-ABCDEFGHIJKL01234.us-east-1.rds.amazonaws.com \
     --port 5432 \
     --username jane_doe \
     --region us-east-1)
   
   # Connect to database through proxy
   psql "host=my-database-proxy.proxy-ABCDEFGHIJKL01234.us-east-1.rds.amazonaws.com port=5432 user=jane_doe dbname=postgres password=$PGPASSWORD sslmode=require sslrootcert=us-east-1-bundle.pem"
   ```

   对于 RDS for MySQL 和 RDS for MariaDB：

   ```
   # Generate authentication token
   export MYSQL_PWD=$(aws rds generate-db-auth-token \
     --hostname my-database-proxy.proxy-ABCDEFGHIJKL01234.us-east-1.rds.amazonaws.com \
     --port 3306 \
     --username jane_doe \
     --region us-east-1)
   
   # Connect to database through proxy
   mysql -h my-database-proxy.proxy-ABCDEFGHIJKL01234.us-east-1.rds.amazonaws.com \
     -P 3306 \
     -u jane_doe \
     --ssl-ca=us-east-1-bundle.pem \
     --enable-cleartext-plugin
   ```

# RDS 代理连接注意事项
<a name="rds-proxy-connections"></a>

## 配置连接设置
<a name="rds-proxy-connection-pooling-tuning"></a>

若要调整 RDS Proxy 的连接池，您可以修改以下设置：
+ [IdleClientTimeout](#rds-proxy-connection-pooling-tuning.idleclienttimeout)
+ [MaxConnectionsPercent](#rds-proxy-connection-pooling-tuning.maxconnectionspercent)
+ [MaxIdleConnectionsPercent](#rds-proxy-connection-pooling-tuning.maxidleconnectionspercent)
+ [ConnectionBorrowTimeout](#rds-proxy-connection-pooling-tuning.connectionborrowtimeout)

### IdleClientTimeout
<a name="rds-proxy-connection-pooling-tuning.idleclienttimeout"></a>

您可以指定在代理关闭客户端连接之前，客户端连接可以处于空闲状态的时长。默认值为 1800 秒（30 分钟）。

如果应用程序未在上一请求完成后的指定时间内提交新请求，则将客户端连接视为*空闲*。底层数据库连接保持打开状态并返回到连接池。因此，它可以重复用于新的客户端连接。如果希望代理主动删除过时的连接，则降低空闲客户端连接超时。如果工作负载与代理建立频繁的连接，则增加空闲客户端连接超时，以便节省建立连接的成本。

此设置由 RDS 控制台中的 **Idle client connection timeout**（空闲客户端连接超时）字段以及 AWS CLI 和 API 中的 `IdleClientTimeout` 设置表示。要了解如何在 RDS 控制台中更改 **Idle client connection timeout**（空闲客户端连接超时）字段的值，请参阅 [AWS 管理控制台](rds-proxy-modifying-proxy.md#rds-proxy-modifying-proxy.console)。要了解如何更改 `IdleClientTimeout` 设置的值，请参阅 CLI 命令 [modify-db-proxy](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy.html) 或 API 操作 [ModifyDBProxy](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxy.html)。

### MaxConnectionsPercent
<a name="rds-proxy-connection-pooling-tuning.maxconnectionspercent"></a>

您可以限制 RDS 代理可与目标数据库建立的连接数。请将限制指定为数据库可用的最大连接数的百分比。此设置由 RDS 控制台中的 **Connection pool maximum connections**（连接池最大连接数）字段以及 AWS CLI 和 API 中的 `MaxConnectionsPercent` 设置表示。

对于目标组使用的 RDS 数据库实例，`MaxConnectionsPercent` 值以 `max_connections` 设置的百分比表示。代理不会提前创建所有连接。此设置允许代理在工作负载需要时建立这些连接。

例如，对于 `max_connections` 设置为 1000 且 `MaxConnectionsPercent` 设置为 95 的注册数据库目标，RDS 代理将 950 个连接设置为与该数据库目标的并行连接的上限。

工作负载达到允许的最大数据库连接数的一个常见副作用是总体查询延迟增加，同时 `DatabaseConnectionsBorrowLatency` 指标也会增加。您可以通过比较 `DatabaseConnections` 和 `MaxDatabaseConnectionsAllowed` 指标来监控当前使用的数据库连接数和允许的数据库连接总数。

设置此参数时，请注意以下最佳实践：
+ 为工作负载模式的变化留出足够的连接余量。建议将该参数设置为比最近监控的最大使用量高出至少 30%。由于 RDS 代理在多个节点之间重新分配数据库连接限额，因此，内部容量更改可能需要至少 30% 的余量来增加连接，以避免增加借用延迟。
+ RDS 代理保留一定数量的连接用于主动监控，以支持快速失效转移、流量路由和内部操作。`MaxDatabaseConnectionsAllowed` 指标不包括这些预留连接。该指标表示可用于为工作负载提供服务的连接数，可以低于从 `MaxConnectionsPercent` 设置得出的值。

  推荐的最低 `MaxConnectionsPercent` 值
  + db.t3.small：30
  + db.t3.medium 或更大：20

要了解如何在 RDS 控制台中更改 **Connection pool maximum connections**（连接池最大连接数）字段的值，请参阅 [AWS 管理控制台](rds-proxy-modifying-proxy.md#rds-proxy-modifying-proxy.console)。要了解如何更改 `MaxConnectionsPercent` 设置的值，请参阅 CLI 命令 [modify-db-proxy-target-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy-target-group.html) 或 API 操作 [ModifyDBProxyTargetGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxyTargetGroup.html)。

 有关数据库连接限制的更多信息，请参阅[数据库最大连接数](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html#RDS_Limits.MaxConnections)。

### MaxIdleConnectionsPercent
<a name="rds-proxy-connection-pooling-tuning.maxidleconnectionspercent"></a>

您可以控制 RDS Proxy 可在连接池中保留的空闲数据库连接数。默认情况下，如果连接五分钟内没有活动，RDS 代理会将其池中的数据库连接视为*空闲*。

对于 RDS 数据库实例目标组，`MaxIdleConnectionsPercent` 值以 `max_connections` 设置的百分比表示。原定设置值为 `MaxConnectionsPercent` 的 50%，上限为 `MaxConnectionsPercent` 的值。例如，如果 `MaxConnectionsPercent` 为 80，则 `MaxIdleConnectionsPercent` 的默认值为 40。如果未指定 `MaxConnectionsPercent` 的值，则对于 RDS for SQL Server，`MaxIdleConnectionsPercent` 为 5；对于所有其他引擎，默认值为 50。

对于高值，代理会将较高百分比的空闲数据库连接保持在打开状态。对于低值，代理会关闭较高百分比的空闲数据库连接。如果您的工作负载不可预测，请考虑为 `MaxIdleConnectionsPercent` 设置较高的值。这样做意味着 RDS 代理可以在不打开大量新数据库连接的情况下适应活动的突增。

此设置由 AWS CLI 和 API 中 `DBProxyTargetGroup` 的 `MaxIdleConnectionsPercent` 设置表示。要了解如何更改 `MaxIdleConnectionsPercent` 设置的值，请参阅 CLI 命令 [modify-db-proxy-target-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy-target-group.html) 或 API 操作 [ModifyDBProxyTargetGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxyTargetGroup.html)。

 有关数据库连接限制的更多信息，请参阅[数据库最大连接数](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html#RDS_Limits.MaxConnections)。

### ConnectionBorrowTimeout
<a name="rds-proxy-connection-pooling-tuning.connectionborrowtimeout"></a>

您可以选择 RDS Proxy 在返回超时错误之前等待连接池中数据库连接可用的时间。默认值为 120 秒。此设置适用于连接数达到最大而导致连接池中没有可用连接的情况。当没有适当的数据库实例可用于处理请求时，例如当失效转移操作正在进行时，它也适用。通过使用此设置，您可以为应用程序设置最佳等待期，而无需更改应用程序代码中的查询超时。

此设置由 RDS Proxy 控制台中的 **Connection borrow timeout**（连接借用超时）字段、`ConnectionBorrowTimeout` 中 `DBProxyTargetGroup` 的 AWS CLI 设置或 API 表示。要了解如何在 RDS 控制台中更改 **Connection borrow timeout**（连接借用超时）字段的值，请参阅 [AWS 管理控制台](rds-proxy-modifying-proxy.md#rds-proxy-modifying-proxy.console)。要了解如何更改 `ConnectionBorrowTimeout` 设置的值，请参阅 CLI 命令 [modify-db-proxy-target-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy-target-group.html) 或 API 操作 [ModifyDBProxyTargetGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxyTargetGroup.html)。

## 客户端和数据库连接
<a name="rds-proxy-connection-life"></a>

从您的应用程序到 RDS 代理的连接称为客户端连接。从代理到数据库的连接则称为数据库连接。使用 RDS 代理时，客户端连接在代理处终止，而数据库连接则在 RDS 代理中进行管理。

应用程序端连接池可以减少在应用程序与 RDS 代理之间重复建立连接。

在实现应用程序端连接池之前，请考虑以下配置方面：
+ 客户端连接最长期限：RDS 代理强制规定客户端连接的最长期限为 24 小时。此值不可配置。将池配置为最长连接期限小于 24 小时，以免客户端连接意外中断。
+ 客户端连接空闲超时：RDS 代理强制规定客户端连接的最长空闲时间。为池配置的空闲连接超时值要小于 RDS 代理的客户端连接空闲超时设置，以免连接意外中断。

在应用程序端连接池中配置的最大客户端连接数不必限制为 RDS 代理的 **max\$1connections** 设置。

客户端连接池可延长客户端连接期限。如果您的连接遇到固定问题，则池化客户端连接可能会降低多路复用效率。已固定但在应用程序端连接池中处于空闲状态的客户端连接会继续保持数据库连接，并防止数据库连接被其它客户端连接重复使用。查看您的代理日志，以检查您的连接是否遇到固定问题。

**注意**  
当数据库连接不再使用时，RDS 代理会在 24 小时后的某个时间关闭数据库连接。无论最大空闲连接设置的值如何，代理都会执行此操作。

# 避免固定 RDS 代理
<a name="rds-proxy-pinning"></a>

 当数据库请求不依赖于先前请求的状态信息时，多路复用效率更高。在这种情况下，RDS 代理可以在每个事务结束时重用连接。此类状态信息的示例包括可通过 `SET` 或 `SELECT` 语句更改的大多数变量和配置参数。默认情况下，客户端连接上的 SQL 事务可以在底层数据库连接之间多路复用。

 与代理的连接可以进入一种称为*固定*的状态。固定连接后，每个后续事务将使用相同的底层数据库连接，直到会话结束。在会话结束之前，其他客户端连接也不能重用该数据库连接。客户端连接断开时，会话结束。

 当 RDS 代理检测到不适合其他会话的会话状态更改时，它会自动将客户端连接固定到特定的数据库连接。固定降低了连接重用的有效性。如果您的所有连接或几乎所有连接都遇到固定问题，请考虑修改应用程序代码或工作负载，以减少导致固定问题的情形。

例如，您的应用程序更改了会话变量或配置参数。在这种情况下，后面的语句可能依赖于新变量或参数来生效。因此，当 RDS 代理处理更改会话变量或配置设置的请求时，它会将该会话固定到数据库连接。这样，会话状态对于同一会话中的所有后续事务仍然有效。

 对于某些数据库引擎，此规则并不适用于您可以设置的全部参数。RDS 代理会跟踪某些语句和变量。因此，在您修改这些内容时，RDS 代理不会固定会话。在这种情况下，RDS 代理仅将连接重用于具有相同设置值的其他会话。有关 RDS 代理针对数据库引擎跟踪的内容的详细信息，请参阅以下内容：
+ [RDS 代理针对 RDS for SQL Server 数据库跟踪的内容](#rds-proxy-pinning.sql-server-tracked-vars)
+ [RDS 代理针对 RDS for MariaDB 数据库和 RDS for MySQL 数据库跟踪的内容](#rds-proxy-pinning.mysql-tracked-vars)

## RDS 代理针对 RDS for SQL Server 数据库跟踪的内容
<a name="rds-proxy-pinning.sql-server-tracked-vars"></a>

RDS 代理跟踪以下 SQL Server 语句：
+ `USE`
+ `SET ANSI_NULLS`
+ `SET ANSI_PADDING`
+ `SET ANSI_WARNINGS`
+ `SET ARITHABORT`
+ `SET CONCAT_NULL_YIELDS_NULL`
+ `SET CURSOR_CLOSE_ON_COMMIT`
+ `SET DATEFIRST`
+ `SET DATEFORMAT`
+ `SET LANGUAGE`
+ `SET LOCK_TIMEOUT`
+ `SET NUMERIC_ROUNDABORT`
+ `SET QUOTED_IDENTIFIER`
+ `SET TEXTSIZE`
+ `SET TRANSACTION ISOLATION LEVEL`

## RDS 代理针对 RDS for MariaDB 数据库和 RDS for MySQL 数据库跟踪的内容
<a name="rds-proxy-pinning.mysql-tracked-vars"></a>

RDS 代理跟踪以下 MariaDB 和 MySQL 语句：
+ DROP DATABASE
+ DROP SCHEMA
+ USE

RDS 代理跟踪以下 MySQL 和 MariaDB 变量：
+ `AUTOCOMMIT`
+ `AUTO_INCREMENT_INCREMENT`
+ `CHARACTER SET (or CHAR SET)`
+ `CHARACTER_SET_CLIENT`
+ `CHARACTER_SET_DATABASE`
+ `CHARACTER_SET_FILESYSTEM`
+ `CHARACTER_SET_CONNECTION`
+ `CHARACTER_SET_RESULTS`
+ `CHARACTER_SET_SERVER`
+ `COLLATION_CONNECTION`
+ `COLLATION_DATABASE`
+ `COLLATION_SERVER`
+ `INTERACTIVE_TIMEOUT`
+ `NAMES`
+ `NET_WRITE_TIMEOUT`
+ `QUERY_CACHE_TYPE`
+ `SESSION_TRACK_SCHEMA`
+ `SQL_MODE`
+ `TIME_ZONE`
+ `TRANSACTION_ISOLATION (or TX_ISOLATION)`
+ `TRANSACTION_READ_ONLY (or TX_READ_ONLY)`
+ `WAIT_TIMEOUT`

**注意**  
当您在会话范围内设置 `TRANSACTION_ISOLATION` 和 `TRANSACTION_READ_ONLY` 变量时，RDS 代理会跟踪对这些变量的更改。但是，如果在下一个事务范围内设置它们，RDS 代理将固定连接。无论您使用 `SET` 语句还是 `SET TRANSACTION` 语句来配置这些值，此行为都适用。

## 显著减少固定
<a name="rds-proxy-pinning.minimizing"></a>

 RDS 代理的性能优化包括尝试通过最小化固定来最大化事务级别连接重用（多路复用）。

您可以执行以下步骤以显著减少固定：
+  避免可能导致固定的不必要的数据库请求。
+  在所有连接中一致地设置变量和配置设置。这样，后续会话更有可能重用具有这些特定设置的连接。

   但是，对于 PostgreSQL 设置，变量会导致会话固定。
+  对于 MySQL 引擎系列数据库，可将会话固定筛选条件应用于代理。您可以免除某些类型的操作，使其不固定会话（如果您知道这样做不会影响应用程序的正确操作）。
+  通过监控 Amazon CloudWatch 指标 `DatabaseConnectionsCurrentlySessionPinned` 来查看固定的发生频率。有关该指标和其他 CloudWatch 指标的信息，请参阅 [使用 Amazon CloudWatch 监控 RDS Proxy 指标使用 CloudWatch 监控 RDS Proxy](rds-proxy.monitoring.md)。
+  如果您使用 `SET` 语句为每个客户端连接执行相同的初始化，则可以在保留事务级别多路复用的同时执行此操作。在这种情况下，您将设置初始会话状态的语句移动到由代理使用的初始化查询中。该属性是一个字符串，包含一个或多个 SQL 语句（用分号分隔）。

   例如，您可以为设置特定配置参数的代理定义初始化查询。然后，每当为该代理设置新连接时，RDS 代理都会应用这些设置。您可以从应用程序代码中删除相应的 `SET` 语句，这样，它们就不会干扰事务级别多路复用。

   有关代理的固定发生频率的指标，请参阅 [使用 Amazon CloudWatch 监控 RDS Proxy 指标使用 CloudWatch 监控 RDS Proxy](rds-proxy.monitoring.md)。

## 导致对所有引擎系列进行固定的条件
<a name="rds-proxy-pinning.all"></a>

 对于以下情况（其中多路复用可能会导致意外行为），代理将会话固定到当前连接：
+ 文本大小大于 16 KB 的任何语句都会导致代理固定会话。

## 导致对 RDS for Microsoft SQL Server 进行固定的条件
<a name="rds-proxy-pinning.sqlserver"></a>

 对于 RDS for SQL Server，以下交互也会导致固定：
+ 使用多个活动的结果集（MARS）。有关 MARS 的信息，请参阅 [SQL Server](https://docs.microsoft.com/en-us/sql/relational-databases/native-client/features/using-multiple-active-result-sets-mars?view=sql-server-ver16) 文档。
+ 使用分布式事务协调器（DTC）通信。
+ 创建临时表、事务、游标或预准备语句。
+ 使用以下 `SET` 语句：
  + `SET ANSI_DEFAULTS`
  + `SET ANSI_NULL_DFLT`
  + `SET ARITHIGNORE`
  + `SET DEADLOCK_PRIORITY`
  + `SET FIPS_FLAGGER`
  + `SET FMTONLY`
  + `SET FORCEPLAN`
  + `SET IDENTITY_INSERT`
  + `SET NOCOUNT`
  + `SET NOEXEC`
  + `SET OFFSETS`
  + `SET PARSEONLY`
  + `SET QUERY_GOVERNOR_COST_LIMIT`
  + `SET REMOTE_PROC_TRANSACTIONS`
  + `SET ROWCOUNT`
  + `SET SHOWPLAN_ALL`、`SHOWPLAN_TEXT` 和 `SHOWPLAN_XML`
  + `SET STATISTICS`
  + `SET XACT_ABORT`

## 导致对 RDS for MariaDB 和 RDS for MySQL 进行固定的条件
<a name="rds-proxy-pinning.mysql"></a>

 对于 MariaDB 和 MySQL，以下交互也会导致固定：
+ 显式表锁定语句 `LOCK TABLE`、`LOCK TABLES` 或 `FLUSH TABLES WITH READ LOCK` 会导致代理固定会话。
+ 通过使用 `GET_LOCK` 创建命名锁会导致代理固定会话。
+ 设置用户变量或系统变量（有些例外）会将会话固定到代理。如果这种情况严重限制了连接的重用，您可以配置 `SET` 操作以避免固定。为此，请调整会话固定筛选条件属性。有关更多信息，请参阅[为 Amazon RDS 创建代理](rds-proxy-creating.md)和[修改 RDS 代理](rds-proxy-modifying-proxy.md)。
+ 创建临时表会导致代理固定会话。这样，无论事务边界如何，临时表的内容都会在整个会话期间保留。
+ 调用 `ROW_COUNT` 和 `FOUND_ROWS` 函数有时会导致固定问题。
+ 预编译语句会导致代理固定会话。无论预编译语句使用 SQL 文本还是二进制协议，这项规则都适用。
+ 使用 SET LOCAL 时，RDS 代理无法固定连接。
+ 调用存储过程和存储函数不会导致固定。RDS 代理不会检测此类调用导致的任何会话状态更改。如果您希望跨事务持久保持存储例程中的会话状态，请确保您的应用程序不会更改该状态。例如，RDS 代理目前与创建跨所有事务持久存在的临时表的存储过程不兼容。
+ 带 MySQL 可执行注释（语法 /\$1\$1 ... \$1/）或 MariaDB 可执行注释（语法 /\$1M\$1 ... \$1/）的查询会导致停滞。RDS 代理无法解析嵌入在这些注释中的 SQL 来跟踪会话状态更改。

 如果您拥有关于应用程序行为的专业知识，则可以跳过某些应用程序语句的固定行为。为此，请在创建代理时选择**会话固定筛选条件**选项。当前，您可以选择退出会话固定，以设置会话变量和配置设置。

## 导致对 RDS for PostgreSQL 进行固定的条件
<a name="rds-proxy-pinning.postgres"></a>

 对于 PostgreSQL，以下交互也会导致固定：
+  使用 `SET` 命令。
+  使用 `PREPARE`、`DISCARD`、`DEALLOCATE`、或 `EXECUTE` 命令管理准备好的语句。
+  创建临时序列、表或视图。
+  声明游标。
+  丢弃会话状态。
+  监听通知频道。
+  加载库模块，如 `auto_explain`。
+  使用函数操作序列，例如 `nextval` 和 `setval`。
+  使用函数与锁定交互，例如 `pg_advisory_lock` 和 `pg_try_advisory_lock`。
**注意**  
RDS 代理未锁定事务级咨询锁，特别是 `pg_advisory_xact_lock`、`pg_advisory_xact_lock_shared`、`pg_try_advisory_xact_lock` 和 `pg_try_advisory_xact_lock_shared`。
+ 设置参数或将参数重置为其默认值。具体而言，就是使用 `SET` 和 `set_config` 命令为会话变量分配默认值。
+ 调用存储过程和存储函数不会导致固定。RDS 代理不会检测此类调用导致的任何会话状态更改。如果您希望跨事务持久保持存储例程中的会话状态，请确保您的应用程序不会更改该状态。例如，RDS 代理目前与创建跨所有事务持久存在的临时表的存储过程不兼容。
+ 丢弃会话状态。如果使用连接池库并将 `DISCARD ALL` 查询配置为重置查询，则 RDS 代理会在发布时固定客户端连接。这会降低代理的多路复用效率，并可能导致意想不到的结果，因为 `DISCARD ALL` 命令可能会干扰会话状态管理。

# 删除 RDS 代理
<a name="rds-proxy-deleting"></a>

 如果您不再需要某个代理，可以将其删除。或者，如果您停止使用数据库实例或与其关联的集群，则可以删除代理。

## AWS 管理控制台
<a name="rds-proxy-deleting.console"></a>

**删除代理**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1.  在导航窗格中，选择 **Proxies (代理)**。

1.  从列表中选择要删除的代理。

1.  选择 **Delete Proxy (删除代理)**。

## AWS CLI
<a name="rds-proxy-deleting.CLI"></a>

 要删除数据库代理，请使用 AWS CLI 命令 [delete-db-proxy](https://docs.aws.amazon.com/cli/latest/reference/rds/delete-db-proxy.html)。要删除相关的关联，还可以使用 [deregister-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/deregister-db-proxy-targets.html) 命令。

```
aws rds delete-db-proxy --name proxy_name
```

```
aws rds deregister-db-proxy-targets
    --db-proxy-name proxy_name
    [--target-group-name target_group_name]
    [--target-ids comma_separated_list]       # or
    [--db-instance-identifiers instance_id]       # or
    [--db-cluster-identifiers cluster_id]
```

## RDS API
<a name="rds-proxy-deleting.API"></a>

 要删除数据库代理，请调用 Amazon RDS API 函数 [DeleteDBProxy](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DeleteDBProxy.html)。要删除相关的项目和关联，您还可以调用函数 [DeleteDBProxyTargetGroup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DeleteDBProxyTargetGroup.html) 和 [DeregisterDBProxyTargets](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DeregisterDBProxyTargets.html)。

# 使用 Amazon RDS Proxy 终端节点
<a name="rds-proxy-endpoints"></a>

RDS 代理端点提供了灵活且高效地管理数据库连接的方式，从而提高了可扩展性、可用性和安全性。使用代理端点，您可以：
+ **简化监控和故障排除**：使用多个端点来独立跟踪和管理来自不同应用程序的连接。

**Topics**
+ [代理终端节点概述](#rds-proxy-endpoints-overview)
+ [代理端点的限制](#rds-proxy-endpoints-limits)
+ [多可用区数据库集群的代理端点](#rds-proxy-endpoints-overview-maz)
+ [访问 VPC 中的 RDS 数据库](#rds-proxy-cross-vpc)
+ [创建代理终端节点](rds-proxy-endpoints.CreatingEndpoint.md)
+ [查看代理终端节点](rds-proxy-endpoints.DescribingEndpoint.md)
+ [修改代理终端节点](rds-proxy-endpoints.ModifyingEndpoint.md)
+ [删除代理终端节点](rds-proxy-endpoints.DeletingEndpoint.md)

## 代理终端节点概述
<a name="rds-proxy-endpoints-overview"></a>

使用 RDS 代理终端节点所涉及的过程与使用 RDS 实例终端节点相同。如果您不熟悉 RDS 终端节点，请参阅[连接到运行 MySQL 数据库引擎的数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ConnectToInstance.html)和[连接到运行 PostgreSQL 数据库引擎的数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ConnectToPostgreSQLInstance.html)以了解更多信息。

当您创建代理端点时，您可以将它与不同于代理虚拟私有云（VPC）的 VPC 相关联。这样，您就可以从其它 VPC 连接到代理，例如组织内其它应用程序使用的 VPC。

有关与代理终端节点关联的限制的信息，请参阅 [代理端点的限制](#rds-proxy-endpoints-limits)。

RDS 代理日志在每个条目前添加关联代理端点的名称作为前缀。这可以是您为用户定义的端点指定的名称，也可以是代理默认读/写端点的特殊名称 `default`。

每个代理终端节点都有自己的 CloudWatch 指标集合。监控所有代理端点、特定端点的指标，或者代理的所有读/写或只读端点的指标。有关更多信息，请参阅 [使用 Amazon CloudWatch 监控 RDS Proxy 指标使用 CloudWatch 监控 RDS Proxy](rds-proxy.monitoring.md)。

代理终端节点使用与其关联的代理相同的身份验证机制。RDS Proxy 会自动为用户定义的终端节点设置权限和授权，并与关联代理的属性保持一致。

## 代理端点的限制
<a name="rds-proxy-endpoints-limits"></a>

RDS 代理端点具有以下限制：
+  无法修改 RDS 代理默认端点。
+  代理的用户定义终端节点的最大数量为 20 个。因此，代理最多可以有 21 个终端节点：默认终端节点加上您创建的 20 个终端节点。
+  当您将其他终端节点与代理关联时，RDS Proxy 会自动确定集群中的哪些数据库实例用于每个终端节点。
+  对于 IPv6 或双栈端点网络类型，必须将您的 VPC 和子网配置为支持所选网络类型。

创建代理时，RDS 会自动创建 VPC 端点，以用于应用程序和数据库之间的安全通信。VPC 端点是可见的，可从 Amazon VPC 控制台访问该端点。

添加新的代理端点会预置一个 AWS PrivateLink 接口端点。如果您向代理添加一个或多个端点，则需支付额外费用。有关更多信息，请参阅 [RDS 代理定价](https://aws.amazon.com/rds/proxy/pricing/)。

## 多可用区数据库集群的代理端点
<a name="rds-proxy-endpoints-overview-maz"></a>

默认情况下，在将 RDS 代理与多可用区数据库集群结合使用时所连接的终端节点具有读/写功能。因此，此端点会将所有请求发送到集群的写入器实例。所有这些连接都计入写入器实例的 `max_connections` 值。如果您的代理与多可用区数据库集群关联，您可以为该代理创建额外的读/写或只读终端节点。

您可以将只读端点与代理一起用于只读查询。使用方式与将读取器终端节点用于多可用区数据库集群的方式相同。这样做有助于您利用具有一个或多个读取器数据库实例的多可用区数据库集群的读取可扩展性。通过使用只读终端节点并根据需要向多可用区数据库集群中添加更多读取器数据库实例，您可以同时运行更多的查询并同时建立更多的连接。这些读取器终端节点有助于提高查询密集型应用程序的读取可扩展性。如果集群中的读取器数据库实例变得不可用，读取器终端节点还有助于提高连接的可用性。

### 多可用区数据库集群的读取器终端节点
<a name="rds-proxy-endpoints-reader-stub"></a>

 通过 RDS Proxy，您可以创建和使用读取器终端节点。但是，这些终端节点仅适用于与多可用区数据库集群关联的代理。如果您使用 RDS CLI 或 API，则可能会看到值为 `TargetRole` 的属性 `READ_ONLY`。您可以通过将代理的目标从 RDS 数据库实例更改为多可用区数据库集群来利用此类代理。

 在将 RDS 代理与多可用区数据库集群结合使用时，可以创建并连接到称为*读取器终端节点*的只读终端节点。

#### 读取器终端节点如何帮助提高应用程序可用性
<a name="rds-proxy-endpoints-reader-hapa"></a>

 在某些情况下，集群中的读取器实例可能会变得不可用。如果发生这种情况，使用数据库代理的读取器终端节点的连接比使用多可用区数据库集群读取器终端节点的连接恢复得更快。RDS 代理仅将连接路由到集群中的可用读取器实例。当实例变为不可用时，不会由于 DNS 缓存而造成延迟。

 如果连接是多路复用的，则 RDS 代理会将后续查询定向到其它读取器实例，而不会中断您的应用程序。如果读取器实例处于不可用状态，则与该实例终端节点的所有客户端连接都将关闭。

 如果连接是固定的，则该连接中的下一个查询将返回错误。但是，您的应用程序可以立即重新连接到同一代理端点。RDS Proxy 会将连接路由到处于 `available` 状态的其他读取器数据库实例。在手动重新连接时，RDS 代理不会检查新旧读取器实例之间的复制滞后。

 如果您的多可用区数据库集群没有可用的读取器实例，则 RDS 代理会尝试在某个读取器终端节点可用时尝试连接到该终端节点。如果在连接借用超时期间没有读取器实例变为可用，则连接尝试将失败。如果读取器实例变为可用，则连接尝试成功。

#### 读取器终端节点如何帮助提高查询可扩展性
<a name="rds-proxy-endpoints-reader-scalability"></a>

 代理的读取器终端节点通过以下方式帮助提高多可用区数据库集群查询可扩展性：
+  在可行的情况下，RDS Proxy 使用特定的读取器终端节点连接对所有查询问题使用相同的读取器数据库实例。这样，对相同表的一组相关查询就可以利用特定数据库实例上的缓存、计划优化等优势。
+  如果读取器数据库实例变为不可用，则对应用程序的影响取决于会话是多路复用的还是固定的。如果会话是多路复用的，则 RDS Proxy 会将所有后续查询路由到其他读取器数据库实例，而无需您执行任何操作。如果会话是固定的，则您的应用程序将出现错误，必须重新连接。您可以立即重新连接到读取器终端节点，RDS Proxy 会将连接路由到可用的读取器数据库实例。有关代理会话的多路复用和固定的更多信息，请参阅 [RDS 代理概念概述](rds-proxy.howitworks.md#rds-proxy-overview)。

## 访问 VPC 中的 RDS 数据库
<a name="rds-proxy-cross-vpc"></a>

 默认情况下，RDS 技术堆栈的组件都在同一个 Amazon VPC 中。例如，假设一个在 Amazon EC2 实例上运行的应用程序连接到 Amazon RDS 数据库实例。在这种情况下，应用程序服务器和数据库必须都位于同一 VPC 内。

 通过 RDS 代理，您可以设置从一个 VPC 中的资源（例如，EC2 实例）访问另一个 VPC 中的 Amazon RDS 数据库实例。例如，您的组织可能有多个应用程序访问同一数据库资源。每个应用程序都可能位于自己的 VPC 中。

 要启用跨 VPC 访问，您需要为代理创建一个新的终端节点。代理本身与 Amazon RDS 数据库实例位于同一个 VPC 中。但是，跨 VPC 终端节点与 EC2 实例等其他资源一起位于另一个 VPC 中。跨 VPC 终端节点与 EC2 和其他资源所在的 VPC 中的子网和安全组关联。通过这些关联，您可以从原本由于 VPC 限制而无法访问数据库的应用程序连接到终端节点。

 以下步骤说明了如何通过 RDS Proxy 创建和访问跨 VPC 终端节点：

1.  创建两个 VPC，或者选择已用于 RDS 工作的两个 VPC。每个 VPC 都应该有自己的关联网络资源，例如互联网网关、路由表、子网和安全组。如果您只有一个 VPC，可以查阅 [开始使用 Amazon RDS](CHAP_GettingStarted.md)，了解设置另一个 VPC 以成功使用 RDS 的步骤。您还可以查看 Amazon EC2 控制台中的现有 VPC，以了解要将哪些类型的资源连接起来。

1.  创建一个与要连接到的 Amazon RDS 数据库实例关联的数据库代理。按照 [为 Amazon RDS 创建代理](rds-proxy-creating.md) 中的过程操作。

1.  在 RDS 控制台中的代理的 **Details**（详细信息）页面上，在 **Proxy endpoints**（代理终端节点）部分下，选择 **Create endpoint**（创建终端节点）。按照 [创建代理终端节点](rds-proxy-endpoints.CreatingEndpoint.md) 中的过程操作。

1.  选择将跨 VPC 终端节点设置为读/写还是只读。

1.  不接受默认的与 Amazon RDS 数据库实例使用相同的 VPC，而是选择其它 VPC。此 VPC 必须与代理所在的 VPC 位于同一 AWS 区域中。

1.  现在不接受来自 Amazon RDS 数据库实例所在 VPC 中的默认子网和安全组，而是进行新的选择。根据您选择的 VPC 中的子网和安全组进行这些选择。

1. 您无需更改 Secrets Manager 密钥的任何设置。相同的凭证适用于代理的所有终端节点，无论每个终端节点位于哪个 VPC 中均是如此。同样，在使用 IAM 身份验证时，即使端点位于不同的 VPC 中，您的 IAM 配置和权限也能在所有代理端点上保持一致。无需为每个端点进行额外的 IAM 配置。

1.  等待新终端节点达到 **Available**（可用）状态。

1.  记下终端节点的完整名称。这是以 `Region_name.rds.amazonaws.com` 为结尾的值，您提供此值作为数据库应用程序连接字符串的一部分。

1.  从与该终端节点位于同一 VPC 中的资源访问新的终端节点。测试此过程的一种简单方法是在此 VPC 中创建一个新的 EC2 实例。然后，登录 EC2 实例并运行 `mysql` 或 `psql` 命令，以使用连接字符串中的端点值进行连接。

# 创建代理终端节点
<a name="rds-proxy-endpoints.CreatingEndpoint"></a>

要创建代理端点，请按照以下说明操作：

## 控制台
<a name="rds-proxy-endpoints.CreatingEndpoint.CON"></a>

**创建代理端点**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1.  在导航窗格中，选择 **Proxies (代理)**。

1.  单击您要为其创建新终端节点的代理的名称。

    此时将显示该代理的详细信息页面。

1.  在 **Proxy endpoints（代理终端节点）**部分中，选择 **Create proxy endpoint（创建代理终端节点）**。

    此时将显示 **Create proxy endpoint（创建代理终端节点）**窗口。

1.  对于 **Proxy endpoint name（代理终端节点名称）**，输入您选择的描述性名称。

1.  对于 **Target role（目标角色）**，选择将终端节点设置为读/写还是只读。

    使用读/写端点的连接可以执行任何类型的操作，如数据定义语言（DDL）语句、数据操作语言（DML）语句和查询。这些终端节点始终连接到 RDS 数据库集群的主实例。仅在应用程序中使用单个终端节点时，可以将读/写终端节点用于常规数据库操作。您还可以将读/写终端节点用于管理操作、联机事务处理 (OLTP) 应用程序和提取-转换-加载 (ETL) 作业。

    使用只读终端节点的连接只能执行查询。RDS 代理可以为终端节点的每个连接使用其中一个读取器实例。这样，查询密集型应用程序就可以利用多可用区数据库集群的集群功能。这些只读连接不会在集群的主实例上增加任何开销。这样，您的报告和分析查询就不会减慢 OLTP 应用程序的写入操作。

1.  对于**虚拟私有云（VPC）**，选择默认值，以便从您通常用于访问代理或其关联数据库的同一 EC2 实例或其它资源访问端点。要为此代理设置跨 VPC 访问，请选择原定设置值以外的 VPC。有关跨 VPC 访问的更多信息，请参阅 [访问 VPC 中的 RDS 数据库](rds-proxy-endpoints.md#rds-proxy-cross-vpc)。

1.  对于**端点网络类型**，选择代理端点的 IP 版本。可用选项如下：
   + **IPv4** — 代理端点仅使用 IPv4 地址（默认）。
   + **IPv6** — 代理端点仅使用 IPv6 地址。
   + **双栈** — 代理端点同时支持 IPv4 和 IPv6 地址。

   要使用 IPv6 或双栈，必须将您的 VPC 和子网配置为支持所选的网络类型。

1.  对于**子网**，预设情况下，RDS Proxy 会填充与关联代理相同的子网。要限制对端点的访问，以便只有 VPC 的地址范围的一部分能够与其连接，请删除一个或多个子网。

1.  对于 **VPC security group (VPC 安全组)**，您可以选择现有安全组或创建新安全组。默认情况下，RDS Proxy 会填充与关联代理相同的一个或多个安全组。如果代理的入站和出站规则适用于此端点，则保留默认选项。

    如果选择创建新的安全组，请在此页面上为该安全组指定一个名称。然后，从 EC2 控制台编辑安全组设置。

1.  选择 **Create proxy endpoint（创建代理终端节点）**。

## AWS CLI
<a name="rds-proxy-endpoints.CreatingEndpoint.CLI"></a>

 要创建代理终端节点，请使用 AWS CLI[create-db-proxy-endpoint](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-proxy-endpoint.html) 命令。

 包括以下必需参数：
+  `--db-proxy-name value` 
+  `--db-proxy-endpoint-name value` 
+  `--vpc-subnet-ids list_of_ids`。用空格分隔子网 ID。您无需指定 VPC 本身的 ID。

 您还可以包括以下可选参数：
+  `--target-role { READ_WRITE | READ_ONLY }`此参数默认为 `READ_WRITE`。当代理与仅包含写入器数据库实例的多可用区数据库集群相关联时，您不能指定 `READ_ONLY`。有关将只读端点与多可用区数据库集群结合使用的详细信息，请参阅 [多可用区数据库集群的读取器终端节点](rds-proxy-endpoints.md#rds-proxy-endpoints-reader-stub)。
+  `--vpc-security-group-ids value`。用空格分隔安全组 ID。如果省略此参数，则 RDS Proxy 使用 VPC 的默认安全组。RDS Proxy 根据您为 `--vpc-subnet-ids` 参数指定的子网 ID 确定 VPC。
+  `--endpoint-network-type { IPV4 | IPV6 | DUAL }`。此参数指定代理端点的 IP 版本。默认值为 `IPV4`。要使用 `IPV6` 或 `DUAL`，必须将您的 VPC 和子网配置为支持所选网络类型。

**Example**  
 下面的示例用于创建一个名为 `my-endpoint` 的代理终端节点。  
对于 Linux、macOS 或 Unix：  

```
aws rds create-db-proxy-endpoint \
  --db-proxy-name my-proxy \
  --db-proxy-endpoint-name my-endpoint \
  --vpc-subnet-ids subnet_id subnet_id subnet_id ... \
  --target-role READ_ONLY \
  --vpc-security-group-ids security_group_id \
  --endpoint-network-type DUAL
```
对于：Windows  

```
aws rds create-db-proxy-endpoint ^
  --db-proxy-name my-proxy ^
  --db-proxy-endpoint-name my-endpoint ^
  --vpc-subnet-ids subnet_id_1 subnet_id_2 subnet_id_3 ... ^
  --target-role READ_ONLY ^
  --vpc-security-group-ids security_group_id ^
  --endpoint-network-type DUAL
```

## RDS API
<a name="rds-proxy-endpoints.CreatingEndpoint.API"></a>

 要创建代理端点，请使用 RDS API [CreateDBProxyEndpoint](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBProxyEndpoint.html) 操作。

# 查看代理终端节点
<a name="rds-proxy-endpoints.DescribingEndpoint"></a>

要查看现有代理端点，请按照以下说明进行操作：

## 控制台
<a name="rds-proxy-endpoints.DescribingEndpoint.CON"></a>

**查看代理终端节点的详细信息**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1.  在导航窗格中，选择 **Proxies (代理)**。

1.  在列表中，选择要查看其终端节点的代理。单击代理名称以查看其详细信息页面。

1.  在 **Proxy endpoints（代理终端节点）**部分中，选择要查看的终端节点。单击其名称以查看详细信息页面。

1.  检查您对其值感兴趣的参数。您可以检查以下属性：
   +  终端节点是读/写还是只读。
   +  您在数据库连接字符串中使用的终端节点地址。
   +  与终端节点关联的 VPC、子网和安全组。

## AWS CLI
<a name="rds-proxy-endpoints.DescribingEndpoint.CLI"></a>

 要查看一个或多个代理端点，请使用 AWS CLI [describe-db-proxy-endpoints](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxy-endpoints.html) 命令。

 您可以包括以下参数：
+  `--db-proxy-endpoint-name` 
+  `--db-proxy-name` 

 以下示例描述了 `my-endpoint` 代理终端节点：

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds describe-db-proxy-endpoints \
  --db-proxy-endpoint-name my-endpoint
```
对于 Windows：  

```
aws rds describe-db-proxy-endpoints ^
  --db-proxy-endpoint-name my-endpoint
```

## RDS API
<a name="rds-proxy-endpoints.DescribingEndpoint.API"></a>

 要描述一个或多个代理终端节点，请使用 RDS API [DescribeDBProxyEndpoints](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBProxyEndpoints.html) 操作。

# 修改代理终端节点
<a name="rds-proxy-endpoints.ModifyingEndpoint"></a>

要修改代理端点，请按照以下说明进行操作：

## 控制台
<a name="rds-proxy-endpoints.ModifyingEndpoint.CON"></a>

**修改一个或多个代理终端节点**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1.  在导航窗格中，选择 **Proxies (代理)**。

1. 在列表中，选择要修改其终端节点的代理。单击代理名称以查看其详细信息页面。

1.  在 **Proxy endpoints（代理终端节点）**部分中，选择要修改的终端节点。您可以在列表中选择它，也可以单击其名称以查看详细信息页面。

1.  在代理详细信息页面上的 **Proxy endpoints（代理终端节点）**部分中，选择 **Edit（编辑）**。或者，在代理端点详细信息页面上，对**操作**，选择**编辑**。

1.  更改要修改的参数的值。

1.  选择 **Save changes（保存更改）**。

## AWS CLI
<a name="rds-proxy-endpoints.ModifyingEndpoint.CLI"></a>

 要修改代理端点，请使用 AWS CLI [modify-db-proxy-endpoint](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-proxy-endpoint.html) 命令和以下必需参数：
+  `--db-proxy-endpoint-name` 

 使用以下一个或多个参数指定对终端节点属性的更改：
+  `--new-db-proxy-endpoint-name` 
+  `--vpc-security-group-ids`。用空格分隔安全组 ID。

 以下示例用于将 `my-endpoint` 代理终端节点重命名为 `new-endpoint-name`。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds modify-db-proxy-endpoint \
  --db-proxy-endpoint-name my-endpoint \
  --new-db-proxy-endpoint-name new-endpoint-name
```
对于 Windows：  

```
aws rds modify-db-proxy-endpoint ^
  --db-proxy-endpoint-name my-endpoint ^
  --new-db-proxy-endpoint-name new-endpoint-name
```

## RDS API
<a name="rds-proxy-endpoints.ModifyingEndpoint.API"></a>

 要修改代理终端节点，请使用 RDS API [ModifyDBProxyEndpoint](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBProxyEndpoint.html) 操作。

# 删除代理终端节点
<a name="rds-proxy-endpoints.DeletingEndpoint"></a>

 要删除代理的端点，请按照以下说明操作：

**注意**  
 您无法删除 RDS 代理自动为每个代理创建的默认代理端点。  
 删除代理时，RDS Proxy 会自动删除所有关联的终端节点。

## 控制台
<a name="rds-proxy-endpoints.DeleteEndpoint.console"></a>

**使用 AWS 管理控制台 删除代理终端节点**

1.  在导航窗格中，选择 **Proxies (代理)**。

1.  在列表中，选择要删除其终端节点的代理。单击代理名称以查看其详细信息页面。

1.  在 **Proxy endpoints（代理终端节点）**部分中，选择要删除的终端节点。您可以在列表中选择一个或多个终端节点，或单击单个终端节点的名称以查看详细信息页面。

1.  在代理详细信息页面上的 **Proxy endpoints（代理终端节点）**部分中，选择 **Delete（删除）**。或者，在代理端点详细信息页面上，对于**操作**，选择**编辑**。

## AWS CLI
<a name="rds-proxy-endpoints.DeleteEndpoint.cli"></a>

 要删除代理终端节点，请运行 [delete-db-proxy-endpoint](https://docs.aws.amazon.com/cli/latest/reference/rds/delete-db-proxy-endpoint.html) 命令并包含以下必需参数：
+  `--db-proxy-endpoint-name` 

 以下命令用于删除名为 `my-endpoint` 的代理终端节点。

对于 Linux、macOS 或 Unix：

```
aws rds delete-db-proxy-endpoint \
  --db-proxy-endpoint-name my-endpoint
```

对于 Windows：

```
aws rds delete-db-proxy-endpoint ^
  --db-proxy-endpoint-name my-endpoint
```

## RDS API
<a name="rds-proxy-endpoints.DeleteEndpoint.api"></a>

 要使用 RDS API 删除代理终端节点，请运行 [DeleteDBProxyEndpoint](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DeleteDBProxyEndpoint.html) 操作。对于 `DBProxyEndpointName` 参数，指定代理终端节点的名称。

# 使用 Amazon CloudWatch 监控 RDS Proxy 指标
<a name="rds-proxy.monitoring"></a>

 您可以使用 Amazon CloudWatch 监控 RDS Proxy。CloudWatch 可从代理收集和处理原始数据，并将数据处理为便于读取的近乎实时的指标。要在 CloudWatch 控制台中查找这些指标，请依次选择 **Metrics (指标)**、**RDS** 和 **Per-Proxy Metrics (每个代理指标)**。有关更多信息，请参阅 Amazon CloudWatch 用户指南 中的[使用 Amazon CloudWatch 指标](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/working_with_metrics.html)。

**注意**  
 RDS 为与代理关联的每个底层 Amazon EC2 实例发布这些指标。一个代理可能由多个 EC2 实例提供服务。使用 CloudWatch 统计数据可汇总所有关联实例的代理值。  
 其中一些指标可能在代理第一次成功连接之后才可见。

 在 RDS Proxy 日志中，每个条目都以关联的代理终端节点的名称作为前缀。此名称可以是您为用户定义的端点指定的名称，或者是执行读/写请求的代理的默认端点的特殊名称 `default`。

 所有 RDS Proxy 指标都在 `proxy` 组中。

 每个代理终端节点都有自己的 CloudWatch 指标。您可以单独监控每个代理终端节点的使用情况。有关代理终端节点的更多信息，请参阅 [使用 Amazon RDS Proxy 终端节点](rds-proxy-endpoints.md)。

 您可以使用以下维度集之一聚合每个指标的值。例如，通过使用 `ProxyName` 维度集，您可以分析特定代理的所有流量。通过使用其他维度集，您可以用不同的方式拆分指标。您可以根据每个代理的不同终端节点或目标数据库，或者每个数据库的读/写和只读流量来拆分指标。
+   维度集 1：`ProxyName`
+   维度集 2：`ProxyName`、`EndpointName`
+   维度集 3：`ProxyName`、`TargetGroup`、`Target`
+   维度集 4：`ProxyName`、`TargetGroup`、`TargetRole`


|  指标  |  描述  |  有效期  |  CloudWatch 维度集  | 
| --- | --- | --- | --- | 
|  `AvailabilityPercentage`   |   目标组在维度指示的角色中可用的时间百分比。每分钟报告一次此指标。此指标最有用的统计数据是 `Sum`。  |  1 minute  |  [Dimension set 4](#proxy-dimension-set-4)  | 
| ClientConnections  |   当前客户端连接数。每分钟报告一次此指标。此指标最有用的统计数据是 `Sum`。  |   1 minute   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| ClientConnectionsClosed  |   已关闭的客户端连接数。此指标最有用的统计数据是 `Sum`。  |   1 分钟及更久   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| ClientConnectionsInSetup |  已打开但尚未完成设置的当前客户端连接数量。每分钟报告一次此指标。该指标最有用的统计数据是 Sum。  |  1 minute  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
|  `ClientConnectionsNoTLS`   |  当前没有传输层安全性 (TLS) 的客户端连接的数量。每分钟报告一次此指标。此指标最有用的统计数据是 Sum。 |  1 minute |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
|  `ClientConnectionsReceived`   |   收到的客户端连接请求数。此指标最有用的统计数据是 `Sum`。  |   1 分钟及更久   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| ClientConnectionsSetupFailedAuth  |   由于身份验证或 TLS 配置错误而失败的客户端连接尝试次数。此指标最有用的统计数据是 `Sum`。  |   1 分钟及更久   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| ClientConnectionsSetupSucceeded  |   使用任何具有或不具有 TLS 的身份验证机制成功建立的客户端连接数。此指标最有用的统计数据是 `Sum`。  |   1 分钟及更久   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| ClientConnectionsTLS  |  当前具有 TLS 的客户端连接的数量。每分钟报告一次此指标。此指标最有用的统计数据是 Sum。 | 1 minute |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| DatabaseConnectionRequests  |   创建数据库连接的请求数。此指标最有用的统计数据是 `Sum`。  |   1 分钟及更久   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
|  `DatabaseConnectionRequestsWithTLS`   |  创建具有 TLS 的数据库连接的请求数。此指标最有用的统计数据是 Sum。 |  1 分钟及更久  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| DatabaseConnections  |   当前数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 `Sum`。  |   1 minute   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
|  `DatabaseConnectionsBorrowLatency`   |  被监视的代理建立数据库连接所花费的时间（以微秒为单位）。此指标最有用的统计数据是 Sum。 |  1 分钟及更久  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| DatabaseConnectionsCurrentlyBorrowed  |   当前处于借用状态的数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 `Sum`。  |   1 minute   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| DatabaseConnectionsCurrentlyInTransaction  |   事务中的当前数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 `Sum`。  |   1 minute   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| DatabaseConnectionsCurrentlySessionPinned  |   由于客户端请求中更改会话状态的操作，当前固定的当前数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 `Sum`。  |   1 minute   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| DatabaseConnectionsSetupFailed  |   失败的数据库连接请求数。此指标最有用的统计数据是 `Sum`。  |   1 分钟及更久   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| DatabaseConnectionsSetupSucceeded  |   使用或不使用 TLS 成功建立的数据库连接数。此指标最有用的统计数据是 `Sum`。  |   1 分钟及更久   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
|  `DatabaseConnectionsWithTLS`   |  具有 TLS 的当前数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 Sum。 |  1 minute  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| MaxDatabaseConnectionsAllowed  |   允许的最大数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 `Sum`。  |   1 minute   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
|  `QueryDatabaseResponseLatency`   |  数据库响应查询所花费的时间（以微秒为单位）。此指标最有用的统计数据是 Average。 |  1 分钟及更久  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2), [Dimension set 3](#proxy-dimension-set-3), [Dimension set 4](#proxy-dimension-set-4)  | 
| QueryRequests  |   收到的查询数。包含多个语句的查询被计为一个查询。此指标最有用的统计数据是 `Sum`。  |   1 分钟及更久   |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| QueryRequestsNoTLS  |  从非 TLS 连接收到的查询数。包含多个语句的查询被计为一个查询。此指标最有用的统计数据是 Sum。 |  1 分钟及更久  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
|  `QueryRequestsTLS`   |  从 TLS 连接收到的查询数。包含多个语句的查询被计为一个查询。此指标最有用的统计数据是 Sum。 |  1 分钟及更久  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 
| QueryResponseLatency  |  从获取查询请求到代理响应该请求的时间（以微秒为单位）。此指标最有用的统计数据是 Average。 |  1 分钟及更久  |  [Dimension set 1](#proxy-dimension-set-1), [Dimension set 2](#proxy-dimension-set-2)  | 

 您可以在AWS 管理控制台中的 CloudWatch 下找到 RDS Proxy 活动的日志。每个代理在 **Log groups (日志组)** 页面中都有一个条目。

**重要**  
 这些日志供相关人员进行故障排除，而不是用于编程访问。日志的格式和内容可能会发生变化。  
 特别是，较旧的日志不包含指示每个请求的终端节点的任何前缀。在较新的日志中，每个条目都以关联的代理终端节点的名称作为前缀。此名称可以是您为用户定义的终端节点指定的名称，也可以是使用代理的默认终端节点的请求的特殊名称 `default`。

# 使用 RDS 代理事件
<a name="rds-proxy.events"></a>

*事件*表示环境中发生的更改，例如 AWS 环境或软件即服务（SaaS）合作伙伴中的服务或应用程序。也可以是您自己的一个自定义应用程序或服务。例如，Amazon RDS 在创建或修改 RDS Proxy 时生成事件。Amazon RDS 将事件近乎实时地传输到 Amazon EventBridge。接下来，您可以查找可以订阅的 RDS Proxy 事件列表以及 RDS Proxy 事件示例。

有关使用事件的详细信息，请参阅以下内容：
+ 有关如何使用 AWS 管理控制台、AWS CLI 或 RDS API 查看事件的说明，请参阅 [查看 Amazon RDS 事件](USER_ListEvents.md)。
+ 若要了解如何配置 Amazon RDS 向 EventBridge 发送事件，请参阅 [创建对 Amazon RDS 事件触发的规则](rds-cloud-watch-events.md)。

## RDS Proxy 事件
<a name="rds-proxy.events.list"></a>

下表显示了 RDS Proxy 为源类型时的事件类别和事件列表。


|  类别  | RDS 事件 ID |  消息  |  注意  | 
| --- | --- | --- | --- | 
| 配置更改 | RDS-EVENT-0204 |  RDS 修改了数据库代理 *name*。  | 无 | 
| 配置更改 | RDS-EVENT-0207 |  RDS 修改了数据库代理 *name* 的端点。  | 无 | 
| 配置更改 | RDS-EVENT-0213 |  RDS 检测到已添加数据库实例并自动将其添加到数据库代理 *name* 的目标组。  | 无 | 
|  配置更改  | RDS-EVENT-0214 |  RDS 检测到已删除数据库实例 *name* 并自动将其从数据库代理 *name* 的目标组 *name* 中删除。  | 无 | 
|  配置更改  | RDS-EVENT-0215 |  RDS 检测到已删除数据库集群 *name* 并自动将其从数据库代理 *name* 的目标组 *name* 中删除。  | 无 | 
|  创建  | RDS-EVENT-0203 |  RDS 创建了数据库代理 *name*。  | 无 | 
|  创建  | RDS-EVENT-0206 |  RDS 为数据库代理 *name* 创建了端点 *name*。  | 无 | 
| 删除 | RDS-EVENT-0205 |  RDS 删除了数据库代理 *name*。  | 无 | 
|  删除  | RDS-EVENT-0208 |  RDS 删除了数据库代理 *name* 的端点 *name*。  | 无 | 
|  失败  | RDS-EVENT-0243 |  RDS 无法为代理 *name* 预调配容量，因为您的子网 *name* 中没有足够的 IP 地址可用。要解决此问题，请确保您的子网具有最少的未使用 IP 地址数（如 RDS 代理文档中所建议）。  |  要确定您的实例类的建议数量，请参阅[计划 IP 地址容量](rds-proxy-network-prereqs.md#rds-proxy-network-prereqs.plan-ip-address)。  | 
|  失败 | RDS-EVENT-0275 |  RDS 限制了一些与数据库代理*名称*的连接。从客户端到代理的并发连接请求数已超出了限制。  | 无 | 

以下是采用 JSON 格式的 RDS 代理事件示例。该事件显示 RDS 已修改名为 `my-rds-proxy` 的 RDS Proxy 的名为 `my-endpoint` 的端点。事件 ID 为 RDS-EVENT-0207。

```
{
  "version": "0",
  "id": "68f6e973-1a0c-d37b-f2f2-94a7f62ffd4e",
  "detail-type": "RDS DB Proxy Event",
  "source": "aws.rds",
  "account": "123456789012",
  "time": "2018-09-27T22:36:43Z",
  "region": "us-east-1",
  "resources": [
     "arn:aws:rds:us-east-1:123456789012:db-proxy:my-rds-proxy"
  ],
  "detail": {
    "EventCategories": [
      "configuration change"
    ],
    "SourceType": "DB_PROXY",
    "SourceArn": "arn:aws:rds:us-east-1:123456789012:db-proxy:my-rds-proxy",
    "Date": "2018-09-27T22:36:43.292Z",
    "Message": "RDS modified endpoint my-endpoint of DB Proxy my-rds-proxy.",
    "SourceIdentifier": "my-endpoint",
    "EventID": "RDS-EVENT-0207"
  }
}
```

# RDS 代理故障排除
<a name="rds-proxy.troubleshooting"></a>

 下面，您可以找到一些常见 RDS 代理问题的故障排除思路，以及有关 RDS Proxy 的 CloudWatch Logs 的信息。

 在 RDS Proxy 日志中，每个条目都以关联的代理终端节点的名称作为前缀。此名称可以是您为用户定义的端点指定的名称。或者，对于执行读/写请求的代理的默认端点，它可以是特殊名称 `default`。有关代理终端节点的更多信息，请参阅 [使用 Amazon RDS Proxy 终端节点](rds-proxy-endpoints.md)。

**Topics**
+ [验证代理的连接](#rds-proxy-verifying)
+ [常见问题和解决方案](#rds-proxy-diagnosis)
+ [排查 RDS for MySQL 的 RDS 代理问题](#rds-proxy-MySQL-troubleshooting)
+ [排查 RDS for PostgreSQL 的 RDS 代理问题](#rds-proxy-PostgreSQL-troubleshooting)

## 验证代理的连接
<a name="rds-proxy-verifying"></a>

 您可以使用以下命令验证连接中的所有组件（例如代理、数据库和计算实例）是否均可相互进行通信。

 使用 [describe-db-proxies](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxies.html) 命令检查代理本身。此外，使用 [describe-db-proxy-target-groups](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxy-target-groups.html) 命令检查关联的目标组。检查目标的详细信息是否与您打算与代理关联的 RDS 数据库实例匹配。使用如下命令。

```
aws rds describe-db-proxies --db-proxy-name $DB_PROXY_NAME
aws rds describe-db-proxy-target-groups --db-proxy-name $DB_PROXY_NAME
```

 要确认代理可以连接到底层数据库，请使用 [describe-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxy-targets.html) 命令检查目标组中指定的目标。使用如下命令。

```
aws rds describe-db-proxy-targets --db-proxy-name $DB_PROXY_NAME
```

 [describe-db-proxy-targets](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-proxy-targets.html) 命令的输出包括一个 `TargetHealth` 字段。您可以检查 `State` 内部的字段 `Reason`、`Description` 和 `TargetHealth`，以检查代理是否可以与底层数据库实例进行通信。
+  `State` 值 `AVAILABLE` 表示代理可以连接到数据库实例。
+  `State` 值 `UNAVAILABLE` 表示存在临时或永久的连接问题。在这种情况下，请检查 `Reason` 和 `Description` 字段。例如，如果 `Reason` 的值为 `PENDING_PROXY_CAPACITY`，请在代理完成其扩展操作后，重试连接。如果 `Reason` 的值为 `UNREACHABLE`、`CONNECTION_FAILED` 或 `AUTH_FAILURE`，请使用 `Description` 字段中的说明来帮助您诊断问题。
+  在更改为 `State` 或 `REGISTERING` 之前，`AVAILABLE` 字段的值可能在短时间内为 `UNAVAILABLE`。

 如果以下 Netcat 命令 (`nc`) 成功，您可以从登录的 EC2 实例或其他系统访问代理终端节点。如果您与代理和关联数据库不在同一 VPC 中，则该命令将报告失败。您可能未在同一 VPC 中就可以直接登录到数据库。但是，除非在同一 VPC 中，否则无法登录到代理。

```
nc -zx MySQL_proxy_endpoint 3306

nc -zx PostgreSQL_proxy_endpoint 5432
```

 您可以使用以下命令来确保 EC2 实例具有所需属性。特别是，EC2 实例的 VPC 必须与代理连接到的 的 VPC 相同。

```
aws ec2 describe-instances --instance-ids your_ec2_instance_id
```

 检查用于代理的 Secrets Manager 密钥。

```
aws secretsmanager list-secrets
aws secretsmanager get-secret-value --secret-id your_secret_id
```

 确保 `get-secret-value` 显示的 `SecretString` 字段被编码为包含 `username` 和 `password` 字段的 JSON 字符串。以下示例显示了 `SecretString` 字段的格式。

```
{
  "ARN": "some_arn",
  "Name": "some_name",
  "VersionId": "some_version_id",
  "SecretString": '{"username":"some_username","password":"some_password"}',
  "VersionStages": [ "some_stage" ],
  "CreatedDate": some_timestamp
}
```

排查 IAM 身份验证问题时，请验证以下内容：
+ 数据库已启用 IAM 身份验证。
+ 代理配置了正确的身份验证方案。
+ 提供给代理的 IAM 角色中的 IAM 策略授予对相应数据库及其用户名的必要 `rds-db:connect` 权限。
+ 对于端到端 IAM 身份验证，存在与 IAM 用户或角色名称匹配的数据库用户。
+ 为连接启用了 SSL/TLS。

## 常见问题和解决方案
<a name="rds-proxy-diagnosis"></a>

本节介绍使用 RDS 代理时的一些常见问题和潜在的解决方案。

运行 `aws rds describe-db-proxy-targets` CLI 命令后，如果 `TargetHealth` 描述显示 `Proxy does not have any registered credentials`，请验证以下内容：
+ 已经为用户注册了访问代理的凭证。
+ 用于访问代理使用的 Secrets Manager 密钥的 IAM 角色是有效的。

创建或连接数据库代理时，您可能会遇到以下 RDS 事件。


| 类别 | RDS 事件 ID | 描述 | 
| --- | --- | --- | 
|  失败  | RDS-EVENT-0243 | RDS 无法为代理预调配容量，因为您的子网中没有足够的 IP 地址可用。要解决此问题，请确保您的子网具有最少的未使用 IP 地址数。要确定您的实例类的建议数量，请参阅[计划 IP 地址容量](rds-proxy-network-prereqs.md#rds-proxy-network-prereqs.plan-ip-address)。 | 
|  失败  | RDS-EVENT-0275 |  RDS 限制了一些与数据库代理*名称*的连接。从客户端到代理的并发连接请求数已超出了限制。  | 

 创建新代理或连接到代理时，您可能会遇到以下问题。


|  错误  |  原因或解决方法  | 
| --- | --- | 
|   `403: The security token included in the request is invalid`   |  选择现有 IAM 角色，而不是选择创建新角色。 | 

## 排查 RDS for MySQL 的 RDS 代理问题
<a name="rds-proxy-MySQL-troubleshooting"></a>

 连接到 MySQL 代理时，您可能会遇到以下问题。


|  错误  |  原因或解决方法  | 
| --- | --- | 
|  ERROR 1040 (HY000): Connections rate limit exceeded (limit\$1value)  |  从客户端到代理的连接请求速率超过了限制。 | 
|  ERROR 1040 (HY000): IAM authentication rate limit exceeded  |  从客户端到代理的具有 IAM 身份验证的并发请求数超过了限制。 | 
|  ERROR 1040 (HY000): Number simultaneous connections exceeded (limit\$1value)  |  从客户端到代理的并发连接请求数超出了限制。 | 
|   `ERROR 1045 (28000): Access denied for user 'DB_USER'@'%' (using password: YES)`   |  代理使用的 Secrets Manager 密钥与现有数据库用户的用户名和密码不匹配。更新 Secrets Manager 密钥中的凭证，或者确保数据库用户存在并且具有与密钥中的密码相同的密码。 | 
|  ERROR 1105 (HY000): Unknown error  |  出现未知错误。 | 
|  ERROR 1231 (42000): Variable ''character\$1set\$1client'' can't be set to the value of value  |   为 `character_set_client` 参数设置的值无效。例如，值 `ucs2` 无效，因为它会导致 MySQL 服务器崩溃。  | 
|  ERROR 3159 (HY000): This RDS Proxy requires TLS connections.  |   您在代理中启用了**需要传输层安全性**设置，但您的连接将参数 `ssl-mode=DISABLED` 包含在 MySQL 客户端中。请执行以下任一操作： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  ERROR 2026 (HY000): SSL connection error: Internal Server Error  |   与代理的 TLS 握手失败。一些可能的原因包括： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  ERROR 9501 (HY000): Timed-out waiting to acquire database connection  |   等待获取数据库连接时代理超时。一些可能的原因包括： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 

## 排查 RDS for PostgreSQL 的 RDS 代理问题
<a name="rds-proxy-PostgreSQL-troubleshooting"></a>

 连接到 PostgreSQL 代理时，您可能会遇到以下问题。


|  错误  |  原因  |  解决方案  | 
| --- | --- | --- | 
|   `ERROR 28000: IAM authentication is allowed only with SSL connections.`   |   用户在 PostgreSQL 客户端中，尝试使用具有设置 `sslmode=disable` 的 IAM 身份验证连接到数据库。  |   用户需要在 PostgreSQL 客户端中使用最小设置 `sslmode=require` 连接到数据库。有关更多信息，请参阅 [PostgreSQL SSL 支持](https://www.postgresql.org/docs/current/libpq-ssl.html)文档。  | 
|  `ERROR 28000: This RDS proxy has no credentials for the role role_name. Check the credentials for this role and try again.`   |   这个角色没有 Secrets Manager 密钥。  |   为此角色添加 Secrets Manager 密钥。有关更多信息，请参阅 [为 RDS 代理配置 IAM 身份验证](rds-proxy-iam-setup.md)。  | 
|  `ERROR 28000: RDS supports only IAM, MD5, or SCRAM authentication.`   |   用于连接到代理的数据库客户端正在使用代理当前不支持的身份验证机制。  |   如果您不使用 IAM 身份验证，请使用 MD5 或 SCRAM 密码身份验证。  | 
|  `ERROR 28000: A user name is missing from the connection startup packet. Provide a user name for this connection.`   |   用于连接到代理的数据库客户端在尝试建立连接时未发送用户名。  |   请确保在使用您选择的 PostgreSQL 客户端设置与代理的连接时定义用户名。  | 
|  `ERROR 28000: IAM is allowed only with SSL connections.`   |   客户端尝试使用 IAM 身份验证进行连接，但未启用 SSL。  |   在 PostgreSQL 客户端中启用 SSL。  | 
|  `ERROR 28000: This RDS Proxy requires TLS connections.`   |   用户启用了**需要传输层安全性**选项，但尝试在 PostgreSQL 客户端中使用 `sslmode=disable` 进行连接。  |   要修复此错误，请执行以下操作之一： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  `ERROR 28P01: IAM authentication failed for user user_name. Check the IAM token for this user and try again.`   |   该错误可能是由于以下原因引起的： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  |   要修复此错误，请执行以下操作： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  `ERROR 28P01: The password that was provided for the role role_name is wrong.`   |   此角色的密码与 Secrets Manager 密钥不匹配。  |   检查 Secrets Manager 中此角色的密钥，以查看密码是否与 PostgreSQL 客户端中使用的密码相同。  | 
|  `ERROR 28P01: The IAM authentication failed for the role role_name. Check the IAM token for this role and try again.`   |   用于 IAM 身份验证的 IAM 令牌存在问题。  |   生成新的身份验证令牌并在新连接中使用它。  | 
|  `ERROR 0A000: Feature not supported: RDS Proxy supports only version 3.0 of the PostgreSQL messaging protocol.`   |   用于连接到代理的 PostgreSQL 客户端使用早于 3.0 的协议。  |   使用支持 3.0 消息传递协议的较新 PostgreSQL 客户端。如果您使用的是 PostgreSQL `psql` CLI，请使用大于或等于 7.4 的版本。  | 
|  `ERROR 0A000: Feature not supported: RDS Proxy currently doesn't support streaming replication mode.`   |   用于连接到代理的 PostgreSQL 客户端正在尝试使用流复制模式，该模式目前不受 RDS 代理支持。  |   在用于连接的 PostgreSQL 客户端中关闭流复制模式。  | 
|  `ERROR 0A000: Feature not supported: RDS Proxy currently doesn't support the option option_name.`   |   通过启动消息，用于连接到代理的 PostgreSQL 客户端正在请求 RDS 代理当前不支持的选项。  |   在用于连接的 PostgreSQL 客户端中，关闭上述消息中显示为不支持的选项。  | 
|  `ERROR 53300: The IAM authentication failed because of too many competing requests.`   |   从客户端到代理的具有 IAM 身份验证的并发请求数超过了限制。  |   降低使用 PostgreSQL 客户端中的 IAM 身份验证建立连接的速率。  | 
|  `ERROR 53300: The maximum number of client connections to the proxy exceeded number_value.`   |   从客户端到代理的并发连接请求数超出了限制。  |   减少从 PostgreSQL 客户端到此 RDS 代理的活动连接数。  | 
|  `ERROR 53300: Rate of connection to proxy exceeded number_value.`   |   从客户端到代理的连接请求速率超过了限制。  |   降低从 PostgreSQL 客户端建立连接的速率。  | 
|  `ERROR XX000: Unknown error.`   |   出现未知错误。  |   请联系 AWS Support，以便我们调查此问题。  | 
|  `ERROR 08000: Timed-out waiting to acquire database connection.`   |   代理在 `ConnectionBorrowTimeout` 设置指定的持续时间内等待获取数据库连接时超时。一些可能的原因包括： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  |   可能的解决方案包括以下各项： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/rds-proxy.troubleshooting.html)  | 
|  `ERROR XX000: Request returned an error: database_error.`   |   从代理建立的数据库连接返回错误。  |   解决方案取决于特定的数据库错误。示例为：`Request returned an error: database "your-database-name" does not exist`。这意味着数据库服务器上不存在指定的数据库名称。或者，这意味着服务器上不存在用作数据库名称（如果未指定数据库名称）的用户名。  | 
|  `ERROR 53300: The IAM authentication failed because of too many competing requests.`  |  从客户端到代理的具有 IAM 身份验证的并发请求数超过了限制。  |  降低使用 PostgreSQL 客户端中的 IAM 身份验证建立连接的速率。  | 
|  `ERROR 28000: Enable IAM authentication for the client connection to the proxy and try again.`  |  RDS 代理无法连接到数据库，因为客户端与代理的连接未启用 IAM 身份验证。当注册用户将代理的 `DefaultAuthScheme` 参数设置为 `IAM_AUTH`，但客户端使用密码身份验证而非 IAM 身份验证时，就会发生这种情况。  |  为客户端与代理的连接启用 IAM 身份验证，然后重试。  | 
|  `ERROR 28000: Configure IAM authentication as the DefaultAuthScheme in your proxy and try again.`  |  RDS 代理无法连接到数据库，因为 `DefaultAuthScheme` 未设置为 `IAM_AUTH`。代理的 `DefaultAuthScheme` 参数设置为 `NONE`，但客户端正在尝试使用 IAM 身份验证。  |  将代理的 `DefaultAuthScheme` 设置为 `IAM_AUTH`，然后重试。  | 

### 对已删除的 `postgres` 数据库进行故障排除
<a name="rds-proxy-PostgreSQL-troubleshooting.postgresDBDelete"></a>

如果您错误地从实例中删除了 `postgres` 数据库，则需要还原数据库以还原与实例的连接。在数据库实例中运行以下命令：

```
CREATE DATABASE postgres;
GRANT CONNECT ON DATABASE postgres TO rdsproxyadmin;
```

# 将 RDS Proxy 与 AWS CloudFormation 一起使用
<a name="rds-proxy-cfn"></a>

 您可以将 RDS Proxy 与 AWS CloudFormation 一起使用。这有助于您创建相关资源组。此类组可能包含可连接到新创建的 Amazon RDS 数据库实例的代理。CloudFormation 中的 RDS Proxy 支持涉及两种新的注册表类型：`DBProxy` 和 `DBProxyTargetGroup`。

 以下列表显示了 RDS Proxy 的 CloudFormation 模板示例。

```
Resources:
 DBProxy:
   Type: AWS::RDS::DBProxy
   Properties:
     DBProxyName: CanaryProxy
     EngineFamily: MYSQL
     RoleArn:
      Fn::ImportValue: SecretReaderRoleArn
     Auth:
       - {AuthScheme: SECRETS, SecretArn: !ImportValue ProxySecret, IAMAuth: DISABLED}
     VpcSubnetIds:
       Fn::Split: [",", "Fn::ImportValue": SubnetIds]

 ProxyTargetGroup: 
   Type: AWS::RDS::DBProxyTargetGroup
   Properties:
     DBProxyName: CanaryProxy
     TargetGroupName: default
     DBInstanceIdentifiers: 
       - Fn::ImportValue: DBInstanceName
   DependsOn: DBProxy
```

 有关此示例中的资源的更多信息，请参阅 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxy.html) 和 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxytargetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbproxytargetgroup.html)。

 有关您可以使用 CloudFormation 创建的资源的更多信息，请参阅 [RDS 资源类型参考](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/AWS_RDS.html)。