使用 Amazon RDS Proxy 管理连接 - Amazon Aurora
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 Amazon RDS Proxy 管理连接

使用 Amazon RDS Proxy,您可以允许应用程序对数据库连接进行池化和共享以提高其扩展能力。RDS Proxy 通过自动连接到备用数据库实例,同时保留应用程序连接,使应用程序能够更灵活地应对数据库故障。RDS Proxy 还允许您对数据库强制执行 AWS Identity and Access Management (IAM) 身份验证,以及在 AWS Secrets Manager 中安全存储凭证。

注意

RDS Proxy 与 MySQL 和 PostgreSQL 完全兼容。您可以在不更改代码的情况下为大多数应用程序启用 RDS Proxy。

使用 RDS Proxy,您可以处理不可预测的数据库流量激增,这种情况可能由于超额预订连接或快速创建新连接而导致问题。RDS Proxy 建立数据库连接池,并重复使用该池中的连接,而不会因为每次打开新数据库连接而产生内存和 CPU 开销。要防止数据库超额订阅,您可以控制创建的数据库连接数。

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

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

RDS Proxy 概念和术语

您可以通过使用 RDS Proxy 来简化 Amazon RDS 数据库实例和 Amazon Aurora 数据库集群的连接管理。

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

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

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

RDS Proxy 概念概述

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

每个代理处理与单个 RDS 数据库实例或 Aurora 数据库集群的连接。对于 RDS 多可用区数据库实例和 Aurora 预配置集群,代理自动确定当前的写入器实例。对于 Aurora 多主集群,代理连接到其中一个写入器实例,并将其他写入器实例用作热备用目标。

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

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

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

代理有一个终端节点。使用 RDS 数据库实例或 Aurora 数据库集群时,您将连接到该终端节点,而不是连接到直接连至实例或集群的读/写终端节点。Aurora 集群的专用终端节点仍可供您使用。

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

每个代理都包含一个目标组。该目标组包含代理可连接到的 RDS 数据库实例或 Aurora 数据库集群。对于 Aurora 集群,默认情况下,目标组与该集群中的所有数据库实例相关联。这样,代理就可以连接到被提升为集群中的写入器实例的任何 Aurora 数据库实例。与代理关联的 RDS 数据库实例或 Aurora 数据库集群及其实例称为该代理的目标。为方便起见,当您通过控制台创建代理时,RDS Proxy 也会创建相应的目标组并自动注册关联的目标。

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

连接池

每个代理都为其关联的 RDS 或 Aurora 数据库的写入器实例执行连接池。连接池 是一项优化,可减少与打开和关闭连接相关的开销,并可保持许多连接同时打开。该开销包括处理每个新连接所需的内存。此外还包括关闭每个连接和打开新连接所产生的 CPU 开销,例如传输层安全性/安全套接字层 (TLS/SSL) 握手、身份验证、协商功能等。连接池可简化应用程序逻辑。无需编写应用程序代码,即可最大限度地减少同时打开的连接数量。

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

RDS Proxy 安全性

RDS Proxy 使用现有的 RDS 安全机制,如 TLS/SSL 和 AWS Identity and Access Management (IAM)。有关这些安全功能的一般信息,请参阅 Amazon Aurora 中的安全性。如果您不熟悉 RDS 和 Aurora 如何处理身份验证、授权和其他安全领域,请务必先熟悉 RDS 和 Aurora 如何处理这些领域。

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

您将 RDS Proxy 使用的数据库凭证存储在 AWS Secrets Manager 中。代理访问的 RDS 数据库实例或 Aurora 数据库集群的每个数据库用户都必须在 Secrets Manager 中拥有相应的密钥。您还可为 RDS Proxy 的用户设置 IAM 身份验证。这样一来,即使数据库使用本机密码身份验证,您也可以对数据库访问强制执行 IAM 身份验证。我们建议使用这些安全功能,而不是在应用程序代码中嵌入数据库凭证。

将 TLS/SSL 与 RDS Proxy 结合使用

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

注意

RDS Proxy 使用来自 AWS Certificate Manager (ACM) 的证书。如果您使用 RDS Proxy,当您轮换 TLS/SSL 证书时,您不需要更新使用 RDS Proxy 连接的应用程序。

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

RDS Proxy 还可以确保您的会话在客户端与 RDS Proxy 终端节点之间使用 TLS/SSL。要让 RDS Proxy 这样做,请在客户端上指定此要求。没有为使用 RDS Proxy 的数据库 SSL 连接设置 SSL 会话变量。

  • 对于 Amazon RDS MySQL 和 Aurora MySQL,在运行 mysql 命令时使用 --ssl-mode 参数在客户端上指定此要求。

  • 对于 Amazon RDS PostgreSQL 和 Aurora PostgreSQL,在运行 psql 命令时将 sslmode=require 指定为 conninfo 字符串的一部分。

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

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

对于客户端,SSL 模式如下:

PREFERRED

SSL 是首选项,但不是必需项。

DISABLED

不允许使用 SSL。

REQUIRED

强制 SSL。

VERIFY_CA

强制 SSL 并验证证书颁发机构 (CA)。

VERIFY_IDENTITY

强制 SSL 并验证 CA 和 CA 主机名。

将客户端与 --ssl-modeVERIFY_CAVERIFY_IDENTITY 结合使用时,以 .pem 格式指定指向 CA 的 --ssl-ca 选项。对于可使用的 .pem 文件,您可以从 Amazon Trust Services 下载 Amazon Root CA 1 信任存储

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

故障转移

故障转移 是一项高可用性功能,可在原始实例变得不可用时将数据库实例替换为另一个数据库实例。可能会因为数据库实例出现问题而发生故障转移。故障转移也可能是正常维护程序的一部分,例如在数据库升级期间。故障转移适用于多可用区配置中的 RDS 数据库实例,以及除写入器实例外还具有一个或多个读取器实例的 Aurora 数据库集群。

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

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

在数据库故障转移期间,RDS Proxy 将继续接受相同 IP 地址的连接,并自动将连接定向到新的主数据库实例。通过 RDS Proxy 连接的客户端不会受到以下情况的影响:

  • 故障转移时的域名系统 (DNS) 传播延迟。

  • 本地 DNS 缓存。

  • 连接超时。

  • 不确定哪个数据库实例是当前的写入器。

  • 等待来自以前写入器的查询响应,该写入器在未关闭连接的情况下变得不可用。

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

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

事务

单个事务中的所有语句始终使用相同的底层数据库连接。当事务结束时,连接可供另一会话使用。使用事务作为粒度单位会产生以下后果:

  • 启用 RDS MySQL 或 Aurora MySQL autocommit 设置后,每个单独的语句之后都会发生连接重用。

  • 相反,禁用 autocommit 设置后,您在会话中发出的第一个语句会启动新的事务。因此,如果您输入 SELECTINSERTUPDATE 和其他数据操作语言 (DML) 语句的序列,则在您发出 COMMITROLLBACK 或以其他方式结束事务之前不会发生连接重用。

  • 输入数据定义语言 (DDL) 语句会导致事务在该语句完成后结束。

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

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

规划和设置 RDS Proxy

在以下部分中,您可以了解如何设置 RDS Proxy。您还可以了解如何设置相关的安全性选项,以控制哪些人可以访问各个代理,以及各个代理如何连接到数据库实例。

RDS Proxy 的限制

