Django部署到AWS Elastic Beanstalk如何自动创建Postgres RDS数据库
解决Elastic Beanstalk部署Django时RDS不自动创建的问题
根因说明
aws:rds:dbinstance命名空间的配置仅在首次新建EB环境时生效,若你是在已有环境中新增该配置,重新部署不会触发RDS自动创建。另外你的现有配置存在两处问题:
- 手动在环境变量中定义了
RDS_USERNAME、RDS_PASSWORD,会覆盖EB创建RDS后自动注入的官方环境变量 - 缺少
DBName配置项,RDS创建时需要指定初始数据库名称
解决方案
场景1:还未创建EB环境,首次部署
- 修正django.config配置:
删除aws:elasticbeanstalk:application:environment下的RDS_USERNAME、RDS_PASSWORD两行,补充RDS的DBName配置,修正后的aws:rds:dbinstance段如下:
aws:rds:dbinstance: DBAllocatedStorage: 5 DBDeletionPolicy: Delete DBEngine: postgres DBEngineVersion: 10.17 DBInstanceClass: db.t2.micro DBPassword: lorokpopen DBUser: postgres MultiAZDatabase: false DBName: postgres # 新增初始数据库名,可自定义 DBPort: 5432 # 可选,默认就是5432
- 执行
eb create命令创建新环境,部署过程中会自动创建RDS实例,EB会自动注入RDS_HOSTNAME、RDS_PORT、RDS_USERNAME、RDS_PASSWORD、RDS_DB_NAME五个环境变量,无需手动执行eb setenv。
场景2:已有EB环境,不想重建
直接使用awsebcli的内置命令绑定RDS,执行以下命令即可自动创建并绑定RDS到现有环境,自动注入连接参数:
eb add-rds -i db.t2.micro -e postgres -v 10.17 --storage 5 --username postgres --password lorokpopen --delete
配套优化
Django数据库配置示例
在Django的settings.py中直接读取EB注入的环境变量即可:
import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.environ.get('RDS_DB_NAME'), 'USER': os.environ.get('RDS_USERNAME'), 'PASSWORD': os.environ.get('RDS_PASSWORD'), 'HOST': os.environ.get('RDS_HOSTNAME'), 'PORT': os.environ.get('RDS_PORT'), } }
部署命令优化
- 删除
01_makemigrations对应的container_command:migrations文件需要在本地生成后随代码提交,部署阶段执行makemigrations会出现多实例冲突、依赖缺失等问题。 - 给migrate命令增加RDS就绪检测,避免RDS还未启动完成导致部署失败,修正后的
02_migrate配置如下:
02_migrate: command: "source /var/app/venv/*/bin/activate && while ! nc -z $RDS_HOSTNAME $RDS_PORT; do sleep 3; done && python3 manage.py migrate --noinput" leader_only: true
安全建议
不要将RDS明文密码写在.config配置文件中提交到代码库,生产环境可通过eb setenv单独设置敏感参数,或使用AWS Secrets Manager存储机密信息。
内容的提问来源于stack exchange,提问作者bruvio
相关产品推荐
相关产品推荐

