从Heroku迁移应用程序到AWS的高级指南?

5

我是一名新手系统管理员,正在寻找有关如何将整个Rails应用程序从Heroku迁移到AWS(弹性beanstalk)的一般指导。我几乎没有使用heroku的服务(除了sendgrid)。我的最大障碍是集成应用本身和迁移数据库(将从heroku postgresql迁移到AWS RDS postgresql)。

希望那些经历过相同迁移的人能提供任何见解。谢谢!

2个回答

3
我已经将一些客户从Heroku迁移到Elastic Beanstalk,因此我整理了以下高级说明,介绍如何设置Rails应用程序以在Elastic Beanstalk上运行:
Web进程
在Elastic Beanstalk中,您有多种方式可以运行Rails应用程序。
您可以使用Elastic Beanstalk的Ruby平台直接在预配置的EC2实例上部署Rails应用程序。这将要求您学习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 进程可能会竞争资源,这也可能是不希望看到的。
另一种方法是使用Elastic Beanstalk的工作环境。您仍然可以使用相同的Docker / Rails平台,但Elastic Beanstalk不会将负载均衡器附加到您的工作程序。相反,它将创建一个SQS队列,并在运行应用程序的每个EC2机器上运行代理,该代理将将SQS消息的内容发布到您的应用程序中。没有其他队列比SQS获得官方支持,但是您始终可以使应用程序忽略本地SQS代理并只侦听您想要使用的任何其他排队系统。
数据库迁移
正如Richard在他的答案中提到的那样,将Postgresql数据库从Heroku迁移到RDS(Amazon的托管数据库服务)的最简单方法需要一些应用程序停机时间,同时您需要将数据库数据从一个平台导出并导入到另一个平台。幸运的是,在我所做的大多数迁移中,这并不是一个很大的问题,通常可以在网站活跃用户较少的时间安排小的维护窗口。
另一个重要的主题是如何将您的应用程序中使用的Heroku插件迁移到Elastic Beanstalk。您提到您很少使用第三方服务,因此我不会涵盖如何将这些服务与您的应用程序一起迁移到AWS。
如果您想了解更多关于Heroku插件迁移的信息,我已经发表了一篇文章,详细介绍了如何在AWS上复制Heroku插件
希望这能有所帮助。

2
我还没有迁移到AWS,但我已经从Heroku迁移到了Rackspace,我告诉你,只要你正确地解决了依赖关系,这相对简单。
有两个真正的问题:
1. 应用程序本身 2. 数据库
应用程序可以使用GIT处理。 数据库将需要手动转移。

--

应用程序转移
应用程序转移是最简单的部分 - 毫无疑问,由于您使用Heroku,您已经调用了git。这意味着您只需在外部服务器上设置好git即可。
请注意 - 如果您有任何基于Heroku的资产依赖项,则需要将其保存到本地并迁移。依赖于Heroku的CDN和其他存储库应备份并转移到新主机。这可能不是必要的,但需要记住。
对于转移本身,这里有一个非常好的GoRails教程
简而言之,您必须设置您的服务器以接受带有Web服务器应用程序(nginx/apache)的传入请求。然后,这将允许您设置一个单独的git仓库,您可以将应用程序推送到其中。
我会省略细节,除了说这是我们在转移到RackSpace时使用的代码:
server {
   listen [ip];
   root /var/www/viewgit;

   server_name git.domain.com;
      location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9001;
      }
      location ~ ^projects/.*/(HEAD|info/refs|objects/info/.*|git-upload-pack)$   {
        root /var/www/viewgit/projects;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME   /usr/lib/git-core/git-http-backend;
        fastcgi_param PATH_INFO         $uri;
        fastcgi_param GIT_PROJECT_ROOT  /var/www/viewgit/projects;
        fastcgi_param GIT_HTTP_EXPORT_ALL "";
        fastcgi_pass unix:/var/run/fcgiwrap.socket;
     }
}

这将允许您将另一个“远程”仓库添加到本地应用程序代码中:
git add remote X http://git.yourdomain.com/your_code.git

这样做将为您提供一种直接的方法将代码推送到新服务器。我不会详细介绍 post-receive hooks 等内容,以及如何使用它们使其正常工作。

--

数据库

数据库有些棘手,但并非不可克服。

解决方法是使用pg:backups,它基本上创建了一个数据库的“转储”,使您能够在其他地方加载和部署它。

这对于 PGSQL > MYSQL 来说要困难得多。但由于 Heroku 本身使用亚马逊的数据库,我认为您不会遇到问题。

最好按照在此下载您的 Heroku 数据库的说明进行操作。

下载完数据库后,您需要将其压缩并上传到 AWS 服务中。正如我之前提到的,我没有太多经验,所以如果您需要帮助,我会为您更新。


将数据导入到完全空白的数据库中是否明智,还是应该先有一个模式?这将决定在导入之前是否运行“运行rake db:migrate”。 - dubc15

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接