AWS PostgreSQL RDS实例与Docker-Compose部署的Django容器连接失败:数据库不存在问题求助
从你给出的报错信息来看,核心问题非常明确:你的Django应用在尝试连接一个名为db-PROJECT_NAME-ec2的数据库,但这个数据库在你的AWS RDS实例中并不存在。下面是一步步的排查和解决步骤:
1. 验证环境变量的准确性
首先检查你的envs/.env.prod文件,确认SQL_DATABASE的值是不是你在AWS RDS上计划使用的数据库名称,而不是本地测试时自动生成的db-PROJECT_NAME-ec2。
你可以直接在运行中的Web容器里打印环境变量来验证:
docker exec <你的web容器名称> printenv SQL_DATABASE
如果输出的是db-PROJECT_NAME-ec2,那说明环境变量配置有误,需要修改.env.prod里的SQL_DATABASE为你RDS上的目标数据库名。
2. 在AWS RDS上创建目标数据库
AWS RDS在创建PostgreSQL实例时,只会自动创建一个默认的postgres数据库,不会帮你创建业务数据库。你需要手动创建:
- 登录AWS控制台,进入你的RDS实例详情页,打开查询编辑器,用超级用户(通常是你创建实例时设置的主用户名)登录。
- 执行创建数据库的SQL命令:
CREATE DATABASE <你的目标数据库名>;
创建完成后,执行\l命令可以查看所有数据库,确认新库已存在。
3. 检查entrypoint脚本的干扰
从报错日志里的Waiting for postgres... PostgreSQL started可以看出,你的entrypoint.prod.sh脚本里有等待PostgreSQL的逻辑。但生产环境你用的是RDS,不是本地容器数据库,需要确认这个脚本的逻辑是否正确:
- 脚本是不是在等待本地postgres容器的主机名(比如
db),而不是RDS的SQL_HOST?如果是,这个等待逻辑会失效,甚至可能导致环境变量没有正确加载。 - 脚本里有没有硬编码数据库名称的代码?比如有没有覆盖
SQL_DATABASE环境变量的逻辑?
建议修改entrypoint脚本,让它基于SQL_HOST和SQL_PORT来检测RDS的连通性,而不是本地容器。
4. 验证RDS的网络和权限配置(提前排除后续问题)
虽然当前报错是数据库不存在,但也要确保后续连接不会遇到网络或权限问题:
- 安全组配置:确认RDS实例的安全组允许你的Docker容器所在服务器(EC2/ECS节点)的IP访问5432端口(PostgreSQL默认端口)。
- 用户权限:确保你的
SQL_USER拥有目标数据库的访问权限,以及执行migrate所需的权限。可以在RDS查询编辑器中执行:
GRANT ALL PRIVILEGES ON DATABASE <你的目标数据库名> TO <你的SQL_USER>;
5. 测试连接
完成上述步骤后,重启你的Web容器,或者直接在容器内手动执行migrate命令测试:
docker exec <你的web容器名称> python manage.py migrate
如果没有报错,说明连接成功了。
内容的提问来源于stack exchange,提问作者justzino