以下限制适用于 RDS Proxy:

  • RDS Proxy 仅在下面的 AWS 区域中可用:

    • 美国东部(弗吉尼亚北部)地区

    • 美国东部(俄亥俄)区域

    • 美国西部(加利福利亚北部)区域

    • 美国西部(俄勒冈)区域

    • 亚太地区(孟买)区域

    • 亚太区域(首尔)

    • 亚太区域(新加坡)

    • 亚太区域(悉尼)

    • 亚太区域(东京)

    • 加拿大 (中部) 区域

    • 欧洲(法兰克福)区域

    • 欧洲(爱尔兰)区域

    • 欧洲(伦敦)区域

  • 每个 AWS 账户 ID 最多可拥有 20 个代理。如果您的应用程序需要更多代理,您可以通过向 AWS Support 组织开立票证来请求其他代理。

  • 每个代理最多可拥有 200 个关联的 Secrets Manager 密钥。因此,每个代理可以在任何给定时间连接多达 200 个不同的用户账户。

  • 在 Aurora 集群中,连接池中的所有连接都由 Aurora 写入器实例处理。要对读取密集型工作负载执行负载均衡,仍然需要直接对 Aurora 集群使用读取器终端节点。

    对于复制配置中的 RDS 数据库实例,要做同样的考虑。您只能将代理与写入器数据库实例关联,而不能与只读副本关联。

  • 不能将 RDS Proxy 与 Aurora Serverless 集群一起使用。

  • 不能将 RDS Proxy 与属于 Aurora 全局数据库一部分的 Aurora 集群一起使用。

  • 您的 RDS Proxy 必须与数据库位于同一 VPC 中。代理无法公开访问,但数据库可以。

  • 不能将 RDS Proxy 与具有专用租赁的 VPC 一起使用。

  • 不能将 RDS Proxy 与自定义 DNS 一起使用。

  • RDS Proxy 可用于 MySQL 和 PostgreSQL 引擎系列。

  • 每个代理都可以与单个目标数据库实例或集群相关联。不过,您可以将多个代理与同一个数据库实例或集群关联。

以下 RDS Proxy 限制适用于 MySQL:

  • MySQL 引擎系列包括 RDS MySQL 5.6 和 5.7 以及 Aurora MySQL 版本 1 和 2。

  • 目前,所有代理均在端口 3306 上侦听 MySQL。代理仍使用您在数据库设置中指定的端口连接到您的数据库。

  • 不能将 RDS Proxy 与 RDS MySQL 8.0 一起使用。

  • 不能将 RDS Proxy 与 EC2 实例中自行管理的 MySQL 数据库一起使用。

  • 代理不支持 MySQL 压缩模式。例如,它们不支持 mysql 命令的 --compress-C 选项使用的压缩。

  • 某些 SQL 语句和函数可以更改连接状态而不会引起固定。有关最新的固定行为,请参阅 避免固定

以下 RDS Proxy 限制适用于 PostgreSQL:

  • 与 PostgreSQL 兼容的 Aurora 引擎系列包括版本 10.11 和 11.5。

  • 目前,所有代理均在端口 5432 上侦听 PostgreSQL。

  • PostgreSQL 不支持查询取消。

  • PostgreSQL 函数 lastval() 的结果并不总是准确的。作为解决方法,请将 INSERT 语句与 RETURNING 子句一起使用。

识别要用于 RDS Proxy 的数据库实例、集群和应用程序

您可以确定哪些数据库实例、集群和应用程序可能从使用 RDS Proxy 中受益匪浅。为此,请考虑以下因素:

  • RDS Proxy 高度可用,部署在多个可用区 (AZ) 上。要确保数据库的总体高可用性,请在多可用区配置中部署 Amazon RDS 数据库实例或 Aurora 集群。

  • 任何出现“连接过多”错误的数据库实例或集群都很适合与代理相关联。代理允许应用程序打开许多客户端连接,而代理管理与数据库实例或集群的少量长期连接。

  • 对于使用较小 AWS 实例类(如 T2 或 T3)的数据库实例或集群,使用代理可以帮助避免内存不足情况。它还可以帮助减少建立连接时的 CPU 开销。处理大量连接时可能会发生这些情况。

  • 您可以监控某些 Amazon CloudWatch 指标,以确定数据库实例或集群是否接近某些类型的限制。这些限制针对连接数以及与连接管理关联的内存。您还可以监控某些 CloudWatch 指标,以确定数据库实例或集群是否处理许多短期连接。打开和关闭此类连接可能会给数据库带来性能开销。有关要监控的指标的信息,请参阅 使用 Amazon CloudWatch 监控 RDS Proxy

  • AWS Lambda 函数也可以很好地使用代理。这些函数进行频繁的短数据库连接,可受益于 RDS Proxy 提供的连接池。您可以利用已为 Lambda 函数提供的任何 IAM 身份验证,而不是在 Lambda 应用程序代码中管理数据库凭证。

  • 使用 PHP 和 Ruby on Rails 等语言和框架的应用程序通常可以很好地使用代理。此类应用程序通常打开和关闭大量数据库连接,并且没有内置的连接池机制。

  • 长时间保持大量连接打开的应用程序通常可以很好地使用代理。诸如软件即服务 (SaaS) 或电子商务等行业中的应用程序通常会使连接保持打开状态,从而最大限度地减少数据库请求的延迟。通过使用 RDS Proxy,与直接连接到数据库实例或集群时相比,应用程序可以保持更多的连接为打开状态。

  • 由于为所有数据库实例和集群设置此类身份验证较为复杂,您可能尚未采用 IAM 身份验证和 Secrets Manager。如果是这样,您可以保留现有的身份验证方法,并将身份验证委派给代理。代理可以为特定应用程序的客户端连接强制执行身份验证策略。您可以利用已为 Lambda 函数提供的任何 IAM 身份验证,而不是在 Lambda 应用程序代码中管理数据库凭证。

设置网络先决条件

使用 RDS Proxy 要求您拥有一组联网资源。这些资源包括 Virtual Private Cloud (VPC)、两个或更多子网、相同 VPC 内的 Amazon EC2 实例和一个互联网网关。如果已成功连接到任何 RDS 数据库实例或 Aurora 数据库集群,则您已拥有所需的网络资源。如果您刚刚开始使用 RDS 或 Aurora,您可以遵循为 Amazon Aurora 设置环境中的过程,了解连接到数据库的基础知识。您也可以按照 Amazon Aurora 入门 中的教程进行操作。

在 AWS Secrets Manager 中设置数据库凭证

对于您创建的每个代理,首先使用 Secrets Manager 服务来存储用户名和密码凭证集。您可以在 RDS 数据库实例或 Aurora 数据库集群上,为代理连接到的每个数据库用户账户分别创建 Secrets Manager 密钥。

在 Secrets Manager 中,您可以使用 usernamepassword 字段的值创建这些密钥。这样一来,代理可以连接到与代理关联的任何 RDS 数据库实例或 Aurora 数据库集群上的相应数据库用户。为此,您可以使用 Credentials for other database (其他数据库的凭证)Credentials for RDS database (RDS 数据库凭证)Other type of secrets (其他密钥类型) 设置。为用户名密码字段填写相应的值,以及任何其他必填字段的占位符值。代理会忽略其他存在于密钥中的字段,如主机端口。这些详细信息由代理自动提供。

您也可以选择其他密钥类型。在这种情况下,您可以使用名为 usernamepassword 的键创建密钥。

