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

上次更新日期:2023 年 2 月 17 日

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

简短描述

您使用 RDS 代理连接时遭遇失败的原因可能有多种。以下问题是 RDS 代理连接失败的常见原因,即使 RDS 代理处于可用状态也是如此:

  • 数据库实例或 RDS 代理上的安全组规则阻止了连接。
  • RDS 代理仅在虚拟私有云(VPC)内运行,因此来自私有网络外部的连接会失败。
  • 由于修改或因为数据库实例处于不可用状态,数据库实例不接受连接。
  • 关于本地用户名和密码模式:您使用的身份验证凭证不正确。
  • 关于 AWS 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 代理目标的连接运行状况的更多信息,请查看 State(状态)、Reason(原因)和 Description(描述)字段:
        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 policy 访问

        检查 RDS 代理日志

        打开 RDS 代理的 Enhanced Logging(增强日志记录)功能。日志记录可提供有关 SQL 语句的详细信息。这些日志是帮助您了解某些身份验证问题的有用资源。由于此操作会增加性能开销,因此最佳做法是仅在进行调试时才打开它们。为了最大限度地减少开销,RDS 代理会在打开此设置 24 小时后自动关闭该设置。


        这篇文章对您有帮助吗?


        您是否需要账单或技术支持?