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

时间:2017-09-20 03:46:31

标签: amazon-web-services amazon-ec2 amazon-rds amazon-vpc

我在VPC A中的EC2实例上运行Tableau Server。同时,我在另一个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创建了以下路由表。

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

两个路线表都是主要的。每个都有0个子网(不确定这是否重要)。

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

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

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

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

7 个答案:

答案 0 :(得分:8)

VPC Peering的工作方式与公共子网连接到Internet网关的方式大致相同 - 路由表定义流量进出子网的方式。

让VPC对等工作:

  • 邀请&接受对等连接(完成)
  • 在每个VPC中创建路由表,指向其他VPC IP范围的对等连接(完成)
  • 关联您希望能够与路由表对等的每个子网
  • 或者,编辑现有路线表以包含对等条目

路由的工作原理如下:

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

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

将其视为路线图上的路线,告知路线应该指向何处。

答案 1 :(得分:8)

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

假设您有2个VPC:

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

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

步骤2:在每个 VPC

中配置路由表
  • 制作VPC:将此路线添加到RDS VPC: 10.0.2.0/24 - > PCX-e8e8e8e8
  • RDS VPC:将此路线添加到Production VPC: 10.0.1.0/24 - > PCX-e8e8e8e8

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

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

现在应该可以连接了。

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

答案 2 :(得分:2)

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. RDS实例的路由表服务子网 - 将路由目的地添加到VPC 2 CIDR块(172.16.0.0/16)和目标VPC 2对等连接(从列表中选择 - pcx - #####)。
2. RDS安全组 - 添加数据库端口的入站规则,源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.专用路由表的网络访问控制列表 - 如果您只允许某些端口,请为DB端口添加规则,source = VPC 2 CIDR块(172.16.0.0/16)和允许。

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

我认为就是这样 - 但如果我找到另一个设置,我会更新此消息。

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

答案 3 :(得分:2)

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

Tl;博士 如果您已经对等了VPC,修改了路由表,并且打开了数据库安全组以允许来自源VPC CIDR的连接(基本上是@John Rotenstein的建议https://stackoverflow.com/a/46331624/1830623),那么请确保未标记您的RDS实例公开。

答案 4 :(得分:0)

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

  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
    

答案 5 :(得分:0)

问题已经回答,但是我想补充一下,如果您要连接到RDS的公共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 。 通过右键单击已创建的对等连接和“编辑DNS设置”,确保通过UI启用AllowDnsResolutionFromRemoteVpc。或使用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)路由表必须添加了 Accepter 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)同样,接受方VPC(RDS VPC)路由表必须添加了请求者IP 苹果酒(例如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)最后,还更新Acceptor VPC(RDS)上的防火墙/安全组,以允许从Ec2 VPC的mysql端口通过端口3306进行连接。

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

答案 6 :(得分:0)

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