在 Elastic Beanstalk 上使用 rgeo 设置 RoR

setting up RoR with rgeo on Elastic Beanstalk

我正在尝试在 Elastic Beanstalk 上启动我的 RoR 应用程序和 运行,并且正在努力让 rgeo gem 工作。我在 Web 服务器上遇到的错误是:

I, [2015-09-28T11:26:54.982049 #21789]  INFO -- : Completed 500 Internal     Server Error in 5ms (ActiveRecord: 2.6ms)
F, [2015-09-28T11:26:54.983523 #21789] FATAL -- : 
NoMethodError (undefined method `point' for nil:NilClass):
  lib/app/weather_service.rb:61:in `block in get_location'
  ....

当代码访问由数据库中的 POINT 数据类型支持的模型属性时,会发生该错误。该错误通常是由于缺少依赖项,即 中描述的 geos。所以我连接到底层 EC2 实例,安装了 geos 并重新安装了 rgeo gem。这解决了 rails 控制台中的问题:

[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ cd /var/app/current
[ec2-user@ip-xxx-xxx-xxx-xxx current]$ rails c
Loading production environment (Rails 4.2.4)
irb(main):001:0> RGeo::Geos.supported?
=> true

但是,这并没有解决网络服务器中的错误。我很确定我没有清楚地了解 Elastic Beanstalk 环境,并且可能对底层 EC2 实例进行直接更改不会使依赖项可用于应用程序实例。我知道我需要将依赖项添加到自定义 AMI 或 ebextensions 以供将来部署,但我想确保在完成该过程之前我的依赖项正常工作。任何指导将不胜感激。

以防其他人遇到同样的问题,我确实找到了解决方案。这些是我遵循的步骤:

  • 使用 AMI ami-bddbc48d 创建了一个 EC2 实例
  • 使用这个有用的脚本安装了 PostGIS 依赖项https://gist.github.com/whyvez/8d19096712ea44ba66b0
  • 从该实例创建了自定义 AMI
  • 更新了我的 EBS 环境配置以使用新的自定义 AMI
  • 瞧!问题已解决