上次更新时间:2020 年 12 月 3 日
我无法通过 RDS 代理连接到我的 Amazon Relational Database Service (Amazon RDS) 或 Amazon Aurora 数据库实例。为什么我无法连接到我的数据库?
简短描述尽管 RDS 代理处于“可用”状态,但您遇到 RDS 代理连接失败的原因可能会有多种。RDS 代理连接失败有以下原因:
数据库实例或 RDS 代理上的安全组规则阻止了连接 RDS 代理目前仅在 VPC 内运行,因此来自私有网络外部的连接会失败 由于修改或因为数据库实例处于不可用状态,数据库实例不接受连接 使用的身份验证凭据不正确(使用本机用户名/密码模式时) 与客户端关联的 IAM 用户或角色无权连接 RDS 代理(在使用 IAM 数据库身份验证时)使用本文中的问题排查步骤来解决这些问题。
解决方案 检查客户端是否可以在 VPC 的私有网络中访问 RDS 代理RDS 代理只能在 VPC 内使用,不能公开访问(尽管数据库实例可以)。如果您从私有网络外部进行连接,则连接会超时。
如果客户端来自同一 VPC,请检查 RDS 代理的安全组是否允许根据数据库引擎(MySQL 为 3306,PostgreSQL 为 5432)从默认端口上的客户端进行连接。向与 VPC 关联的安全组添加规则,以允许所需的流量。 如果客户端来自另一个 VPC,则可以使用 VPC 对等。查看安全组和路由表以管理来自其他 VPC 的流量。 如果您的客户端来自企业网络,请使用直接连接或站点到站点 VPN 直接连接到 VPC。 如果您的客户端需要通过公共互联网进行连接,请使用 SSH 隧道作为中间主机连接到同一 VPC 内的 RDS 代理。 检查 RDS 代理是否可以连接到数据库实例RDS 代理必须与数据库实例建立连接才能管理连接池。它使用存储在 Secret Manager 中的用户名和密码,然后建立连接。使用以下最佳做法确保 RDS 代理可以连接到您的数据库实例:
检查 Secret Manager 中的凭证是否有效并且可以连接到数据库实例。 确保数据库实例的安全组允许来自 RDS 代理的流量。 如果 RDS 代理和数据库实例的安全组不同,则可以在数据库实例安全组的入站规则中提及 RDS 代理的安全组。Inbound rules for the RDS instance in order to allow connections from RDS proxy:
Protocol : TCP
Port range : Port on which the DB engine is running on the DB instance
Source : Security group of RDS Proxy
如果 RDS 代理和数据库实例都使用相同的安全组,请验证入站规则中是否提及安全组的继承规则。
Inbound rules for the RDS instance in order to allow connections from RDS proxy:
Protocol : TCP
Port Range : Port on which the DB engine is running on the RDS instance
Source : Common security group (for self referencing the security group)
由于 RDS 代理启动用于管理池的连接,所以必须允许出站流量到达数据库实例。安全组必须在其出站规则中允许所需的流量。
Outbound rules for the RDS Proxy in order to allow traffic reach the RDS instance:
Protocol : TCP
Port range : Port on which the DB engine is running on the RDS instance
Destination : Security group of DB instance
Note: If you already have the following outbound rules attached to the security group of the RDS Proxy, then there is no need to explicitly add the security group.
Outbound rules: ALL --- 0.0.0.0/0
检查与 RDS 代理关联的 IAM 角色是否具有获取和使用连接所需的凭证所需的访问权限。
确保 IAM 角色具有 rds.amazonaws.com 的信任策略。
确保 IAM 策略有权在密钥上调用 secretsmanager:GetSecretValue 操作。
确保 IAM 策略有权对用于加密密钥的 AWS Key Management Service (AWS KMS) 密钥调用 kms:Decrypt 操作。您可以从 AWS KMS 控制台获取 AWS Secrets Manager 使用的 KMS 密钥的详细信息。请注意,必须将 KMS 密钥 ID 用于资源部分。
Example Policy:
{
"Version": "2012-10-17",
"Statement":
},
{
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "arn:aws:kms:region:account_id:key/key_id",
"Condition": {
"StringEquals": {
"kms:ViaService": "secretsmanager.region.amazonaws.com"
}
}
}
]
}
有关什么可能会阻止代理连接到数据库实例的更多信息,请查看 describe-db-proxy-targets 命令输出中的 TargetHealth 结构。有关 RDS 代理目标的连接运行状况的更多信息,请查看状态、原因和描述字段。
aws rds describe-db-proxy-targets --db-proxy-name $DB_PROXY_NAME
有关详细信息,请参阅验证代理的连接性。
检查数据库实例当前是否接受连接查看数据库实例的当前状态并确认其处于可用状态。有关查看数据库实例状态的更多信息,请参阅 RDS 和 Aurora 文档以了解数据库实例状态。
检查 IAM 用户/角色是否与具有所需权限的客户端关联注意:只有在 RDS 代理上启用了 IAM 数据库身份验证时,才需要执行此步骤。
客户端必须生成令牌才能授权连接请求。为此,与此客户端关联的 IAM 用户和 IAM 角色必须具有 rds-db:connect IAM 策略。此外,请确保使用 ARN 中的 RDS 代理 ID 作为策略中的“资源”属性。
Example:
"Resource": "arn:aws:rds-db:us-east-2:1234567890:dbuser:prx-ABCDEFGHIJKL01234/db_user"
有关更多信息,请参阅为 IAM 数据库创建和使用 IAM 策略操作。
查看 RDS 代理日志启用 RDS 代理的增强日志记录功能。启用日志记录可提供有关 SQL 语句的详细信息。这些日志是帮助您了解某些身份验证问题的有用资源。这些日志只能用于调试,因为它们会增加性能开销。为了最大限度地减少开销,RDS 代理会在启用此设置 24 小时后自动关闭该设置。