为什么在对等后无法从另一个 VPC 中的 EC2 实例连接 AWS RDS 实例

Why can't I connect AWS RDS instance from EC2 instance in another VPC after peering

我是运行Tableau Server 在我们VPC A 的EC2 实例上。同时,我在另一个VPC B 中创建了一个postgres RDS。现在我想在Tableau Server 和RDS 之间建立连接。 RDS VPC的CIDR为172.31.0.0/16,EC2 VPC的CIDR为10.0.0.0/16.

根据 A DB Instance in a VPC Accessed by an EC2 Instance in a Different VPC,我在 VPC A 和 VPC B 之间创建了对等互连,pcx-xyz123。此外,我还为 VPC 创建了以下路由 tables。

RDS VPC
Destination      Target
172.31.0.0/16    local
10.0.0.0/16      pcx-xyz123

EC2 VPC
Destination      Target
10.0.0.0/16      local
172.31.0.0/16    pcx-xyz123

两条路线 table 都是主要路线。虽然每个都有 0 个子网(不确定这是否重要)。

但是我仍然无法从 Tableau Server 连接 RDS。

这两个实例是由同一个帐户创建的。它们都列在美国东部(俄亥俄州)下。所以我假设他们在同一个地区。另外,它们的主机名中都有 us-east-2。在我的 PC 上,我可以使用 psql 命令或 pgAdmin 连接到 RDS。

为什么我无法连接两个实例?

编辑: 我在与 Tableau Server 相同的 VPC 的相同子网中创建了另一个 EC2 Linux 实例,仅用于调试目的。我以相同的方式配置了对等互连和路由 table,并将子网关联到路由 table。但是,我仍然无法连接到 EC2 Linux 实例上的 RDS。

VPC 对等互连的工作方式与 Public 子网连接到 Internet 网关的方式大致相同——路由 Tables 定义流量如何流动 in/out 个子网。

对于 VPC 对等工作:

  • 邀请并接受 对等连接(完成)
  • 在每个 VPC 中创建一个 路由 table,指向另一个 VPC 的 IP 范围的对等连接(完成)
  • 将您希望能够对等的每个子网关联到路由Table
  • 或者,编辑现有路由tables以包含对等条目
  • 如果您的 RDS 数据库是 public,并且您正尝试使用数据库的 public DNS 进行连接,那么您将需要编辑 DNS 设置[= your peering connection 的 40=] 允许 DNS 解析。

路由工作如下:

  • 当流量离开子网时,会查询路由 Table 以确定将流量发送到何处
  • 首先评估最严格的(例如 /24),直到最不严格的(例如 /0)
  • 根据适当的路由 Table 条目路由流量

这意味着您可以将 一些 子网配置为对等,而不必包括所有子网。传统上,对等的是 私有子网,并且可能只有 特定的 私有子网——但这完全是您的选择。

将其视为路线图上的方向,告诉交通应该去哪里。

VPC 对等是关于细节的。以下是我们必须 运行 才能让它工作的项目。

对等 VPC 1 到 VPC 2(很明显,但包括那些没有执行此步骤的人)。从 VPC 1 建立到 VPC 2 的对等连接。接受请求。如果不同区域,切换到VPC 2区域并接受对等请求。

示例:

VPC 1 CIDR = 10.0.0.0/16
VPC 2 CIDR = 172.16.0.0/16