由于代理使用的密钥不与特定数据库服务器绑定,因此,如果在多个数据库服务器上使用相同的凭证,则可对多个代理重用一个密钥。例如,您可以在一组开发和测试服务器上使用相同的凭证。

要以特定用户身份通过代理进行连接,请确保与密钥关联的密码与该用户的数据库密码相匹配。如果不匹配,您可以在 Secrets Manager 中更新关联的密钥。在这种情况下,您仍然可以连接到密钥凭证和数据库密码确实匹配的其他账户。

通过 AWS CLI 或 RDS API 创建代理时,请为代理可访问的所有数据库用户账户指定相应密钥的 Amazon 资源名称 (ARN)。在 AWS 管理控制台 中,根据描述性名称选择密钥。

有关在 Secrets Manager 中创建密钥的说明,请参阅 Secrets Manager 文档中的创建密钥页面。使用下面的方法之一。有关在 Secrets Manager 中创建密钥的说明,请参阅 AWS Secrets Manager 用户指南 中的创建密钥。使用下面的方法之一:

  • 使用控制台中的 Secrets Manager

  • 要使用 CLI 创建与RDS Proxy 一起使用的 Secrets Manager 密钥,请使用类似如下的命令。

    aws secretsmanager create-secret --name "secret_name" --description "secret_description" --region region_name --secret-string '{"username":"db_user","password":"db_user_password"}'

例如,以下命令为两个数据库用户(一个名为 admin,另一个名为 app-user)创建 Secrets Manager 密钥。

aws secretsmanager create-secret \ --name admin_secret_name --description "db admin user" \ --secret-string '{"username":"admin","password":"choose_your_own_password"}' aws secretsmanager create-secret \ --name proxy_secret_name --description "application user" \ --secret-string '{"username":"app-user","password":"choose_your_own_password"}'

设置 AWS Identity and Access Management (IAM) 策略

在 Secrets Manager 中创建密钥后,请创建一个可以访问这些密钥的 IAM 策略。有关将 IAM 与 RDS 和 Aurora 结合使用的一般信息,请参阅Amazon Aurora 中的 Identity and Access Management

提示

如果您使用 IAM 控制台,则应用下面的过程。如果您使用 AWS 管理控制台 for RDS,RDS 可以自动为您创建 IAM 策略。在这种情况下,您可以跳过下面的过程。

创建用于访问您的 Secrets Manager 密钥以便与代理一起使用的 IAM 策略

  1. 登录到 IAM 控制台。按照创建角色过程操作,如创建 IAM 角色中所述。包括将角色添加到数据库步骤。

  2. 对于新角色,请执行添加内联策略步骤。使用与编辑 IAM 策略中相同的一般过程。将下面的 JSON 粘贴到 JSON 文本框中。替换您自己的账户 ID。将您的 AWS 区域替换为 us-east-2。将 Amazon 资源名称 (ARN) 替换为您创建的密钥。对于 kms:Decrypt 操作,请替换默认 KMS 密钥或您自己的 KMS 密钥的 ARN,具体取决于您用来加密 Secrets Manager 密钥的密钥。

    { "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" } } } ] }
  3. 编辑此 IAM 策略的信任策略。将下面的 JSON 粘贴到 JSON 文本框中。

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

以下命令通过 AWS CLI 执行相同的操作。

PREFIX=choose_an_identifier aws iam create-role --role-name choose_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 same_role_name_as_previous \ --policy-name $PREFIX-secret-reader-policy --policy-document """ same_json_as_in_previous_example """ aws kms create-key --description "$PREFIX-test-key" --policy """ { "Id":"$PREFIX-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":"*" } ] } """

创建 RDS Proxy

要管理指定数据库实例集的连接,您可以创建代理。您可以将代理与 RDS MySQL 数据库实例、PostgreSQL 数据库实例或 Aurora 数据库集群关联。

创建代理

  1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择 Proxies (代理)

  3. 选择 Create proxy (创建代理)

  4. 为您的代理选择所有设置。

    对于代理配置,请提供以下信息:

    • 代理标识符。指定选择的名称,该名称在您的 AWS 账户 ID 和当前 AWS 区域内唯一。

    • 引擎兼容性。选择 MySQLPOSTGRESQL

    • 需要传输层安全性。如果您希望代理对所有客户端连接强制执行 TLS/SSL,则选择此设置。如果您使用与代理的加密或未加密连接,则代理在与底层数据库建立连接时使用相同的加密设置。

    • 空闲客户端连接超时。选择在代理关闭客户端连接之前该连接可以处于空闲状态的时间段。默认值为 1800 秒(30 分钟)。如果应用程序未在上一请求完成后的指定时间内提交新请求,则客户端连接视为空闲。底层数据库连接保持打开状态并返回到连接池。因此,它可以重复用于新的客户端连接。

      如果您希望代理主动删除过时的连接,请考虑减少空闲客户端连接超时。如果您的工作负载会出现峰值,请考虑增加空闲客户端连接超时以节省建立连接的成本。

    对于目标组配置,请提供以下信息:

    • 数据库。选择一个要通过此代理访问的 RDS 数据库实例或 Aurora 数据库集群。该列表仅包含具有兼容数据库引擎、引擎版本和其他设置的数据库实例和集群。如果列表为空,请创建与 RDS Proxy 兼容的新数据库实例或集群。为此,请按照 创建 Amazon Aurora 数据库集群 中的过程操作。然后尝试再次创建代理。

    • 连接池最大连接数。指定一个从 1 到 100 的值。此设置表示 RDS Proxy 可用于其连接的 max_connections 值的百分比。如果您只打算对此数据库实例或集群使用一个代理,可以将此值设置为 100。有关 RDS Proxy 如何使用此设置的详细信息,请参阅 控制连接限制和超时

    • Session pinning filters (会话固定筛选条件)。(可选)这是一项高级设置,用于解决特定应用程序的性能问题。目前,唯一的选择是 EXCLUDE_VARIABLE_SETS。只有同时满足以下两个条件时才选择一个筛选条件:您的应用程序由于某些类型的 SQL 语句而未重用连接,并且您可以验证使用这些 SQL 语句重用连接不会影响应用程序的正确性。有关更多信息,请参阅避免固定

    • Connection borrow timeout (连接借用超时)。在某些情况下,您可能希望代理有时使用所有可用的数据库连接。在这种情况下,您可以指定在返回超时错误之前代理等待数据库连接可用的时间。您最多可以指定五分钟的时间段。仅当代理已打开最大连接数并且所有连接均已在使用时,该设置才适用。

    对于连接,请提供以下信息:

    • Secrets Manager ARN。至少选择一个 Secrets Manager 密钥,该密钥包含要使用此代理访问的 RDS 数据库实例或 Aurora 数据库集群的数据库用户凭证。

    • IAM role (IAM 角色)。选择一个有权访问您之前所选的 Secrets Manager 密钥的 IAM 角色。您还可以选择 AWS 管理控制台 来创建新 IAM 角色并使用该角色。

    • IAM Authentication (IAM 身份验证)。选择是要求还是禁止对代理连接进行 IAM 身份验证。IAM 身份验证或本机数据库身份验证的选择适用于访问此代理的所有数据库用户。

    • Subnets (子网)。此字段预填充与您的 VPC 关联的所有子网。您可以删除此代理不需要的任何子网。必须至少保留两个子网。

    提供其他连接配置:

    • VPC security group (VPC 安全组)。选择现有的 VPC 安全组。您还可以选择 AWS 管理控制台 来创建新安全组并使用该安全组。

      注意

      该安全组必须允许访问代理连接到的数据库。同一安全组用于从应用程序到代理的入口以及从代理到数据库的出口。例如,假设您对数据库和代理使用同一安全组。在这种情况下,请确保您指定该安全组中的资源可以与同一安全组中的其他资源进行通信。

    (可选)提供高级配置:

    • Enable enhanced logging (启用增强型日志记录)。您可以启用该设置来解决代理兼容性或性能问题。

      启用该设置后,RDS Proxy 会在其日志中包含有关 SQL 语句的详细信息。这些信息可帮助您调试涉及 SQL 行为或代理连接的性能和可扩展性的问题。调试信息包括您通过代理提交的 SQL 语句的文本。因此,只有在需要调试,并且仅当您已采取安全措施来保护日志中显示的任何敏感信息时,才启用该设置。

      为了最大限度地减少与代理相关的开销,在您启用该设置 24 小时后,RDS Proxy 会自动禁用它。暂时启用它以解决特定问题。

  5. 选择 Create Proxy (创建代理)

