我在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。
VPC Peering的工作方式与公共子网连接到Internet网关的方式大致相同 - 路由表定义了流量进出子网的方式。
对于VPC Peering工作:
路由的工作原理如下:
这意味着您可以将某些子网配置为对等,而不必包含所有子网。传统上,私有子网是对等的,可能只是特定的私有子网 - 但这完全是您的选择。
将其视为路线图上的指示,告知交通应该指向哪里。
以下是通过VPC对等访问私有RDS的步骤:
假设您有2个VPC:
步骤1:在两个VPC之间创建VPC对等连接。然后接受建立连接的请求。您将获得一个连接ID,例如:pcx-e8e8e8e8
步骤2:在每个VPC中配置路由表
步骤3:通过添加此入站规则,配置RDS的安全组以接受生产VPC的IP范围
现在应该准备连接了。
注意:连接到RDS时,应使用提供的DNS名称以获得更好的弹性。 AWS VPC DNS将负责将此名称解析为RDS实例的本地IP地址。
完成上述所有操作后,我仍然无法连接到我的RDS实例。有史以来第一次,我实际上在Reddit上找到了答案而不是SO(这里:https://www.reddit.com/r/aws/comments/8hx28w/rds_access_from_a_different_vpc/dyn616i/)。
Tl; Dr如果您已经查看了VPC的修改后的路由表,并打开了数据库安全组以允许来自源VPC CIDR的连接(基本上是@John Rotenstein的建议https://stackoverflow.com/a/46331624/1830623),那么请确保您的RDS实例未标记为上市。
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.专用路由表的网络访问控制列表 - 如果您只允许某些端口,请为数据库端口添加规则,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记录更改为基于延迟的路由。
我遇到了类似的问题,这就是我所做的:
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的公共DNS(例如prod.upd9999upd.us-east-1.rds.amazonaws.com
),那么你必须启用DNS解析到私有IP。这是通过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 cider(例如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)路由表必须添加Requester IP cider(例如,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-???"
}
]
}