VPC 1(带 RDS 实例的 VPC)
1. 路由 Table RDS 实例的服务子网 - 添加路由目标到 VPC 2 CIDR 块 (172.16.0.0/16) 和目标 VPC 2 对等连接(select 来自列表 - pcx-#### #).
2. RDS Security Group - 为源IP为VPC 2 CIDR块(172.16.0.0/16)的DB端口添加入站规则。因此,您将有两个数据库端口的入站规则。一个用于 VPC 1 (10.0.0.0/16) CIDR 块,一个用于 VPC 2 (172.16.0.0/16)。
3. 专用路由的网络访问控制列表 Table - 如果您只允许某些端口,请为数据库端口添加规则,source = VPC 2 CIDR block (172.16.0.0/16) and Allow.

专有网络 2
1.路由 Table EC2 实例的服务子网 - 添加路由目标到 VPC 1 CIDR 块 (10.0.0.0/16) 和目标 VPC 1 对等连接(select 来自列表 - pcx-#### #).
2. 实例安全组 - 添加源IP为VPC 1网段(10.0.0.0/16)的DB端口入站规则。
3. 路由的网络访问控制列表 Table - 如果您只允许某些端口,请为数据库端口添加规则,source = VPC 1 CIDR block (10.0.0.0/16) and Allow.

我想就是这样 - 但如果我找到其他设置,我会更新此消息。

只是一些历史,我们这样做是为了灾难恢复。我们的生产实例和 RDS MS SQL DB 在 us-east-1 (VPC 1) 中,我们的容灾热备实例在 us-west-2 (VPC 2) 中。我们主要从美国获取流量,但我们可能会考虑将备用站点作为真正的生产副本(缩放组),然后将 Route 5 记录更改为基于延迟的路由。

以下是通过 VPC 对等访问私有 RDS 的步骤:

假设您有 2 个 VPC:

  • 生产 VPC:10.0.1.0/24
  • RDS VPC:10.0.2.0/24

第一步:在两个VPC之间创建VPC对等连接。 然后接受建立连接的请求。您将获得一个连接 ID,例如:pcx-e8e8e8e8

第二步:在每个 VPC

中配置路由table
  • 生产 VPC:将此路由添加到 RDS VPC: 10.0.2.0/24 —> pcx-e8e8e8e8
  • RDS VPC:将此路由添加到生产 VPC: 10.0.1.0/24 —> pcx-e8e8e8e8

第 3 步:配置 RDS 的安全组以接受生产 VPC 的 IP 范围,通过添加此入站规则

  • 端口(MS SQL: 1433, MySQL: 3306, etc)——允许来源:10.0.1.0/24

现在应该可以连接了。

注意:连接到 RDS 时,您应该使用提供的 DNS 名称以获得更好的弹性。 AWS VPC DNS 将负责将此名称解析为 RDS 实例的本地 IP 地址。

我遇到了类似的问题,我是这样做的:

  1. 已创建 VPC 对等互连,如上述线程中所述。

  2. 在RDS实例的安全组中,可以添加一条规则,允许端口5432(Postgres端口)Securitygroupid/hostIP/VPC_CIDR。

  3. 登录EC2实例安装psql(sudo yum install postgresql-server postgresql-contrib),执行以下命令:

    # this will ask for the password and connect.
    psql --host=xxxxxx.us-west-2.rds.amazonaws.com --port=5432 --username=xxxxx --password --dbname=xxxxx
    

完成上述所有操作后,我在连接到 RDS 实例时仍然遇到问题。嗯,有史以来第一次,我实际上在 Reddit 上找到了不是这样的答案(这里:https://www.reddit.com/r/aws/comments/8hx28w/rds_access_from_a_different_vpc/dyn616i/)。

Tl;博士 如果您已经对等 VPC、修改路由表并打开数据库安全组以允许来自源 VPC CIDR 的连接(基本上,@John Rotenstein 的建议 ),那么请确保您的 RDS 实例未被标记作为 Public.

问题已经得到解答,但我想补充一下,如果您连接到 RDS 的 public DNS(例如 prod.upd9999upd.us-east-1.rds.amazonaws.com),那么您必须启用私有 IP 的 DNS 解析。这是通过 AllowDnsResolutionFromRemoteVpc.

完成的

示例:将Vpc EC2_PROD(172.0.0.0/16)连接到Vpc RDS_PROD(30.0.0.0/16).

1) 创建从 EC2 VPC(请求者)到 RDS VPC(接受者)的 Peering connection。 确保通过右键单击已创建的对等连接和 "Edit DNS Settings" 启用 AllowDnsResolutionFromRemoteVpc 和 UI。或者用 following command

aws ec2 modify-vpc-peering-connection-options --vpc-peering-connection-id "pcx-04a511409bb08ef16" --requester-peering-connection-options '{"AllowDnsResolutionFromRemoteVpc":true}' --accepter-peering-connection-options '{"AllowDnsResolutionFromRemoteVpc":true}' --region us-east-1

您最终的对等连接将如下所示:

aws ec2 describe-vpc-peering-connections --profile aws-work --region us-east-1
{
    "VpcPeeringConnections": [
        {
            "Status": {
                "Message": "Active", 
                "Code": "active"
            }, 
            "Tags": [
                {
                    "Value": "ec2-to-rds-peering-connection", 
                    "Key": "Name"
                }
            ], 
            "AccepterVpcInfo": {
                "PeeringOptions": {
                    "AllowEgressFromLocalVpcToRemoteClassicLink": false, 
                    "AllowDnsResolutionFromRemoteVpc": true, 
                    "AllowEgressFromLocalClassicLinkToRemoteVpc": false
                }, 
                "VpcId": "vpc-RDS", 
                "Region": "us-east-1", 
                "OwnerId": "?", 
                "CidrBlockSet": [
                    {
                        "CidrBlock": "30.0.0.0/16"
                    }
                ], 
                "CidrBlock": "30.0.0.0/16"
            }, 
            "VpcPeeringConnectionId": "pcx-04a511409bb08ef16", 
            "RequesterVpcInfo": {
                "PeeringOptions": {
                    "AllowEgressFromLocalVpcToRemoteClassicLink": false, 
                    "AllowDnsResolutionFromRemoteVpc": true, 
                    "AllowEgressFromLocalClassicLinkToRemoteVpc": false
                }, 
                "VpcId": "vpc-ec2", 
                "Region": "us-east-1", 
                "OwnerId": "?", 
                "CidrBlockSet": [
                    {
                        "CidrBlock": "172.0.0.0/16"
                    }
                ], 
                "CidrBlock": "172.0.0.0/16"
            }
        }
    ]
}

2) 您的请求者 VPC (EC2 VPC) 路由 table 必须具有 接受者 IP 苹果酒(例如 30.0.0.0/16) 添加。 (请参阅下面的 Routes 标签)

aws ec2 describe-route-tables --filters Name=tag:Name,Values=EC2_PROD --profile aws-work --region us-east-1
{
    "RouteTables": [
        {
            "Associations": [
                {
                    "RouteTableAssociationId": "rtbassoc-?", 
                    "Main": true, 
                    "RouteTableId": "rtb-?"
                }
            ], 
            "RouteTableId": "rtb-?", 
            "VpcId": "vpc-EC2_PROD", 
            "PropagatingVgws": [], 
            "Tags": [
                {
                    "Value": "EC2_PROD", 
                    "Key": "Name"
                }
            ], 
            "Routes": [
                {
                    "GatewayId": "local", 
                    "DestinationCidrBlock": "172.0.0.0/16", 
                    "State": "active", 
                    "Origin": "CreateRouteTable"
                }, 
                {
                    "Origin": "CreateRoute", 
                    "DestinationCidrBlock": "30.0.0.0/16",    // Accepter IP cider block
                    "State": "active", 
                    "VpcPeeringConnectionId": "pcx-04a511409bb08ef16"
                }, 
                {
                    "GatewayId": "igw-???", 
                    "DestinationCidrBlock": "0.0.0.0/0", 
                    "State": "active", 
                    "Origin": "CreateRoute"
                }
            ]
        }
    ]
}

3) 同样地 Acceptor VPC (RDS VPC) route table must have Requester IP cider(eg. 172.0.0.0/16) 添加。 (请参阅下面的 Routes 标签)

