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

上次更新时间: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": "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"
                    }
                }
            }
        ]
    }
  • 有关什么可能会阻止代理连接到数据库实例的更多信息,请查看 describe-db-proxy-targets 命令输出中的 TargetHealth 结构。有关 RDS 代理目标的连接运行状况的更多信息,请查看状态、原因和描述字段。
  • aws rds describe-db-proxy-targets --db-proxy-name $DB_PROXY_NAME

    有关详细信息,请参阅验证代理的连接性

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

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

    检查 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 小时后自动关闭该设置。


    这篇文章对您有帮助吗?


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