案例8
题目
某公司在AWS上部署了一个应用,前端运行在Amazon EC2实例上,后端使用Amazon RDS(MySQL)数据库存储数据。用户反馈无法通过应用提交数据,检查发现EC2实例无法连接到RDS数据库,提示“Connection timed out”。以下是关键配置信息,请排查并解决问题。
相关配置信息
-
VPC配置
- 创建了一个VPC(
vpc-123456),包含两个子网:- 公共子网(
subnet-public-1,CIDR:10.0.1.0/24),关联了Internet网关,用于部署EC2实例。 - 私有子网(
subnet-private-1,CIDR:10.0.2.0/24),用于部署RDS数据库。
- 公共子网(
- 两个子网均启用了DNS主机名和DNS解析。
- 创建了一个VPC(
-
EC2实例配置
- 实例类型:t2.micro,位于公共子网
subnet-public-1。 - 安全组(
sg-ec2)规则:- 入站:允许HTTP(80)、HTTPS(443)来自0.0.0.0/0。
- 出站:允许所有流量(0.0.0.0/0)。
- 操作系统:Amazon Linux 2,已安装Web服务器和应用程序,配置数据库连接字符串为
jdbc:mysql://rds-instance.c1234567890.us-east-1.rds.amazonaws.com:3306/appdb。
- 实例类型:t2.micro,位于公共子网
-
RDS数据库配置
- 引擎:MySQL 8.0,实例类型:db.t2.small,位于私有子网
subnet-private-1。 - 安全组(
sg-rds)规则:- 入站:允许MySQL/Aurora(3306)来自
10.0.1.10/32(EC2实例的私有IP)。 - 出站:允许所有流量(0.0.0.0/0)。
- 入站:允许MySQL/Aurora(3306)来自
- 数据库参数组:默认配置,允许远程连接。
- 子网组:包含私有子网
subnet-private-1。
- 引擎:MySQL 8.0,实例类型:db.t2.small,位于私有子网
-
网络ACL配置
- 公共子网和私有子网的网络ACL均允许所有入站和出站流量(默认规则)。
解题思路
1. 明确问题核心:网络连通性故障
- 现象:EC2无法连接RDS(端口3306),提示超时,说明网络路径不通或端口被阻止。
- 可能方向:
- RDS安全组未正确允许EC2所在安全组的流量。
- EC2与RDS不在同一VPC或子网不可达。
- 端口号错误或RDS端点错误。
- 私有子网缺乏路由配置(如无VPC内路由)。
2. 排查RDS安全组规则
- 关键错误发现:
RDS安全组sg-rds的入站规则限制为10.0.1.10/32(单个EC2实例的私有IP),但EC2实例的私有IP可能动态变化(如重启后IP改变),导致规则失效。- 正确做法:允许来自EC2安全组
sg-ec2的流量,而非固定IP。
- 正确做法:允许来自EC2安全组
- 修正安全组规则:
将RDS安全组的入站规则修改为:- 类型:MySQL/Aurora(3306)
- 来源:选择“安全组”并指定EC2的安全组
sg-ec2。
3. 验证VPC和子网连通性
- 检查点:
- EC2和RDS是否在同一VPC(题目中均为
vpc-123456,正确)。 - 私有子网是否有到公共子网的路由(通过VPC内默认路由,无需额外配置,因同一VPC内子网默认互通)。
- EC2和RDS是否在同一VPC(题目中均为
- 潜在问题:
若RDS安全组仅允许特定IP,而EC2获取新IP后未更新规则,会导致连接失败(本题中固定IP是核心错误)。
4. 检查数据库端点和端口
- 配置验证:
- EC2的数据库连接字符串中的端点
rds-instance.c1234567890.us-east-1.rds.amazonaws.com是否正确(假设存在且属于当前RDS实例)。 - 端口是否为3306(正确,RDS默认端口)。
- EC2的数据库连接字符串中的端点
- 测试方法:
在EC2实例上使用telnet rds-instance.c1234567890.us-east-1.rds.amazonaws.com 3306测试连接:- 若超时,确认安全组规则;若返回“Connected”,则排查应用程序配置。
5. 排查子网路由表和NAT(非必需,但补充说明)
- 路由表配置:
私有子网无需NAT网关或Internet网关,因为EC2和RDS在同一VPC内,通信通过私有IP进行,无需公网访问。 - 常见误区:
误认为私有子网需要NAT才能与公共子网通信,实际同一VPC内子网默认通过私有IP互通,无需额外路由。
6. 完整修复步骤
- 更新RDS安全组规则:
- 登录AWS控制台,进入RDS实例的安全组
sg-rds。 - 删除现有的入站规则
10.0.1.10/32,添加新规则:- 类型:MySQL/Aurora(3306)
- 来源:安全组
sg-ec2(EC2实例所在的安全组)。
- 登录AWS控制台,进入RDS实例的安全组
- 验证EC2与RDS连通性:
- 通过SSH登录EC2实例,执行
telnet <RDS端点> 3306,确认连接成功(显示“Connected”)。
- 通过SSH登录EC2实例,执行
- 重启应用服务:
- 确保应用程序重新加载配置,建立数据库连接。
总结
核心错误:RDS安全组使用固定IP而非EC2安全组
- 安全组配置不当:
- 直接限制EC2实例的私有IP,未使用安全组关联,导致IP变化后规则失效。
- 最佳实践:在同一VPC内,通过安全组ID互相授权,而非固定IP。
- 网络连通性排查要点:
- 安全组规则(源/目标、端口、协议)。
- 同一VPC内子网默认互通,无需额外路由。
- 使用
telnet或nc工具测试端口连通性。
AWS网络排错核心:
- 安全组是服务间通信的主要控制手段,优先检查入站/出站规则是否允许目标端口和来源。
- 避免依赖动态变化的私有IP,通过安全组ID或VPC内资源关联进行授权。
- 利用AWS控制台的“VPC流量日志”或第三方工具(如EC2实例内的网络诊断命令)定位具体阻塞点。

浙公网安备 33010602011771号