无法从AWS Fargate公网IP访问连接RDS PostgreSQL的Django应用
解决Fargate与RDS PostgreSQL连接失败的排查步骤
1. 先查安全组的双向权限
- Fargate任务的安全组:必须配置出站规则,允许访问RDS的5432端口(PostgreSQL默认端口),目标选RDS的安全组ID或者对应的IP段。别只看入站规则,Fargate主动连RDS靠的是出站权限,本地测试时你电脑的出站是开放的,但Fargate的安全组可能默认限制了出站。
- RDS的安全组:入站规则要允许Fargate任务所在安全组的5432端口访问,别只留你本地的公网IP——很多人本地测试后忘了更新这一步,导致Fargate的请求被RDS安全组挡了。
2. 核对VPC与网络配置
- 确认Fargate任务和RDS在同一个VPC里,如果跨VPC得配置VPC peering或者中转网关,不然RDS安全组没法直接引用Fargate的安全组。
- Fargate用awsvpc网络模式的话,检查任务所在子网的路由表:如果RDS是私有访问(公有可访问性关闭),子网得能直接路由到RDS的子网;如果RDS是公网可访问,私有子网里的Fargate得配NAT网关才能出公网。另外别忘了NACLs(网络访问控制列表),这东西是无状态的,要同时允许5432端口的出站请求和入站响应。
3. 检查数据库连接参数
- 确认Fargate里的连接字符串没写错:
- RDS的端点地址别拼错,比如把后缀打错了
- 端口号是不是5432(没改RDS默认端口的话就是这个)
- 用户名、密码要对,而且得在Fargate任务定义里正确配置环境变量——别本地用.env文件,部署到Fargate却忘了传这些变量。
- 如果RDS开了公有可访问性,得确保Fargate有公网访问权限;如果关了公有可访问,Fargate必须在同一VPC的私有子网里。
4. IAM权限检查(如果用了IAM数据库认证)
- 要是你的Django用IAM认证连RDS,得给Fargate任务的执行角色加
rds-db:connect权限,还要确保数据库用户绑定了对应的IAM角色。没用到IAM认证的话跳过这步。
5. 直接测试连通性
- 进Fargate容器里跑命令测RDS端口:
超时的话基本是网络/安全组问题,连接被拒的话大概率是权限或参数错了。可以通过修改任务定义临时加执行命令,或者用telnet <你的RDS端点> 5432 # 或者用nc nc -zv <你的RDS端点> 5432aws ecs execute-command进容器(前提是任务开了exec权限)。
6. 查RDS状态与日志
- 确认RDS实例是可用状态,没在维护或故障中。
- 看RDS的数据库日志,有没有Fargate任务IP的连接拒绝记录,能帮你快速定位是网络问题还是数据库权限问题。
重点核对提示:
- Fargate安全组的出站规则是否包含RDS的5432端口
- RDS安全组的入站规则是否把Fargate的安全组设为源(不是仅本地IP)
- Fargate的子网能不能访问RDS所在的子网(同一VPC或已配置对等)
内容的提问来源于stack exchange,提问作者Anil Bhatt
相关产品推荐
相关产品推荐

