案例8

题目

某公司在AWS上部署了一个应用,前端运行在Amazon EC2实例上,后端使用Amazon RDS(MySQL)数据库存储数据。用户反馈无法通过应用提交数据,检查发现EC2实例无法连接到RDS数据库,提示“Connection timed out”。以下是关键配置信息,请排查并解决问题。

相关配置信息

  1. 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解析。
  2. 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
  3. 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)。
    • 数据库参数组:默认配置,允许远程连接。
    • 子网组:包含私有子网subnet-private-1
  4. 网络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。
  • 修正安全组规则
    将RDS安全组的入站规则修改为:
    • 类型:MySQL/Aurora(3306)
    • 来源:选择“安全组”并指定EC2的安全组sg-ec2

3. 验证VPC和子网连通性

  • 检查点
    1. EC2和RDS是否在同一VPC(题目中均为vpc-123456,正确)。
    2. 私有子网是否有到公共子网的路由(通过VPC内默认路由,无需额外配置,因同一VPC内子网默认互通)。
  • 潜在问题
    若RDS安全组仅允许特定IP,而EC2获取新IP后未更新规则,会导致连接失败(本题中固定IP是核心错误)。

4. 检查数据库端点和端口

  • 配置验证
    • EC2的数据库连接字符串中的端点rds-instance.c1234567890.us-east-1.rds.amazonaws.com是否正确(假设存在且属于当前RDS实例)。
    • 端口是否为3306(正确,RDS默认端口)。
  • 测试方法
    在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. 完整修复步骤

  1. 更新RDS安全组规则
    • 登录AWS控制台,进入RDS实例的安全组sg-rds
    • 删除现有的入站规则10.0.1.10/32,添加新规则:
      • 类型:MySQL/Aurora(3306)
      • 来源:安全组sg-ec2(EC2实例所在的安全组)。
  2. 验证EC2与RDS连通性
    • 通过SSH登录EC2实例,执行telnet <RDS端点> 3306,确认连接成功(显示“Connected”)。
  3. 重启应用服务
    • 确保应用程序重新加载配置,建立数据库连接。

总结

核心错误:RDS安全组使用固定IP而非EC2安全组

  1. 安全组配置不当
    • 直接限制EC2实例的私有IP,未使用安全组关联,导致IP变化后规则失效。
    • 最佳实践:在同一VPC内,通过安全组ID互相授权,而非固定IP。
  2. 网络连通性排查要点
    • 安全组规则(源/目标、端口、协议)。
    • 同一VPC内子网默认互通,无需额外路由。
    • 使用telnetnc工具测试端口连通性。

AWS网络排错核心

  • 安全组是服务间通信的主要控制手段,优先检查入站/出站规则是否允许目标端口和来源。
  • 避免依赖动态变化的私有IP,通过安全组ID或VPC内资源关联进行授权。
  • 利用AWS控制台的“VPC流量日志”或第三方工具(如EC2实例内的网络诊断命令)定位具体阻塞点。
posted @ 2025-04-17 00:03  cat桑  阅读(91)  评论(0)    收藏  举报