为什么我无法使用 RDS 代理连接到我的 Amazon RDS 数据库或 Amazon Aurora 数据库实例?

3 分钟阅读
0

我无法通过 Amazon RDS 代理连接到我的 Amazon Relational Database Service (Amazon RDS) 或 Amazon Aurora 数据库实例。

简述

由于多种原因,您可能会遇到使用 RDS 代理连接失败的情况。以下是 RDS 代理连接失败(即使 RDS 代理处于“可用”状态)的常见原因:

  • 数据库实例或 RDS 代理上的安全组规则阻止连接。
  • RDS 代理仅在虚拟私有云 (VPC) 内运行,因此来自私有网络外部的连接将遭遇失败。
  • 由于修改或处于不可用状态,数据库实例不接受连接。
  • 对于本机用户名和密码模式:您使用的身份验证凭证不正确。
  • 对于 WS Identity and Access Management (IAM) 数据库身份验证:与客户端关联的 IAM 用户或角色无权连接 RDS 代理。

解决方法

**注意:**如果您将 RDS 代理与使用 IAM 身份验证的 RDS 数据库实例或 Aurora 数据库集群一起使用,则所有用户都必须对其连接进行身份验证。确保所有通过代理连接的用户都使用用户名和密码对其连接进行身份验证。有关 RDS 代理中的 IAM 支持的更多信息,请参阅设置 IAM 策略

检查客户端是否可以访问 VPC 私有网络内的 RDS 代理

RDS 代理只能在 VPC 内使用,不能公开访问(但数据库实例可以)。如果您从私有网络外部连接,则您的连接将超时。在 VPC 内进行连接时,请注意以下属性:

  • 如果客户端来自同一 VPC,请检查您的 RDS 代理的安全组是否允许通过默认端口从客户端进行连接。MySQL 的默认端口为 3306,PostgreSQL 的默认端口为 5432向与 VPC 关联的安全组添加规则以允许所需的流量。
  • 如果客户端来自其他 VPC,则使用 VPC 对等连接。要管理来自其他 VPC 的流量,请查看安全组和路由表。
  • 如果您的客户端来自公司网络,请使用 AWS Direct ConnectAWS Site-to-Site VPN 直接连接到 VPC。
  • 如果您的客户端必须通过公共互联网进行连接,请使用 SSH 隧道作为中间主机。这允许您连接到同一 VPC 内的 RDS 代理。

确认 RDS 代理是否可以连接数据库实例

要管理连接池,RDS 代理必须与您的数据库实例建立连接。此连接使用存储在 AWS Secrets Manager 中的用户名和密码。使用以下最佳实践来确保 RDS 代理可以连接到您的数据库实例:

  • 检查 Secrets 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 RDS instance
Source : Common security group (for self referencing the security group)

如果他们使用不同的安全组,请在数据库实例安全组的入站规则中提及 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 代理启动连接以管理池。因此,您必须允许出站流量到达数据库实例。为此,RDS 代理安全组必须在其出站规则中允许所需的流量:

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 Policy 必须有权对密钥调用 secretsmanager:GetSecretValue 操作。

IAM Policy 必须有权对加密密钥的 AWS Key Management Service (AWS KMS) 密钥调用 kms:Decrypt 操作。您可以从 AWS KMS 控制台获取 Secrets Manager 使用的 KMS 密钥的详细信息。请注意,资源 部分必须使用 KMS 密钥 ID。请参阅以下示例策略:

{
  "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"
        }
      }
    }
  ]
}

**注意:**请务必将 account_idsecret_nameregionaccount_idkey_id 替换为相应的值。

  • 有关可能阻止代理连接到数据库实例的原因的更多信息,请运行 describe-db-proxy-targets 命令。然后,查看输出中的 TargetHealth 结构。查看状态原因描述字段,了解有关 RDS 代理目标连接运行状况的更多信息:
aws rds describe-db-proxy-targets --db-proxy-name $DB_PROXY_NAME

有关更多信息,请参阅验证代理的连接

检查数据库实例当前是否接受连接

查看数据库实例的当前状态并确认其处于可用状态。有关查看数据库实例状态的更多信息,请参阅 Amazon RDSAurora 数据库实例状态文档。

检查 IAM 用户/角色是否与具有所需权限的客户端相关联

**注意:**只有在 RDS 代理上激活 IAM 数据库身份验证后,才需要执行此步骤。

客户端必须生成令牌才能对连接请求进行授权。为此,与该客户端关联的 IAM 用户和 IAM 角色必须具有 rds-db:connect IAM Policy。此外,请确保在策略的“资源”属性中使用 ARN 中的 RDS 代理 ID:

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

有关详细信息,请参阅创建和使用适用于 IAM 数据库访问的 IAM 策略

查看 RDS 代理日志

打开 RDS 代理的增强日志记录特征。日志记录提供有关 SQL 语句的详细信息。这些日志非常实用,可以帮助您了解某些身份验证问题。由于这会增加性能开销,因此最佳做法是仅在调试时将其打开。为了最大限度地减少开销,RDS Proxy 会在您开启此设置 24 小时后自动将其关闭。

相关信息

使用 Amazon RDS 代理

Set up shared database connections with Amazon RDS Proxy