Rails 6部署到AWS Elastic Beanstalk后无法连接RDS报PG::ConnectionBad错误
解决方案
- 优先解决交互式shell环境变量加载问题
你遇到的报错核心原因是:SSH登录EC2实例后的默认shell不会自动加载Elastic Beanstalk控制台配置的环境变量,同时默认Rails运行环境为development,读取到的数据库配置没有host参数,Rails会默认尝试连接本地PostgreSQL的Unix套接字,才会出现对应报错。而EB部署阶段会自动加载环境变量且指定生产环境,所以部署时的迁移任务可以正常运行,和你反馈的现象完全吻合。- 登录EC2实例后,先切换到应用实际运行的webapp用户:
sudo su - webapp- 手动将EB配置的所有环境变量加载到当前shell:
export $(sudo /opt/elasticbeanstalk/bin/get-config environment | xargs)- 执行Rails相关命令时明确指定生产环境:
RAILS_ENV=production bundle exec rails console RAILS_ENV=production bundle exec rails db:migrate - 排查配置有效性
- 进入Rails控制台后打印当前环境的数据库配置,确认参数正确:
检查输出的puts Rails.application.config.database_configuration[Rails.env]host字段是否为你的RDS实例域名,而非空值或localhost。如果host为空,说明当前环境的database.yml配置没有正确读取到RDS_HOSTNAME变量,或DATABASE_URL配置错误覆盖了host参数。
2. 如果配置了DATABASE_URL,确认该值的格式完全正确,用户名、密码、主机地址、端口、数据库名和RDS_*系列变量保持一致。Rails 6中DATABASE_URL的优先级高于database.yml的单独配置,错误的DATABASE_URL会直接导致连接失败。 - 永久修复交互式shell的环境变量加载(可选)
如果需要每次SSH登录后自动加载EB环境变量,可以在~/.bashrc或~/.bash_profile中添加如下内容:
下次登录后即可直接执行Rails相关命令。export $(sudo /opt/elasticbeanstalk/bin/get-config environment | xargs) export RAILS_ENV=production
内容的提问来源于stack exchange,提问作者Imran Ahmad
相关产品推荐
相关产品推荐

