无法通过 VPC 对等连接到另一个 VPC 中的 RDS
Cannot connect to RDS in another VPC via VPC peering
我有两个 VPC:
- 专有网络
- RDS实例
- VPC B
- EC2 实例
还有几个子网:
- 专有网络
- 私人A
- 私人B
- 同行 A
- VPC B
- 私人A
- 私人B
- 同行 A
RDS在VPC A的Private A, Private B, Peer A中
EC2 在 VPC B 的 Peer A 中。
我想从 EC2 连接到 RDS 实例。
我创建了一个对等互连:
resource "aws_vpc_peering_connection" "a_to_b" {
vpc_id = aws_vpc.a.id
peer_vpc_id = aws_vpc.b.id
auto_accept = true
accepter {
allow_remote_vpc_dns_resolution = true
}
requester {
allow_remote_vpc_dns_resolution = true
}
}
resource "aws_vpc_peering_connection_accepter" "a_to_b" {
vpc_peering_connection_id = aws_vpc_peering_connection.a_to_b.id
auto_accept = true
}
我也有整个 CIDR 块的路由表,如下所示:
resource "aws_route_table" "a_peer" {
vpc_id = aws_vpc.a.id
}
resource "aws_route_table_association" "a_peer" {
route_table_id = aws_route_table.a_peer.id
subnet_id = aws_subnet.a_peer.id
}
resource "aws_route" "a_peer_b" {
route_table_id = aws_route_table.a_peer.id
destination_cidr_block = aws_subnet.b_peer.cidr_block
vpc_peering_connection_id = aws_vpc_peering_connection.a_to_b.id
}
resource "aws_route_table" "b_peer" {
vpc_id = aws_vpc.b.id
}
resource "aws_route_table_association" "b_peer" {
route_table_id = aws_route_table.b_peer.id
subnet_id = aws_subnet.b_peer.id
}
resource "aws_route" "b_peer_a" {
route_table_id = aws_route_table.b_peer.id
destination_cidr_block = aws_subnet.a_peer.cidr_block
vpc_peering_connection_id = aws_vpc_peering_connection.a_to_b.id
}
我还创建了从 RDS 实例上的 ingress
和 egress
到 EC2 安全组的安全组。
当我通过 SSH 连接到 EC2 时,我可以获得 DNS:
$ nslookup rds.xxxxxxxxxxx.eu-west-2.rds.amazonaws.com
Server: 192.16.0.2
Address: 192.16.0.2#53
Non-authoritative answer:
Name: rds.xxxxxxxxxxx.eu-west-2.rds.amazonaws.com
Address: 10.16.192.135
但是,curl
无法连接:
$ curl rds.xxxxxxxxxxx.eu-west-2.rds.amazonaws.com:5432
预期的响应是:
$ curl rds.xxxxxxxxxxx.eu-west-2.rds.amazonaws.com:5432
curl: (52) Empty reply from server
VPC 对等互连处于“活动”状态并且路由表与 Terraform 匹配。
我如何连接它?
我自己做了一些测试,我很确定问题是由您的路由引起的,假设您的 VPC 中的其他所有内容都与 VPC 一样正确和子网定义未显示。
具体来说,您写道“RDS 位于 VPC A 的私有 A、私有 B、对等点 A 中”。这意味着 RDS 主机可能在 这些子网中的任何一个 中。您无法控制它,因为 RDS 可以选择使用哪个子网。您只能在创建 RDS 时通过选择可用区来部分控制它。随后,您的对等路由 tables 应该覆盖所有这三个子网。最简单的方法是使用 VPC CIDR range:
# Route from instance in VPC B to any subnet in VPC A which
# hosts your RDS in all its subnets
resource "aws_route" "b_peer_a" {
route_table_id = aws_route_table.b_peer.id
destination_cidr_block = aws_vpc.a.cidr_block
vpc_peering_connection_id = aws_vpc_peering_connection.a_to_b.id
}
然后您还需要在 VPC A 中有一个 路由 table 与其所有子网的对等连接相关联:
resource "aws_route_table" "a_peer" {
vpc_id = aws_vpc.a.id
}
resource "aws_route_table_association" "a_peer" {
route_table_id = aws_route_table.a_peer.id
subnet_id = aws_subnet.a_peer.id
}
resource "aws_route_table_association" "a_private1" {
route_table_id = aws_route_table.a_peer.id
subnet_id = aws_subnet.a_private1.id
}
resource "aws_route_table_association" "a_private2" {
route_table_id = aws_route_table.a_peer.id
subnet_id = aws_subnet.a_private2.id
}
resource "aws_route" "a_peer_b" {
route_table_id = aws_route_table.a_peer.id
destination_cidr_block = aws_subnet.b_peer.cidr_block
vpc_peering_connection_id = aws_vpc_peering_connection.a_to_b.id
}
我有两个 VPC:
- 专有网络
- RDS实例
- VPC B
- EC2 实例
还有几个子网:
- 专有网络
- 私人A
- 私人B
- 同行 A
- VPC B
- 私人A
- 私人B
- 同行 A
RDS在VPC A的Private A, Private B, Peer A中
EC2 在 VPC B 的 Peer A 中。
我想从 EC2 连接到 RDS 实例。
我创建了一个对等互连:
resource "aws_vpc_peering_connection" "a_to_b" {
vpc_id = aws_vpc.a.id
peer_vpc_id = aws_vpc.b.id
auto_accept = true
accepter {
allow_remote_vpc_dns_resolution = true
}
requester {
allow_remote_vpc_dns_resolution = true
}
}
resource "aws_vpc_peering_connection_accepter" "a_to_b" {
vpc_peering_connection_id = aws_vpc_peering_connection.a_to_b.id
auto_accept = true
}
我也有整个 CIDR 块的路由表,如下所示:
resource "aws_route_table" "a_peer" {
vpc_id = aws_vpc.a.id
}
resource "aws_route_table_association" "a_peer" {
route_table_id = aws_route_table.a_peer.id
subnet_id = aws_subnet.a_peer.id
}
resource "aws_route" "a_peer_b" {
route_table_id = aws_route_table.a_peer.id
destination_cidr_block = aws_subnet.b_peer.cidr_block
vpc_peering_connection_id = aws_vpc_peering_connection.a_to_b.id
}
resource "aws_route_table" "b_peer" {
vpc_id = aws_vpc.b.id
}
resource "aws_route_table_association" "b_peer" {
route_table_id = aws_route_table.b_peer.id
subnet_id = aws_subnet.b_peer.id
}
resource "aws_route" "b_peer_a" {
route_table_id = aws_route_table.b_peer.id
destination_cidr_block = aws_subnet.a_peer.cidr_block
vpc_peering_connection_id = aws_vpc_peering_connection.a_to_b.id
}
我还创建了从 RDS 实例上的 ingress
和 egress
到 EC2 安全组的安全组。
当我通过 SSH 连接到 EC2 时,我可以获得 DNS:
$ nslookup rds.xxxxxxxxxxx.eu-west-2.rds.amazonaws.com
Server: 192.16.0.2
Address: 192.16.0.2#53
Non-authoritative answer:
Name: rds.xxxxxxxxxxx.eu-west-2.rds.amazonaws.com
Address: 10.16.192.135
但是,curl
无法连接:
$ curl rds.xxxxxxxxxxx.eu-west-2.rds.amazonaws.com:5432
预期的响应是:
$ curl rds.xxxxxxxxxxx.eu-west-2.rds.amazonaws.com:5432
curl: (52) Empty reply from server
VPC 对等互连处于“活动”状态并且路由表与 Terraform 匹配。
我如何连接它?
我自己做了一些测试,我很确定问题是由您的路由引起的,假设您的 VPC 中的其他所有内容都与 VPC 一样正确和子网定义未显示。
具体来说,您写道“RDS 位于 VPC A 的私有 A、私有 B、对等点 A 中”。这意味着 RDS 主机可能在 这些子网中的任何一个 中。您无法控制它,因为 RDS 可以选择使用哪个子网。您只能在创建 RDS 时通过选择可用区来部分控制它。随后,您的对等路由 tables 应该覆盖所有这三个子网。最简单的方法是使用 VPC CIDR range:
# Route from instance in VPC B to any subnet in VPC A which
# hosts your RDS in all its subnets
resource "aws_route" "b_peer_a" {
route_table_id = aws_route_table.b_peer.id
destination_cidr_block = aws_vpc.a.cidr_block
vpc_peering_connection_id = aws_vpc_peering_connection.a_to_b.id
}
然后您还需要在 VPC A 中有一个 路由 table 与其所有子网的对等连接相关联:
resource "aws_route_table" "a_peer" {
vpc_id = aws_vpc.a.id
}
resource "aws_route_table_association" "a_peer" {
route_table_id = aws_route_table.a_peer.id
subnet_id = aws_subnet.a_peer.id
}
resource "aws_route_table_association" "a_private1" {
route_table_id = aws_route_table.a_peer.id
subnet_id = aws_subnet.a_private1.id
}
resource "aws_route_table_association" "a_private2" {
route_table_id = aws_route_table.a_peer.id
subnet_id = aws_subnet.a_private2.id
}
resource "aws_route" "a_peer_b" {
route_table_id = aws_route_table.a_peer.id
destination_cidr_block = aws_subnet.b_peer.cidr_block
vpc_peering_connection_id = aws_vpc_peering_connection.a_to_b.id
}