为什么我无法使用 RDS 代理连接到我的 Amazon RDS 数据库或 Amazon Aurora 数据库实例?
上次更新日期:2022 年 2 月 7 日
我无法通过 RDS 代理连接到我的 Amazon Relational Database Service (Amazon RDS) 或 Amazon Aurora 数据库实例。为什么我无法连接到我的数据库?
简短描述
即使 RDS 代理处于“可用”状态,您遇到 RDS 代理连接失败的原因也会有多种。RDS 代理连接失败有以下原因:
- 数据库实例或 RDS 代理上的安全组规则阻止了连接
- RDS 代理目前仅在 VPC 内运行,因此来自私有网络外部的连接会失败
- 由于修改或因为数据库实例处于不可用状态,数据库实例不接受连接
- 使用的身份验证凭证不正确(使用本机用户名/密码模式时)
- 与客户端关联的 AWS Identity and Access Management (IAM) 用户或角色无权连接 RDS 代理(在使用 IAM 数据库身份验证时)
解决方法
请注意:如果您将 RDS 代理用于启用了 IAM 身份验证的 RDS 数据库实例或 Aurora 数据库集群,则请确保通过代理连接的所有用户都使用用户名和密码进行身份验证。有关在 RDS 代理中支持 IAM 的更多信息,请参阅设置 IAM 策略。
检查客户端是否可以在 VPC 的私有网络中访问 RDS 代理
RDS 代理只能在 VPC 内使用,不能公开访问(尽管数据库实例可以)。如果您从私有网络外部进行连接,则连接会超时。
- 如果客户端来自同一 VPC,请检查 RDS 代理的安全组是否允许原定设置端口上来自客户端的连接。MySQL 的原定设置端口为 3306,PostgreSQL 的原定设置端口为 5432。向与 VPC 关联的安全组添加规则,以允许所需的流量。
- 如果客户端来自另一个 VPC,则使用 VPC 对等连接。查看安全组和路由表以管理来自其他 VPC 的流量。
- 如果您的客户端来自企业网络,则请使用 Direct Connect 或 Site-to-Site 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
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)
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
- 确保 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": "secretsmanager:GetSecretValue",
"Resource": [
"arn:aws:secretsmanager:region:account_id:secret:secret_name"
]
},
{
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "arn:aws:kms:region:account_id:key/key_id",
"Condition": {
"StringEquals": {
"kms:ViaService": "secretsmanager.region.amazonaws.com"
}
}
}
]
}
aws rds describe-db-proxy-targets --db-proxy-name $DB_PROXY_NAME
有关详细信息,请参阅验证代理的连接性。
检查数据库实例当前是否接受连接
检查 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 代理的 Enhanced Logging(增强日志记录)功能。启用日志记录可提供有关 SQL 语句的详细信息。这些日志是帮助您了解某些身份验证问题的有用资源。由于启用这些日志会增加性能开销,因此最佳实践是仅在调试时启用它们。为了最大限度地减少开销,RDS 代理会在启用此设置 24 小时后自动关闭该设置。