开始使用 RDS 代理 - Amazon Relational Database Service

开始使用 RDS 代理

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

设置网络先决条件

使用 RDS 代理需要您在 RDS 数据库实例和 RDS 代理之间拥有通用的虚拟私有云(VPC)。此 VPC 应至少有两个位于不同可用区中的子网。您的账户可以拥有这些子网,或与其他账户共享它们。有关 VPC 共享的信息,请参阅使用共享 VPC

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

获取有关您的子网的信息

要创建代理,必须提供代理在其中运行的子网和 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 地址容量

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

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

数据库实例类 最少可用 IP 地址数

db.*.xlarge 或更小

10

db.*.2xlarge

15

db.*.4xlarge

25

db.*.8xlarge

45

db.*.12xlarge

60

db.*.16xlarge

75

db.*.24xlarge

110

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

注意

RDS 代理在一个 VPC 中支持的 IP 地址数不超过 215 个。

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

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

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

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

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

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

注意

对于 RDS for SQL Server,无论数据库实例排序设置如何,RDS 代理都需要在 Secrets Manager 中设置一个对应用程序代码区分大小写的密钥。例如,如果您的应用程序可以使用用户名“Admin”或“admin”,则可以为代理同时配置“Admin”和“admin”密钥。在客户端和代理之间的身份验证过程中,RDS 代理不允许用户名不区分大小写。

有关 SQL Server 中的排序规则的更多信息,请参阅 Microsoft SQL Server 文档。

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

有关在 Secrets Manager 中创建密钥的说明,请参阅 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"}'

例如,以下命令为两个数据库用户(一个名为 app-user,另一个名为 admin)创建 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 账户拥有的密钥,请使用以下命令。

aws secretsmanager list-secrets

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

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

要验证是否在密钥中以正确的格式存储了正确的凭据,请使用以下命令。以密钥的短名称或 ARN 替换 your_secret_name

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

输出应包括一行 JSON 编码值,如下所示。

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

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

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

提示

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

创建用于访问您的 Secrets Manager 密钥以便与代理一起使用的 IAM 策略
  1. 登录到 IAM 控制台。按照创建 IAM 角色中所述的创建角色过程,选择创建角色以将权限委派给 AWS 服务

    对于可信实体类型,选择 AWS 服务。在使用案例下,从其他 AWS 服务的使用案例下拉列表中选择 RDS。选择 RDS – 将角色添加到数据库

  2. 对于新角色,请执行添加内联策略步骤。使用与编辑 IAM 策略中相同的一般过程。将下面的 JSON 粘贴到 JSON 文本框中。替换您自己的账户 ID。将您的 AWS 区域替换为 us-east-2。用 Amazon 资源名称(ARN)替换您创建的密钥,请参阅在 IAM policy 语句中指定 KMS 密钥。对于 kms:Decrypt 操作,请替换为默认 AWS KMS key 的 ARN 或您自己的 KMS 密钥。具体使用哪一项取决于您使用哪一项来加密 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": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

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

PREFIX=my_identifier USER_ARN=$(aws sts get-caller-identity --query "Arn" --output text) 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"}]}' ROLE_ARN=arn:aws:iam::account_id:role/my_role_name aws iam put-role-policy --role-name my_role_name \ --policy-name $PREFIX-secret-reader-policy --policy-document '{"Version":"2012-10-17","Statement":[{"Sid":"getsecretvalue","Effect":"Allow","Action":["secretsmanager:GetSecretValue","kms:Decrypt"],"Resource":"*"}]}' 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 代理

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

创建代理
  1. 登录 AWS 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

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

    • 空闲客户端连接超时。选择在代理关闭客户端连接之前,该连接可以处于空闲状态的时间段。默认值为 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 语句,其中有效会话变量值没有更改,即没有更改会话变量。

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

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

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

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

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

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

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

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

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

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

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

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

    提供其他连接配置:

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

      注意

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

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

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

    (可选)提供高级配置:

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

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

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

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

要使用 AWS 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:seret/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,请参阅 设置网络先决条件 获取有关如何查找它们的示例。

注意

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

使用共享 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 数据库实例与目标组关联。

查看 RDS 代理

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

为了使数据库应用程序使用代理,必须在连接字符串中提供代理端点。

查看您的代理
  1. 登录AWS Management Console并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  2. 在AWS Management Console的右上角,选择在其中创建了 RDS Proxy 的AWS区域。

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

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

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

要使用 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 数据库实例的详细信息,请运行 describe-db-proxy-targets

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

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

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

通过 RDS Proxy 连接到数据库

通过代理或通过连接到数据库来连接到 RDS 数据库实例的方式通常是相同的。有关更多信息,请参阅 代理终端节点概述

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

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

  1. 查找代理端点。在 AWS Management Console 中,您可以在相应代理的详细信息页面上找到端点。通过 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 Proxy结合使用时,请将数据库用户设置为使用常规用户名和密码进行身份验证。IAM 身份验证适用于从 Secrets Manager 中检索用户名和密码凭证的RDS Proxy。从RDS 代理至底层数据库的连接不经由 IAM。

要使用 IAM 身份验证连接到 RDS 代理,请使用与对 RDS 数据库实例使用 IAM 身份验证相同的常规连接过程。有关使用 IAM 的一般信息,请参阅Amazon RDS 中的安全性

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

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

    IAM 身份验证应用于您的客户端程序与代理之间的连接。然后,代理使用从 Secrets Manager 中检索的用户名和密码凭证对数据库进行身份验证。

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

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

    在代理使用案例中,您需要为代理提供包含某些用户的用户名和密码(本机身份验证)的密钥。然后,您便可以使用 IAM 身份验证连接到代理。在这里,您可以通过使用代理端点而非数据库端点生成身份验证令牌来实现此目的。您还可以使用与您所提供密钥的用户名之一匹配的用户名。

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

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

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

使用 Microsoft SQL Server 连接到代理的注意事项

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

在某些情况下,代理无法共享数据库连接,而是将从客户端应用程序到代理的连接固定到专用的数据库连接。有关这些条件的更多信息,请参阅 避免固定

使用 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 进行连接的更多信息,请参阅 PostgreSQL 文档中的连接到数据库