我已将几个客户端从 Heroku 迁移到 Elastic Beanstalk,因此我整理了这些关于如何设置 Rails 应用程序以在 Elastic Beanstalk 上工作的高级说明:
Web 进程
在 Elastic Beanstalk 中,您可以通过多种方式运行 Rails 应用程序。
您可以使用 Elastic Beanstalk 的 Ruby 平台将 Rails 应用程序直接部署在预配置的 EC2 实例上。这将要求您了解 Amazon 如何选择设置此平台以及您应该如何将您的应用程序与其集成。
如果您有一点 Docker 经验,我认为更好的方法是使用 Elastic Beanstalk 的 Docker 平台并将您的 Rails 应用程序部署为 Docker 容器。
您可以使用 Heroku 的 cedar Docker 镜像作为 Rails 容器的基础,也可以按照 this tutorial 创建自己的 Rails 镜像。无论哪种方式,假设您对 Docker 有基本的经验,您很快就会得到一个可部署的工件,它对运行环境的依赖性较小。
请注意,目前 Elastic Beanstalk 有两个版本的 Docker 平台。第一个版本允许您为每个 EC2 实例运行一个 Docker 容器。第二个版本使用 AWS ECS(弹性容器服务)在同一台 EC2 机器上调度多个 Docker 容器。即使您认为不需要多容器功能,我也建议您使用第二个版本。
后台工作
如果您在 Rails 应用程序中使用异步工作器,可以通过多种方式让它们在 Elastic Beanstalk 上运行。
您可以使用 Docker 的多容器平台在同一台 EC2 机器上运行工作进程和 Rails Web 进程。您可以对常规的非 Docker Rails 平台使用类似的方法。使用“.ebextensions”在运行您的 Web 进程的所有 EC2 实例上配置工作程序守护程序。
这种方法的主要缺点是您将无法独立于 Web 层扩展工作层容量。并且根据您的应用程序的性质,工作程序和 Web 进程可能会争夺资源,这也可能是不可取的。
另一种方法是使用 Elastic Beanstalk 的工作环境。您仍然可以使用相同的 Docker/Rails 平台,但 Elastic Beanstalk 不会将负载均衡器附加到您的工作应用程序。相反,它将创建一个 SQS 队列并在运行您的应用程序的每台 EC2 机器上运行一个代理,该代理会将 SQS 消息的内容发布到您的应用程序。除了 SQS 之外,没有对其他队列的官方支持,但是您始终可以让您的应用程序忽略本地 SQS 代理,而只收听您想使用的任何其他队列系统。
数据库迁移
正如 Richard 在他的回答中提到的,将 Postgresql 数据库从 Heroku 迁移到 RDS(亚马逊的托管数据库服务)的最简单方法将需要在您将数据库数据从一个平台导出和导入到其他。幸运的是,在我完成的大多数迁移中,这并不是一个大问题,总是可以找到可以安排一个小的维护窗口的时间,通常是在一天中站点活跃用户较少的时间段.
要涵盖的另一个重要主题是如何将您在应用程序中使用的 Heroku 插件迁移到 Elastic Beanstalk。您提到您很少使用第三方服务,因此我不会介绍如何将这些服务沿着您的应用程序迁移到 AWS。
如果您想了解有关 Heroku 插件迁移的更多信息,我已在 how to replicate Heroku addons on AWS 上发表了一篇详细介绍的文章。
希望对您有所帮助。