【问题标题】:High level instructions for migrating application from Heroku to AWS?将应用程序从 Heroku 迁移到 AWS 的高级说明?
【发布时间】:2016-03-12 00:25:10
【问题描述】:

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

感谢那些经历过相同迁移的人的任何见解。谢谢!!!

【问题讨论】:

    标签: ruby-on-rails postgresql amazon-web-services heroku amazon-elastic-beanstalk


    【解决方案1】:

    我已将几个客户端从 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 上发表了一篇详细介绍的文章。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      我还没有迁移到 AWS,但我已经完成了 Heroku > Rackspace,我会告诉你这相对简单如果你有正确排序的依赖项。 p>

      有两个真正的问题:

      1. 应用程序本身
      2. 数据库

      可以使用GIT 处理该应用程序。 数据库必须是手动传输的。

      --

      应用转移

      应用程序传输是最简单的部分 - 毫无疑问,由于您使用 Heroku,您已经调用了 git。这意味着您只需在外部服务器上设置git

      请注意 - 如果您有任何基于 Heroku 的资产依赖项,您需要 将这些资产保存在本地并进行迁移。 CDN 和其他依赖于 Heroku 的存储库 - 应该备份并转移到新主机。这可能不是必需的,但需要牢记。

      对于转账本身,有一个very good tutorial on GoRails here

      简而言之,您必须将服务器设置为通过 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;
           }
      }
      

      这将允许您将另一个 remote 存储库添加到您的本地应用代码:

      git add remote X http://git.yourdomain.com/your_code.git
      

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

      --

      数据库

      数据库稍微复杂一些,但并非不可逾越。

      这样做的方法是使用pg:backups,它实质上会创建数据库的“转储”,允许您加载它并将其部署到其他地方。

      这对于 PGSQL > MYSQL 来说要困难得多。但由于 Heroku 无论如何都使用亚马逊自己的数据库,我认为你不会有问题。

      您最好按照download your heroku DB here 的说明进行操作。

      下载数据库后,您必须将其压缩并上传到 AWS 服务。如前所述,我在这方面没有丰富的经验,所以我只想说,如果你需要任何帮助,我会为你写一个更新。

      【讨论】:

      • 建议导入一个完全空白的数据库还是先有一个模式?区别在于是否在导入之前运行“run rake db:migrate”。
      猜你喜欢
      • 2021-11-12
      • 2021-11-16
      • 1970-01-01
      • 2014-10-16
      • 2015-02-23
      • 2017-03-25
      • 2022-01-16
      • 2015-03-21
      • 2012-08-25
      相关资源
      最近更新 更多