要创建代理,请使用 AWS CLI 命令 create-db-proxy--engine-family 值区分大小写。

对于 Linux、macOS 或 Unix:

aws rds create-db-proxy \ --db-proxy-name proxy_name \ --role-arn iam_role \ --engine-family { MYSQL | POSTGRESQL } \ --vpc-subnet-ids space_separated_list \ [--vpc-security-group-ids space_separated_list] \ [--auth ProxyAuthenticationConfig_JSON_string] \ [--require-tls | --no-require-tls] \ [--idle-client-timeout value] \ [--debug-logging | --no-debug-logging] \ [--tags comma_separated_list]

对于 Windows:

aws rds create-db-proxy ^ --db-proxy-name proxy_name ^ --role-arn iam_role ^ --engine-family { MYSQL | POSTGRESQL } ^ --vpc-subnet-ids space_separated_list ^ [--vpc-security-group-ids space_separated_list] ^ [--auth ProxyAuthenticationConfig_JSON_string] ^ [--require-tls | --no-require-tls] ^ [--idle-client-timeout value] ^ [--debug-logging | --no-debug-logging] ^ [--tags comma_separated_list]

要创建代理所需的信息和关联,您还可以使用 register-db-proxy-targets 命令。指定目标组名称 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), or [--db-cluster-endpoint endpoint_name] # rds db cluster endpoint (all instances)

要创建 RDS 代理,请调用 Amazon RDS API 操作 CreateDBProxy。传递具有 AuthConfig 数据结构的参数。

当您创建每个代理时,RDS Proxy 会自动创建一个名为 default 的目标组。通过调用函数 RegisterDBProxyTargets,将 RDS 数据库实例或 Aurora 数据库集群与目标组关联。

查看 RDS Proxy

创建一个或多个 RDS 代理后,您可以查看所有代理以检查其配置详细信息,并选择要修改、删除以及执行其他操作的代理。

使用代理的任何数据库应用程序都要求在连接字符串中使用代理终端节点。

查看您的代理

  1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在 AWS 管理控制台 的右上角,选择在其中创建了 RDS Proxy 的 AWS 区域。

  3. 在导航窗格中,选择 Proxies (代理)

  4. 选择 RDS 代理的名称以显示其详细信息。

  5. 在详细信息页面上,Target groups (目标组) 部分显示了代理与特定 RDS 数据库实例或 Aurora 数据库集群的关联方式。您可以访问指向默认目标组页面的链接,以查看有关代理与数据库之间关联的更多详细信息。在该页面上,您可以看到创建代理时指定的设置,如最大连接百分比、连接借用超时、引擎兼容性和会话固定筛选条件。

要使用 CLI 查看您的代理,请使用 describe-db-proxies 命令。默认情况下,它会显示您的 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

  2. 要显示连接参数(如代理可以使用的最大连接百分比),请运行 describe-db-proxy-target-groups -—db-proxy-name,并使用代理的名称作为参数值。

  3. 要查看与返回的目标组关联的 RDS 数据库实例或 Aurora 数据库集群的详细信息,请运行 describe-db-proxy-targets

要使用 RDS API 查看您的代理,请使用 DescribeDBProxies 操作。该操作将返回 DBProxy 数据类型的值。

要查看代理连接设置的详细信息,请将此返回值中的代理标识符与 DescribeDBProxyTargetGroups 操作一起使用。该操作将返回 DBProxyTargetGroup 数据类型的值。

要查看与代理关联的 RDS 实例或 Aurora 数据库集群,请使用 DescribeDBProxyTargets 操作。该操作将返回 DBProxyTarget 数据类型的值。

通过 RDS Proxy 连接到数据库

通过代理连接到 RDS 数据库实例或 Aurora 数据库集群的方式通常与直接连接到数据库的方式相同。主要区别在于您指定代理终端节点而不是实例或集群终端节点。对于 Aurora 数据库集群,所有代理连接都具有读/写功能,并使用写入器实例。如果将读取器终端节点用于只读连接,则继续以相同的方式使用读取器终端节点。

使用本机身份验证连接到代理

执行以下基本步骤,使用本机身份验证连接到代理:

  1. 查找代理终端节点。在 AWS 管理控制台 中,您可以在相应代理的详细信息页面上找到终端节点。通过 AWS CLI,您可以使用 describe-db-proxies 命令。下面的示例演示如何操作。

    # 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" } ] ]
  2. 在客户端应用程序的连接字符串中指定该终端节点作为主机参数。例如,指定代理终端节点作为 mysql -h 选项或 psql -h 选项的值。

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

使用 IAM 身份验证连接到代理

遵循与使用 IAM 身份验证连接到 RDS 数据库实例或 Aurora 集群相同的常规过程。有关将 IAM 与 RDS 和 Aurora 结合使用的一般信息,请参阅Amazon Aurora 中的安全性

RDS Proxy 在 IAM 用法方面的主要区别包括:

  • 指定代理终端节点,而不是实例、集群或读取器终端节点。有关代理终端节点的详细信息,请参阅使用 IAM 身份验证连接到数据库集群

  • 在直接数据库 IAM 身份验证情况下,您可以有选择地选取数据库用户并将其配置为使用特殊身份验证插件进行标识。然后,您可以使用 IAM 身份验证连接到这些用户。

    在代理使用案例中,您需要为代理提供包含某些用户的用户名和密码(本机身份验证)的密钥。然后,您可以使用 IAM 身份验证(通过使用代理终端节点而不是数据库终端节点生成身份验证令牌)并使用与之前所提供密钥的用户名之一匹配的用户名,连接到代理。

  • 您不会使用授权插件配置每个单独的数据库用户。数据库用户在数据库中仍有常规的用户名和密码。您可以设置包含这些用户名和密码的 Secrets Manager 密钥,并授权 RDS Proxy 从 Secrets Manager 中检索凭证。

  • IAM 身份验证应用于您的客户端程序与代理之间的连接。然后,代理使用从 Secrets Manager 中检索的用户名和密码凭证对数据库进行身份验证。当您将 IAM 用于与代理的连接时,请确保底层 RDS 数据库实例或 Aurora 数据库集群未启用 IAM。

  • 当使用 IAM 身份验证连接到代理时,确保您使用传输层安全性 (TLS)/安全套接字层 (SSL)。

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

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

使用 PostgreSQL 连接到代理的注意事项