aws ec2 describe-route-tables --filters Name=tag:Name,Values=RDS_PROD --profile aws-work --region us-east-1
{
    "RouteTables": [
        {
            "Associations": [
                {
                    "SubnetId": "subnet-?", 
                    "RouteTableAssociationId": "rtbassoc-?", 
                    "Main": false, 
                    "RouteTableId": "rtb-?"
                }
            ], 
            "RouteTableId": "rtb-?", 
            "VpcId": "vpc-RDS", 
            "PropagatingVgws": [], 
            "Tags": [
                {
                    "Value": "RDS_PROD", 
                    "Key": "Name"
                }
            ], 
            "Routes": [
                {
                    "Origin": "CreateRoute", 
                    "DestinationCidrBlock": "172.0.0.0/16",    // Requester IP cider block
                    "State": "active", 
                    "VpcPeeringConnectionId": "pcx-04a511409bb08ef16"
                }, 
                {
                    "GatewayId": "local", 
                    "DestinationCidrBlock": "30.0.0.0/16", 
                    "State": "active", 
                    "Origin": "CreateRouteTable"
                }, 
                {
                    "GatewayId": "igw-???", 
                    "DestinationCidrBlock": "0.0.0.0/0", 
                    "State": "active", 
                    "Origin": "CreateRoute"
                }
            ]
        }
    ]
}

4) 最后还 更新 Accepter VPC (RDS) 上的防火墙/安全组 以允许从端口 3306 上的 Ec2 VPC 连接,如果它 mysql.

aws ec2 describe-security-groups --filters Name=tag:Name,Values=RDS_FIREWALL --profile aws-work --region us-east-1
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1", 
                    "PrefixListIds": [], 
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ], 
                    "UserIdGroupPairs": [], 
                    "Ipv6Ranges": []
                }
            ], 
            "Description": "Dev", 
            "Tags": [
                {
                    "Value": "RDS_FIREWALL", 
                    "Key": "Name"
                }
            ], 
            "IpPermissions": [
                {
                    "PrefixListIds": [], 
                    "FromPort": 3306, 
                    "IpRanges": [
                        {
                            "Description": "EC2_VPC_IP_CIDER", 
                            "CidrIp": "172.0.0.0/16"
                        }
                    ], 
                    "ToPort": 3306, 
                    "IpProtocol": "tcp", 
                    "UserIdGroupPairs": [], 
                    "Ipv6Ranges": []
                }
            ], 
            "GroupName": "RDS_FIREWALL", 
            "VpcId": "vpc-???", 
            "OwnerId": "???", 
            "GroupId": "sg-???"
        }
    ]
}

如果您拥有相同的 CIDR,则对等互连将不起作用。如果您将实例从一个区域克隆到另一个区域,则会出现相同的 CIDR。在路由中,您将无法定义相同的 CIDR。