创建 RDS 代理 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

创建 RDS 代理

要管理指定数据库实例集的连接,您可以创建代理。您可以将代理与 RDS for MariaDB、RDS for Microsoft SQL Server、RDS for MySQL 或 RDS for PostgreSQL 数据库实例相关联。

创建代理
  1. 登录 Amazon Web Services Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

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

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

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

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

    • Engine family(引擎系列)。此设置确定代理在解释数据库的出入网络流量时,识别哪个数据库网络协议。对于 RDS for MariaDB 或 RDS for MySQL,选择 MariaDB and MySQL(MariaDB 和 MySQL)。对于 RDS for PostgreSQL,选择 PostgreSQL。对于 RDS for SQL Server,请选择 SQL Server

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

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

      要让代理主动删除过时的连接,请降低空闲客户端连接超时。当工作负载出现峰值时,为了节省建立连接的成本,请增加空闲客户端连接超时时间。

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

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

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

    • Session pinning filters (会话固定筛选条件)。(可选)此选项允许您强制 RDS 代理不针对某些类型的检测到的会话状态进行固定。这绕过了跨客户端多路复用数据库连接的默认安全措施。目前,PostgreSQL 不支持该设置。唯一的选择是 EXCLUDE_VARIABLE_SETS

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

      可以认为以下模式是安全的:

      • SET 语句,其中有效会话变量值没有更改,即没有更改会话变量。

      • 您可以更改会话变量值并在同一个事务中执行一条语句。

      有关更多信息,请参阅 避免固定 RDS 代理

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

    • 初始化查询。(可选)您可以为代理指定一个或多个 SQL 语句,以便在打开每个新数据库连接时运行。此设置通常与 SET 语句一起使用,以确保每个连接具有相同的设置,如时区和字符集。对于多个语句,请使用分号作为分隔符。您还可以在单个 SET 语句中包含多个变量,例如 SET x=1, y=2

    对于 Authentication(身份验证),请为以下各项提供信息:

    • IAM role (IAM 角色)。选择一个有权访问您之前所选的 Secrets Manager 密钥的 IAM 角色。或者,您可以从 Amazon Web Services Management Console创建新的 IAM 角色。

    • Secrets Manager 密钥。至少选择一个 Secrets Manager 密钥,该密钥包含允许代理访问 RDS 数据库实例的数据库用户凭证。

    • Client authentication type(客户端身份验证类型)。选择代理对来自客户端的连接使用的身份验证类型。您的选择适用于与此代理关联的所有 Secrets Manager 密钥。如果您需要为每个密钥指定不同的客户端身份验证类型,则使用 Amazon CLI 或改用 API 创建代理。

    • IAM authentication(IAM 身份验证)。选择是要求、允许、还是禁止对代理连接进行 IAM 身份验证。允许选项仅对 RDS for SQL Server 的代理有效。您的选择适用于与此代理关联的所有 Secrets Manager 密钥。如果您需要为每个密钥指定不同的 IAM 身份验证,请使用 Amazon CLI 或改用 API 创建代理。

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

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

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

    提供其他连接配置:

    • VPC security group (VPC 安全组)。选择现有的 VPC 安全组。或者,您可以从 Amazon Web Services Management Console创建新的安全组。您必须配置入站规则以允许您的应用程序访问代理。您还必须配置出站规则以允许来自数据库目标的流量。

      注意

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

      使用共享 VPC 时,您不能使用 VPC 的默认安全组,也不能使用属于其他账户的安全组。选择属于您账户的安全组。如果不存在,请创建一个。有关此限制的详细信息,请参阅使用共享 VPC

      RDS 在多个可用区部署代理以确保高可用性。要为此类代理启用跨可用区通信,代理子网的网络访问控制列表(ACL)必须允许特定于引擎端口的出口以及所有入口端口。有关网络 ACL 的更多信息,请参阅使用网络 ACL 控制指向子网的流量。如果代理和目标的网络 ACL 相同,则必须添加 TCP 协议入口规则,其中设置为 VPC CIDR。您还必须添加特定于引擎端口的 TCP 协议出口规则,其中目标设置为 VPC CIDR。

    (可选)提供高级配置:

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

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

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

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

要使用 Amazon CLI 创建代理,请使用以下必需的参数调用 create-db-proxy 命令:

  • --db-proxy-name

  • --engine-family

  • --role-arn

  • --auth

  • --vpc-subnet-ids

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

对于 Linux、macOS 或 Unix:

aws rds create-db-proxy \ --db-proxy-name proxy_name \ --engine-family { MYSQL | POSTGRESQL | SQLSERVER } \ --auth ProxyAuthenticationConfig_JSON_string \ --role-arn iam_role \ --vpc-subnet-ids space_separated_list \ [--vpc-security-group-ids space_separated_list] \ [--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 ^ --engine-family { MYSQL | POSTGRESQL | SQLSERVER } ^ --auth ProxyAuthenticationConfig_JSON_string ^ --role-arn iam_role ^ --vpc-subnet-ids space_separated_list ^ [--vpc-security-group-ids space_separated_list] ^ [--require-tls | --no-require-tls] ^ [--idle-client-timeout value] ^ [--debug-logging | --no-debug-logging] ^ [--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" } ]
提示

如果您尚不知道要用于 --vpc-subnet-ids 参数的子网 ID,请参阅 设置 RDS 代理的网络先决条件 获取有关如何查找它们的示例。

注意

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

使用共享 VPC 时,您不能使用 VPC 的默认安全组,也不能使用属于其他账户的安全组。选择属于您账户的安全组。如果不存在,请创建一个。有关此限制的详细信息,请参阅使用共享 VPC

要为代理创建正确的关联,您还可以使用 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)

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

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