对于 PostgreSQL,当客户端启动到 PostgreSQL 数据库的连接时,它会发送一条包含参数名称和值字符串对的启动消息。有关详细信息,请参阅 PostgreSQL 文档中的 PostgreSQL 消息格式中的 StartupMessage

通过 RDS 代理进行连接时,启动消息可以包含以下当前识别的参数:

  • user

  • database

  • replication

启动消息还可以包含以下其他运行时参数:

有关 PostgreSQL 消息收发的更多信息,请参阅 PostgreSQL 文档中的前端/后端协议

对于 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

  • 将 JDBC 连接参数 preferQueryMode 设置为 extendedForPrepared 以避免固定。extendedForPrepared 可以确保扩展模式仅用于预编译语句。

    preferQueryMode 参数的默认值为 extended,它对所有查询都使用扩展模式。扩展模式使用一系列的 PrepareBindExecuteSync 请求以及相应的响应。这种系列类型会导致 RDS 代理中的连接固定。

有关更多信息,请参阅 避免固定。有关使用 JDBC 进行连接的更多信息,请参阅 PostgreSQL 文档中的连接到数据库

管理 RDS Proxy

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

修改 RDS Proxy

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

修改代理的设置

  1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择 Proxies (代理)

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

  4. 对于 Actions (操作),选择 Modify (修改)

  5. 输入或选择要修改的属性。您可以执行以下操作:

    • 通过输入新标识符来重命名代理。

    • 打开或关闭传输层安全性 (TLS) 的要求。

    • 输入空闲连接超时的时间段。

    • 添加或删除 Secrets Manager 密钥。这些密钥对应于数据库用户名和密码。

    • 更改用于从 Secrets Manager 中检索密钥的 IAM 角色。

    • 要求或禁止对代理连接进行 IAM 身份验证。

    • 添加或删除供代理使用的 VPC 子网。

    • 添加或删除供代理使用的 VPC 安全组。

    • 启用或禁用增强型日志记录。

  6. 选择修改

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

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

修改代理目标组的设置

  1. 代理页面上,转到代理的详细信息页面。

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

  3. 默认目标组的详细信息页面上,选择 Modify (修改)

  4. 为您可以修改的属性选择新设置:

    • 选择不同的 RDS 数据库实例或 Aurora 集群。

    • 调整代理可使用的最大可用连接的百分比。

    • 选择会话固定筛选条件。这样做可以帮助减少由于事务级别的连接重用不足而导致的性能问题。要使用该设置,您需要了解应用程序行为以及 RDS Proxy 将会话固定到数据库连接的情况。

    • 调整连接借用超时间隔。当最大连接数已用于代理时,此设置适用。该设置确定在返回超时错误之前代理等待连接可用的时间。

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

  5. 选择 Modify target group (修改目标组)

要使用 AWS CLI 修改代理,请使用 modify-db-proxymodify-db-proxy-target-groupderegister-db-proxy-targetsregister-db-proxy-targets 命令。

使用 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 作为目标组的名称。

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

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-targetsregister-db-proxy-targets 命令,您可以通过相应的目标组来更改代理关联的 RDS 数据库实例或 Aurora 数据库集群。目前,每个代理都可以连接到一个 RDS 数据库实例或 Aurora 数据库集群。目标组可跟踪多可用区配置中的所有 RDS 数据库实例或 Aurora 集群中所有数据库实例的连接详细信息。

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

使用 RDS 数据库实例时,请指定 --db-instance-identifier 选项。使用 Aurora 数据库集群时,则指定 --db-cluster-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 修改代理,请使用 ModifyDBProxyModifyDBProxyTargetGroupDeregisterDBProxyTargetsRegisterDBProxyTargets 操作。

使用 ModifyDBProxy,您可以更改以下属性:

  • 代理使用的一组 Secrets Manager 密钥。

  • 是否需要 TLS。

  • 空闲客户端超时。

  • 是否记录 SQL 语句中的其他信息以进行调试。

  • 用于检索 Secrets Manager 密钥的 IAM 角色。

  • 代理使用的安全组。

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

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

添加新数据库用户

在某些情况下,您可能会将新数据库用户添加到与代理关联的 RDS 数据库实例或 Aurora 集群。如果是这样,请添加 Secrets Manager 密钥或调整其用途,以存储该用户的凭证。为此,请选择以下选项之一:

  • 使用 在 AWS Secrets Manager 中设置数据库凭证 中描述的过程创建新 Secrets Manager 密钥。

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

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

更改数据库用户的密码

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

控制连接限制和超时

RDS Proxy 对 RDS 数据库实例或 Aurora 数据库集群使用 max_connections 设置。该设置表示代理在任何一个时刻可以打开的连接数量的总体上限。在 Aurora 集群和 RDS 多可用区配置中,代理使用的 max_connections 值是 Aurora 主实例或 RDS 写入器实例的值。

要为 RDS 数据库实例或 Aurora 数据库集群设置此值,请按照使用数据库参数组和数据库集群参数组中的过程操作。这些过程演示了如何将参数组与数据库关联以及如何编辑参数组中的 max_connections 值。

最大连接数的代理设置表示与代理关联的数据库的 max_connections 值的百分比。如果有多个应用程序都使用同一数据库,您可以通过对每个应用程序使用一个代理来有效地划分其连接配额(按 max_connections 的特定百分比)。如果执行此操作,请确保与同一数据库关联的所有代理的百分比加起来不超过 100%。

RDS Proxy 定期断开空闲连接并将其返回到连接池。您可以调整此超时间隔。这样做可帮助您的应用程序处理过时的资源(特别是如果应用程序错误地在保留重要数据库资源的同时使连接保持打开状态)。

管理和监控连接池

连接池 中所述,连接池是一个至关重要的 RDS Proxy 功能。接下来,您可以了解如何最有效地利用连接池和事务级别连接重用(多路复用)。

由于连接池由 RDS Proxy 托管,您可以对其进行监控并调整连接限制和超时间隔,而无需更改应用程序代码。

对于每个代理,您可以为连接池使用的连接数指定上限。请将限制指定为百分比。该百分比适用于数据库中配置的最大连接数。确切数字因数据库实例大小和配置设置而异。

例如,假设您将 RDS Proxy 配置为使用数据库最大连接数的 75%。对于 MySQL,最大值由 max_connections 配置参数定义。在这种情况下,其他 25% 的最大连接数仍可用于分配给其他代理或作为不经过代理的连接。在某些情况下,代理可能会在特定时间保持低于 75% 的最大打开连接数。这些情况可能包括数据库没有多个并发连接的情况,或者某些连接长时间处于空闲状态的情况。

当您更新适用于 RDS 数据库实例或 Aurora 集群的 max_connections 配置设置时,可用于连接池的总连接数会发生变化。

代理不会提前保留所有这些连接。因此,您可以指定一个相对较大的百分比,只有当代理变得足够忙而需要它们时才会打开这些连接。

您可以选择等待连接可供应用程序使用的时间。创建代理时,该设置由 Connection borrow timeout (连接借用超时) 选项表示。该设置指定在返回超时错误之前等待连接池中的连接可用的时间。这适用于连接数达到最大而导致连接池中没有可用连接的情况。如果由于正在进行故障转移操作而没有可用的写入器实例,那么这也适用。通过使用此设置,您可以为应用程序设置最佳等待期,而无需更改应用程序代码中的查询超时。

避免固定

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

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

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

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

这项规则并不对您可以设置的所有参数均适用。RDS Proxy 会跟踪对字符集、排序规则、时区、自动提交、当前数据库、SQL 模式和 session_track_schema 设置的更改。因此在您修改这些内容时,RDS Proxy 不会固定会话。在这种情况下,RDS Proxy 仅将连接重用于具有相同设置值的其他会话。

