从 EC2 实例连接到不同区域的 RDS
Connect to RDS in a different region from EC2 instance
所以我在 us-east-1
中有一个主 RDS,在 us-west-1
中有一个副本。两者都在各自区域的 VPC 内。我想让 us-east-1
中的一个 EC2 实例连接到副本实例。
一个简单的解决方案是为 RDS 副本启用 public 访问权限,并将 EC2 的 IP 添加到其安全组,并且它有效。
但我不想允许静态 IP,而是希望允许访问我的 us-east-1
VPC 的整个 CIDR 范围,而且我不希望我的实例 public 可访问。
为此,我在两个区域之间设置了 VPC 对等连接,并在两个 VPC 的路由表中添加了条目,以将流量转发到彼此的 CIDR 范围到对等连接。
EC2 实例的 CIRD 范围是 172.31.0.0/16
,我已将其添加到 us-west-1
区域中 RDS 副本的安全组中。但出于某种原因,无法从我的 EC2 访问 RDS。
我还错过了什么吗?谢谢!
总结一下我的设置:
美国东部:
- VPC CIDR:
172.31.0.0/16
- 路由 Table 条目:目标
10.0.0.0/16
路由到 us-west-1
VPC 的对等连接。
- EC2 IP:
172.31.5.234
美国西部:
VPC CIDR:10.0.0.0/16
路由 Table 条目:目标 172.31.0.0/16
路由到 us-east-1
VPC 的对等连接。
RDS:
- Public 可访问:是
- 安全组:允许来自
172.31.0.0/16
的连接
为了重现您的情况,我执行了以下操作:
在us-east-1
中:
- 使用 "VPC with Public and Private Subnets" VPC 向导
在 us-east-1
中创建了一个 CIDR 为 172.31.0.0/16
的 VPC
- 在 public 子网
中启动了一个 Amazon EC2 Linux 实例
在us-west-1
中:
- 使用 "VPC with Public and Private Subnets" VPC 向导
在 us-west-1
中创建了一个 CIDR 为 10.0.0.0/16
的 VPC
- 添加了一个额外的私有子网以允许创建使用多个 AZ 的 Amazon RDS 子网组
- 跨两个私有子网
创建了一个 RDS 子网组
- 在 私有 子网中启动了 Amazon RDS MySQL 数据库
Publicly accessible = No
设置对等:
- 在
us-east-1
中,为 us-west-1
中的 VPC 创建了一个 对等连接请求
- 在
us-west-1
中,接受 对等请求
配置路由:
- 在
us-east-1
中,配置Public路由Table(EC2实例使用)路由10.0.0.0/16
流量到对等 VPC
- 在
us-west-1
中,配置 私有路由 Table(由 RDS 实例使用)以将 172.31.0.0/16
流量路由到对等 VPC
安全组:
- 在
us-east-1
中,创建了一个安全组 (App-SG
),允许来自 0.0.0.0/0
的入站端口 22 连接。将其关联到 EC2 实例。
- 在
us-west-1
中,创建了一个安全组 (RDS-SG
),允许来自 10.0.0.0/16
(对等连接的另一端)的入站端口 3306 连接。将其关联到 RDS 实例。
测试:
- 使用 ssh 连接到
us-east-1
中的 EC2 实例
- 已安装 mysql 客户端(
sudo yum install mysql
)
- 已连接到 mysql:
mysql -u master -p -h xxx.yyy.us-west-1.rds.amazonaws.com
这通过对等连接成功连接到 RDS 数据库。
仅供参考,数据库的 DNS 名称解析为 10.0.2.40
(在 us-west-1 VPC 的 CIDR 范围内)。此 DNS 解析适用于两个 VPC。
总而言之,重要的位是:
- 建立双向对等连接
- 在 RDS 实例上配置安全组以允许来自对等 VPC 的 CIDR 的入站连接
- 无需使数据库public可访问
所以我在 us-east-1
中有一个主 RDS,在 us-west-1
中有一个副本。两者都在各自区域的 VPC 内。我想让 us-east-1
中的一个 EC2 实例连接到副本实例。
一个简单的解决方案是为 RDS 副本启用 public 访问权限,并将 EC2 的 IP 添加到其安全组,并且它有效。
但我不想允许静态 IP,而是希望允许访问我的 us-east-1
VPC 的整个 CIDR 范围,而且我不希望我的实例 public 可访问。
为此,我在两个区域之间设置了 VPC 对等连接,并在两个 VPC 的路由表中添加了条目,以将流量转发到彼此的 CIDR 范围到对等连接。
EC2 实例的 CIRD 范围是 172.31.0.0/16
,我已将其添加到 us-west-1
区域中 RDS 副本的安全组中。但出于某种原因,无法从我的 EC2 访问 RDS。
我还错过了什么吗?谢谢!
总结一下我的设置:
美国东部:
- VPC CIDR:
172.31.0.0/16
- 路由 Table 条目:目标
10.0.0.0/16
路由到us-west-1
VPC 的对等连接。 - EC2 IP:
172.31.5.234
美国西部:
VPC CIDR:
10.0.0.0/16
路由 Table 条目:目标
172.31.0.0/16
路由到us-east-1
VPC 的对等连接。RDS:
- Public 可访问:是
- 安全组:允许来自
172.31.0.0/16
的连接
为了重现您的情况,我执行了以下操作:
在us-east-1
中:
- 使用 "VPC with Public and Private Subnets" VPC 向导 在
- 在 public 子网 中启动了一个 Amazon EC2 Linux 实例
us-east-1
中创建了一个 CIDR 为 172.31.0.0/16
的 VPC
在us-west-1
中:
- 使用 "VPC with Public and Private Subnets" VPC 向导 在
- 添加了一个额外的私有子网以允许创建使用多个 AZ 的 Amazon RDS 子网组
- 跨两个私有子网 创建了一个 RDS 子网组
- 在 私有 子网中启动了 Amazon RDS MySQL 数据库
Publicly accessible = No
us-west-1
中创建了一个 CIDR 为 10.0.0.0/16
的 VPC
设置对等:
- 在
us-east-1
中,为us-west-1
中的 VPC 创建了一个 对等连接请求
- 在
us-west-1
中,接受 对等请求
配置路由:
- 在
us-east-1
中,配置Public路由Table(EC2实例使用)路由10.0.0.0/16
流量到对等 VPC - 在
us-west-1
中,配置 私有路由 Table(由 RDS 实例使用)以将172.31.0.0/16
流量路由到对等 VPC
安全组:
- 在
us-east-1
中,创建了一个安全组 (App-SG
),允许来自0.0.0.0/0
的入站端口 22 连接。将其关联到 EC2 实例。 - 在
us-west-1
中,创建了一个安全组 (RDS-SG
),允许来自10.0.0.0/16
(对等连接的另一端)的入站端口 3306 连接。将其关联到 RDS 实例。
测试:
- 使用 ssh 连接到
us-east-1
中的 EC2 实例
- 已安装 mysql 客户端(
sudo yum install mysql
) - 已连接到 mysql:
mysql -u master -p -h xxx.yyy.us-west-1.rds.amazonaws.com
这通过对等连接成功连接到 RDS 数据库。
仅供参考,数据库的 DNS 名称解析为 10.0.2.40
(在 us-west-1 VPC 的 CIDR 范围内)。此 DNS 解析适用于两个 VPC。
总而言之,重要的位是:
- 建立双向对等连接
- 在 RDS 实例上配置安全组以允许来自对等 VPC 的 CIDR 的入站连接
- 无需使数据库public可访问