RDS Proxy 的性能优化包括尝试通过最小化固定来最大化事务级别连接重用(多路复用)。为此,您可以执行以下操作:

  • 避免可能导致固定的不必要的数据库请求。

  • 在所有连接中一致地设置变量和配置设置。这样,后续会话更有可能重用具有这些特定设置的连接。

    但是,对于 PostgreSQL 设置,变量会导致会话固定。

  • 将会话固定筛选条件应用于代理。您可以免除某些类型的操作,使其不固定会话(如果您知道这样做不会影响应用程序的正确操作)。

  • 通过监控 CloudWatch 指标 DatabaseConnectionsCurrentlySessionPinned 来查看固定的发生频率。有关该指标和其他 CloudWatch 指标的信息,请参阅 使用 Amazon CloudWatch 监控 RDS Proxy

  • 如果您使用 SET 语句为每个客户端连接执行相同的初始化,则可以在保留事务级别多路复用的同时执行此操作。在这种情况下,您将设置初始会话状态的语句移动到由代理使用的初始化查询中。该属性是一个字符串,包含一个或多个 SQL 语句(用分号分隔)。

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

    重要

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

对于以下情况(其中多路复用可能会导致意外行为),代理将会话固定到当前连接:

  • 文本大小大于 16 KB 的任何语句都会导致代理固定会话。

  • 预编译语句会导致代理固定会话。无论预编译语句使用 SQL 文本还是二进制协议,这项规则都适用。

  • 显式 MySQL 语句 LOCK TABLELOCK TABLESFLUSH TABLES WITH READ LOCK 会导致代理固定会话。

  • 设置用户变量或系统变量(有些例外)会导致代理固定会话。如果这种情况过多地减少了连接重用,您可以选择让 SET 操作不导致固定。有关如何通过设置 SessionPinningFilters 属性来执行此操作的信息,请参阅创建 RDS Proxy

  • 创建临时表会导致代理固定会话。这样,无论事务边界如何,临时表的内容都会在整个会话期间保留。

  • 调用 MySQL 函数 ROW_COUNTFOUND_ROWSLAST_INSERT_ID 有时会导致固定。

    这些函数导致固定的确切情况在与 MySQL 5.6 和 MySQL 5.7 兼容的 Aurora MySQL 版本之间可能有所不同。

调用 MySQL 存储过程和存储函数不会导致固定。RDS Proxy 不会检测此类调用导致的任何会话状态更改。因此,请确保您的应用程序不会更改存储例程中的会话状态,并依赖该会话状态跨事务持续存在。例如,如果存储过程创建了一个旨在跨事务持续存在的临时表,则该应用程序当前不与 RDS Proxy 兼容。

对于 PostgreSQL,以下交互会导致固定:

  • 使用 SET 命令

  • 使用扩展查询协议,例如使用 JDBC 默认设置

  • 创建临时序列、表或视图

  • 声明游标

  • 丢弃会话状态

  • 监听通知频道

  • 加载库模块,如 auto_explain

  • 使用函数操作序列,例如 nextval()setval()

  • 使用函数与锁定交互,例如 pg_advisory_lock()pg_try_advisory_lock()

  • 使用预编译语句,设置参数或将参数重置为其默认值

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

有关代理的固定发生频率的指标,请参阅使用 Amazon CloudWatch 监控 RDS Proxy

删除 RDS Proxy

如果您不再需要某个代理,可以将其删除。您可能因为正在使用某个代理的应用程序不再相关而删除该代理。或者,如果您停止使用数据库实例或与其关联的集群,则可以删除代理。

删除代理

  1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

  2. 在导航窗格中,选择 Proxies (代理)

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

  4. 选择 Delete Proxy (删除代理)

要删除数据库代理,请使用 AWS CLI 命令 delete-db-proxy。要删除相关的关联,还可以使用 deregister-db-proxy-targets 命令。

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]

要删除数据库代理,请调用 Amazon RDS API 函数 DeleteDBProxy。要删除相关的项目和关联,您还可以调用函数 DeleteDBProxyTargetGroupDeregisterDBProxyTargets

使用 Amazon CloudWatch 监控 RDS Proxy

您可以使用 Amazon CloudWatch 监控 RDS Proxy。CloudWatch 可从代理收集原始数据,并将数据处理为便于读取的近乎实时的指标。要在 CloudWatch 控制台中查找这些指标,请依次选择 Metrics (指标)RDSPer-Proxy Metrics (每个代理指标)。有关更多信息,请参阅Amazon CloudWatch 用户指南中的使用 Amazon CloudWatch 指标

注意

RDS 为与代理关联的每个底层 Amazon EC2 实例发布这些指标。一个代理可能由多个 EC2 实例提供服务。使用 CloudWatch 统计数据可汇总所有关联实例的代理值。

其中一些指标可能在代理第一次成功连接之后才可见。

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

指标 描述 有效期 CloudWatch 维度

AvailabilityPercentage

目标组在维度指示的角色中可用的时间百分比。每分钟报告一次此指标。此指标最有用的统计数据是 Average

1 minute ProxyNameTargetGroupTargetRole
ClientConnections

当前客户端连接数。每分钟报告一次此指标。此指标最有用的统计数据是 Sum

1 minute

ProxyName
ClientConnectionsClosed

已关闭的客户端连接数。此指标最有用的统计数据是 Sum

1 分钟及更久

ProxyName

ClientConnectionsNoTLS

当前没有传输层安全性 (TLS) 的客户端连接的数量。每分钟报告一次此指标。此指标最有用的统计数据是 Sum 1 分钟及更久 ProxyName

ClientConnectionsReceived

收到的客户端连接请求数。此指标最有用的统计数据是 Sum

1 分钟及更久

ProxyName
ClientConnectionsSetupFailedAuth

由于身份验证或 TLS 配置错误而失败的客户端连接尝试次数。此指标最有用的统计数据是 Sum

1 分钟及更久

ProxyName
ClientConnectionsSetupSucceeded

使用任何具有或不具有 TLS 的身份验证机制成功建立的客户端连接数。此指标最有用的统计数据是 Sum

1 分钟及更久

ProxyName
ClientConnectionsTLS 当前具有 TLS 的客户端连接的数量。每分钟报告一次此指标。此指标最有用的统计数据是 Sum 1 分钟及更久 ProxyName
DatabaseConnectionRequests

创建数据库连接的请求数。此指标最有用的统计数据是 Sum

1 分钟及更久

ProxyNameTargetGroupTarget

DatabaseConnectionRequestsWithTLS

创建具有 TLS 的数据库连接的请求数。此指标最有用的统计数据是 Sum 1 分钟及更久 ProxyNameTargetGroupTarget
DatabaseConnections

当前数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 Sum

1 minute

ProxyNameTargetGroupTarget

DatabaseConnectionsBorrowLatency

被监视的代理建立数据库连接所花费的时间(以微秒为单位)。此指标最有用的统计数据是 Average 1 分钟及更久 ProxyName
DatabaseConnectionsCurrentlyBorrowed

当前处于借用状态的数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 Sum

1 minute

ProxyNameTargetGroupTarget
DatabaseConnectionsCurrentlyInTransaction

事务中的当前数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 Sum

1 minute

ProxyNameTargetGroupTarget
DatabaseConnectionsCurrentlySessionPinned

由于客户端请求中更改会话状态的操作,当前固定的当前数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 Sum

1 minute

ProxyNameTargetGroupTarget
DatabaseConnectionsSetupFailed

失败的数据库连接请求数。此指标最有用的统计数据是 Sum

1 分钟及更久

ProxyNameTargetGroupTarget
DatabaseConnectionsSetupSucceeded

使用或不使用 TLS 成功建立的数据库连接数。此指标最有用的统计数据是 Sum

1 分钟及更久

ProxyNameTargetGroupTarget

DatabaseConnectionsWithTLS

具有 TLS 的当前数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 Sum 1 minute ProxyNameTargetGroupTarget
MaxDatabaseConnectionsAllowed

允许的最大数据库连接数。每分钟报告一次此指标。此指标最有用的统计数据是 Sum

1 minute

ProxyNameTargetGroupTarget

QueryDatabaseResponseLatency

数据库响应查询所花费的时间(以微秒为单位)。此指标最有用的统计数据是 Average 1 分钟及更久 ProxyNameTargetGroupTarget
QueryRequests

收到的查询数。包含多个语句的查询被计为一个查询。此指标最有用的统计数据是 Sum

1 分钟及更久

ProxyName
QueryRequestsNoTLS 从非 TLS 连接收到的查询数。包含多个语句的查询被计为一个查询。此指标最有用的统计数据是 Sum 1 分钟及更久 ProxyName

QueryRequestsTLS

从 TLS 连接收到的查询数。包含多个语句的查询被计为一个查询。此指标最有用的统计数据是 Sum 1 分钟及更久 ProxyName
QueryResponseLatency 从获取查询请求到代理响应该请求的时间(以微秒为单位)。此指标最有用的统计数据是 Average 1 分钟及更久 ProxyName

RDS Proxy 的命令行示例

要了解连接命令和 SQL 语句的组合如何与 RDS Proxy 交互,请查看以下示例。

跨故障转移保留与 MySQL 数据库的连接

本 MySQL 示例演示了打开的连接在故障转移(例如当您重新启动数据库或数据库由于某个问题而变得不可用时)期间如何继续工作。本示例使用一个名为 the-proxy 的代理,以及一个包含数据库实例 instance-8898instance-9814 的 Aurora 数据库集群。从 Linux 命令行运行 failover-db-cluster 命令时,代理连接到的写入器实例将更改为不同的数据库实例。您可以看到,与代理关联的数据库实例在连接保持打开状态时发生更改。

$ mysql -h the-proxy.proxy-demo.us-east-1.rds.amazonaws.com -u admin_user -p Enter password: ... mysql> select @@aurora_server_id; +--------------------+ | @@aurora_server_id | +--------------------+ | instance-9814 | +--------------------+ 1 row in set (0.01 sec) mysql> [1]+ Stopped mysql -h the-proxy.proxy-demo.us-east-1.rds.amazonaws.com -u admin_user -p $ # Initially, instance-9814 is the writer. $ aws rds failover-db-cluster --db-cluster-id cluster-56-2019-11-14-1399 JSON output $ # After a short time, the console shows that the failover operation is complete. $ # Now instance-8898 is the writer. $ fg mysql -h the-proxy.proxy-demo.us.us-east-1.rds.amazonaws.com -u admin_user -p mysql> select @@aurora_server_id; +--------------------+ | @@aurora_server_id | +--------------------+ | instance-8898 | +--------------------+ 1 row in set (0.01 sec) mysql> [1]+ Stopped mysql -h the-proxy.proxy-demo.us-east-1.rds.amazonaws.com -u admin_user -p $ aws rds failover-db-cluster --db-cluster-id cluster-56-2019-11-14-1399 JSON output $ # After a short time, the console shows that the failover operation is complete. $ # Now instance-9814 is the writer again. $ fg mysql -h the-proxy.proxy-demo.us-east-1.rds.amazonaws.com -u admin_user -p mysql> select @@aurora_server_id; +--------------------+ | @@aurora_server_id | +--------------------+ | instance-9814 | +--------------------+ 1 row in set (0.01 sec) +---------------+---------------+ | Variable_name | Value | +---------------+---------------+ | hostname | ip-10-1-3-178 | +---------------+---------------+ 1 row in set (0.02 sec)

调整 Aurora 数据库集群的 max_connections 设置

本示例演示如何调整 Aurora MySQL 数据库集群的 max_connections 设置。为此,请根据与 MySQL 5.6 或 5.7 兼容的集群的默认参数设置,创建自己的数据库集群参数组。您可以为 max_connections 设置指定一个值,从而覆盖设置默认值的公式。将数据库集群参数组与数据库集群关联。

export REGION=us-east-1 export CLUSTER_PARAM_GROUP=rds-proxy-mysql-56-max-connections-demo export CLUSTER_NAME=rds-proxy-mysql-56 aws rds create-db-parameter-group --region $REGION \ --db-parameter-group-family aurora5.6 \ --db-parameter-group-name $CLUSTER_PARAM_GROUP \ --description "Aurora MySQL 5.6 cluster parameter group for RDS Proxy demo." aws rds modify-db-cluster --region $REGION \ --db-cluster-identifier $CLUSTER_NAME \ --db-cluster-parameter-group-name $CLUSTER_PARAM_GROUP echo "New cluster param group is assigned to cluster:" aws rds describe-db-clusters --region $REGION \ --db-cluster-identifier $CLUSTER_NAME \ --query '*[*].{DBClusterParameterGroup:DBClusterParameterGroup}' echo "Current value for max_connections:" aws rds describe-db-cluster-parameters --region $REGION \ --db-cluster-parameter-group-name $CLUSTER_PARAM_GROUP \ --query '*[*].{ParameterName:ParameterName,ParameterValue:ParameterValue}' \ --output text | grep "^max_connections" echo -n "Enter number for max_connections setting: " read answer aws rds modify-db-cluster-parameter-group --region $REGION --db-cluster-parameter-group-name $CLUSTER_PARAM_GROUP \ --parameters "ParameterName=max_connections,ParameterValue=$$answer,ApplyMethod=immediate" echo "Updated value for max_connections:" aws rds describe-db-cluster-parameters --region $REGION \ --db-cluster-parameter-group-name $CLUSTER_PARAM_GROUP \ --query '*[*].{ParameterName:ParameterName,ParameterValue:ParameterValue}' \ --output text | grep "^max_connections"

RDS Proxy 故障排除

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

常见问题和解决方案

有关您在使用 RDS Proxy 时可能遇到的一些常见问题的可能原因和解决方案,请参阅以下内容。

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

错误 原因或解决方法

403: The security token included in the request is invalid

选择现有 IAM 角色,而不是选择创建新角色。

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

错误 原因或解决方法
ERROR 1040 (HY000): Connections rate limit exceeded (limit_value) 从客户端到代理的连接请求速率超过了限制。
ERROR 1040 (HY000): IAM authentication rate limit exceeded 从客户端到代理的具有 IAM 身份验证的并发请求数超过了限制。
ERROR 1040 (HY000): Number simultaneous connections exceeded (limit_value) 从客户端到代理的并发连接请求数超出了限制。

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_set_client'' 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 客户端中。请执行以下任一操作:

  • 禁用代理的需要传输层安全性设置。

  • 在 MySQL 客户端中,使用最小设置 ssl-mode=REQUIRED 连接到数据库。

ERROR 2026 (HY000): SSL connection error: Internal Server Error

与代理的 TLS 握手失败。一些可能的原因包括:

  • SSL 是必需的,但服务器不支持它。

  • 发生内部服务器错误。

  • 发生握手错误。

ERROR 9501 (HY000): Timed-out waiting to acquire database connection

等待获取数据库连接时代理超时。一些可能的原因包括:

  • 代理无法建立数据库连接,因为已达到最大连接数

  • 代理无法建立数据库连接,因为数据库不可用。

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

错误 原因 解决方案

IAM authentication is allowed only with SSL connections.

用户在 PostgreSQL 客户端中,尝试使用具有设置 sslmode=disable 的 IAM 身份验证连接到数据库。

用户需要在 PostgreSQL 客户端中使用最小设置 sslmode=require 连接到数据库。有关更多信息,请参阅 PostgreSQL SSL 支持文档。

This RDS Proxy requires TLS connections.

用户启用了需要传输层安全性选项,但尝试在 PostgreSQL 客户端中使用 sslmode=disable 进行连接。

要修复此错误,请执行以下操作之一:

  • 禁用代理的需要传输层安全性选项。

  • 在 PostgreSQL 客户端中,使用最小设置 sslmode=allow 连接到数据库。

IAM authentication failed for user user_name. Check the IAM token for this user and try again.

该错误可能是由于以下原因引起的:

  • 客户端提供了错误的 IAM 用户名。

  • 客户端向用户提供了错误的 IAM 授权令牌。

  • 客户端在使用没有所需权限的 IAM 策略。

  • 客户端向用户提供了过期的 IAM 授权令牌。

要修复此错误,请执行以下操作:

  1. 确认提供的 IAM 用户存在。

  2. 确认 IAM 授权令牌属于提供的 IAM 用户。

  3. 确认 IAM 策略具有足够的 RDS 权限。

  4. 检查所用 IAM 授权令牌的有效性。

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 supports only IAM or MD5 authentication.

用于连接到代理的数据库客户端正在使用代理当前不支持的身份验证机制,如 SCRAM-SHA-256。

如果您不使用 IAM 身份验证,请仅使用 MD5 密码身份验证。

A user name is missing from the connection startup packet. Provide a user name for this connection.

用于连接到代理的数据库客户端在尝试建立连接时未发送用户名。

请确保在使用您选择的 PostgreSQL 客户端设置与代理的连接时定义用户名。

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 的版本。

Feature not supported: RDS Proxy currently doesn't support streaming replication mode.

用于连接到代理的 PostgreSQL 客户端正在尝试使用流复制模式,该模式目前不受 RDS 代理支持。

在用于连接的 PostgreSQL 客户端中关闭流复制模式。

Feature not supported: RDS Proxy currently doesn't support the option option_name.

通过启动消息,用于连接到代理的 PostgreSQL 客户端正在请求 RDS 代理当前不支持的选项。

在用于连接的 PostgreSQL 客户端中,关闭上述消息中显示为不支持的选项。

The IAM authentication failed because of too many competing requests.

从客户端到代理的具有 IAM 身份验证的并发请求数超过了限制。

降低使用 PostgreSQL 客户端中的 IAM 身份验证建立连接的速率。

The maximum number of client connections to the proxy exceeded number_value.

从客户端到代理的并发连接请求数超出了限制。

减少从 PostgreSQL 客户端到此 RDS 代理的活动连接数。

Rate of connection to proxy exceeded number_value.

从客户端到代理的连接请求速率超过了限制。

降低从 PostgreSQL 客户端建立连接的速率。

The password that was provided for the role role_name is wrong.

此角色的密码与 Secrets Manager 密钥不匹配。

检查 Secrets Manager 中此角色的密钥,以查看密码是否与 PostgreSQL 客户端中使用的密码相同。

The IAM authentication failed for the role role_name. Check the IAM token for this role and try again.

用于 IAM 身份验证的 IAM 令牌存在问题。

生成新的身份验证令牌并在新连接中使用它。

IAM is allowed only with SSL connections.

客户端尝试使用 IAM 身份验证进行连接,但未启用 SSL。

在 PostgreSQL 客户端中启用 SSL。

Unknown error.

出现未知错误。

联系 AWS Support,以便我们调查此问题。

Timed-out waiting to acquire database connection.

等待获取数据库连接时代理超时。一些可能的原因包括:

  • 代理无法建立数据库连接,因为已达到最大连接数。

  • 代理无法建立数据库连接,因为数据库不可用。

可能的解决方案:

  • 检查 RDS 数据库实例或 Aurora 数据库集群状态的目标,以查看它是否不可用。

  • 检查是否有长时间运行的事务和/或查询正在执行。它们可以长时间使用连接池中的数据库连接。

Request returned an error: database_error.

从代理建立的数据库连接返回错误。

解决方案取决于特定的数据库错误。示例为:Request returned an error: database "your-database-name" does not exist。这意味着指定的数据库名称或用作数据库名称的用户名(如果尚未指定数据库名称)不存在于数据库服务器中。

使用 RDS Proxy 的 CloudWatch 日志

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

重要

这些日志供相关人员进行故障排除,而不是用于编程访问。日志的格式和内容可能会发生变化。

验证代理的连接

您可以使用以下命令验证连接机制的所有组件是否均可与其他组件进行通信。

使用 describe-db-proxies 命令检查代理本身。同时使用 describe-db-proxy-target-groups 检查关联的目标组。检查目标的详细信息是否与要与代理关联的 RDS 数据库实例或 Aurora 数据库集群匹配。使用如下命令。

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 命令检查目标组中指定的目标。使用如下命令。

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

describe-db-proxy-targets 命令的输出包括一个 TargetHealth 字段。您可以检查 TargetHealth 内部的字段 StateReasonDescription,以检查代理是否可以与底层数据库实例进行通信。

  • StateAVAILABLE 表示代理可以连接到数据库实例。

  • StateUNAVAILABLE 表示存在临时或永久的连接问题。在这种情况下,请检查 ReasonDescription 字段。例如,如果 Reason 的值为 PENDING_PROXY_CAPACITY,请在代理完成其扩展操作后,重试连接。如果 Reason 的值为 UNREACHABLECONNECTION_FAILEDAUTH_FAILURE,请使用 Description 字段中的说明来帮助您诊断问题。

  • 在更改为 AVAILABLEUNAVAILABLE 之前,State 字段的值可能在短时间内为 REGISTERING

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

nc -zx MySQL_proxy_endpoint 3306 nc -zx PostgreSQL_proxy_endpoint 5432

您可以使用以下命令来确保 EC2 实例具有所需属性。特别是,EC2 实例的 VPC 必须与代理连接到的 RDS 数据库实例或 Aurora 数据库集群的 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 字段被编码为包含 usernamepassword 字段的 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 }

将 RDS Proxy 与 AWS CloudFormation 结合使用

您可以将 RDS Proxy 与 AWS CloudFormation 结合使用。这样做有助于您创建相关资源组,包括可连接到新创建的 Amazon RDS 数据库实例或 Aurora 数据库集群的代理。AWS CloudFormation 中的 RDS Proxy 支持涉及两种新的注册表类型:DBProxyDBProxyTargetGroup

以下列表显示了 RDS Proxy 的 AWS 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 InstanceIdentifiers: - Fn::ImportValue: DBInstanceName DependsOn: DBProxy

有关您可以使用 AWS CloudFormation 创建的 Amazon RDS 和 Aurora 资源的更多信息,请参阅 RDS 资源类型参考