在 AWS Elastic Beanstalk 上部署 Rails / Ember 应用程序

Posted

技术标签:

【中文标题】在 AWS Elastic Beanstalk 上部署 Rails / Ember 应用程序【英文标题】:Deploying a Rails / Ember app on AWS Elastic Beanstalk 【发布时间】:2015-07-06 07:30:31 【问题描述】:

我在部署弹性 beanstalk rails 4 + ember cli 应用程序时遇到问题。我有一个 rails 应用程序,在根目录中我有一个名为“frontend”的文件夹,其中包含我由 ember CLI Rails 生成的 ember 应用程序。

我的配置: 运行 Ruby 2.1 (Puma) 的 64 位 Amazon Linux 2015.03 v1.3.1

我在运行 eb deploy 后从我的活动日志中遇到以下错误:

粗略地,我明白了

ERROR: Instance: i-25c139e7 Module: AWSEBAutoScalingGroup ConfigSet: null Command failed on instance. Return code: 1 Output: (TRUNCATED)...mber-cli-rails.rb:58:in `compile!'

查看 /var/log/eb-activity.log

我首先得到了很多 npm 错误!错误:尝试解锁尚未锁定的 X

紧随其后 npm 错误!系统 Linux 3.14.35-28.38.amzn1.x86_64 npm 错误!命令“/usr/bin/node”“/usr/bin/npm”“安装” npm 错误! cwd /var/app/ondeck/前端 npm 错误!节点-v v0.10.35 npm 错误! npm -v 1.4.28 npm 错误! npm 错误!可以在以下位置找到其他日志记录详细信息: npm 错误! /var/app/ondeck/frontend/npm-debug.log npm 错误!不好的代码 0 耙中止! EmberCLI Rails 要求您的 Ember 应用具有插件。

From within your EmberCLI directory please run:

$ npm install --save-dev ember-cli-rails-addon@0.0.11

in you Ember application root: /var/app/ondeck/frontend

Tasks: TOP => assets:precompile => ember:compile
(See full trace by running task with --trace) (Executor::NonZeroExitStatus)

所以我 ssh 进入指定的目录并运行 npm install,这也给我留下了很多关于授权的错误。当我通过 sudo 运行时,模块安装正确,但是当我重新部署我的应用程序时,它给了我完全相同的错误。

我已经尝试过 sudo NPM install 和 chown -R node_modules webapp 以便 webapp 组可以访问 node_modules 文件夹但没有成功。

【问题讨论】:

我自己也有同样的问题。有没有想过这个? 是的。 SSH 到您的 Elastic Beanstalk 实例,mkdir webapp on ~/../ 并运行“chown -u webapp:webapp ~/../webapp”。我认为 ember 期望具有用户 webapp 适当权限的根目录 webapp。 是的,这有点道理。我认为npm 试图锁定webapp 用户主目录中的一些文件,我今天早些时候注意到webapp 用户没有主目录,但我没有同时创建一个。我担心如果应用程序尝试将负载扩展到另一个新实例,这种修复方法将不起作用。有经验吗? 好点。当实例启动时,在 EB 配置文件中包含 mkdir 命令是个好主意,但我只是提出一个假设。 此外,如果您希望负载均衡器在部署任何实例时为 webapp 创建主目录,请在 .ebextensions container_command 下的 .config 文件的 container_commands 中包含类似内容:“sudo rm -r - f ~/../webapp; sudo mkdir ~/../webapp; sudo chown webapp:webapp ~/../webapp”。我相信,这应该在任何实例的应用程序部署之前执行。现在测试它.. 【参考方案1】:

我讨厌冗长的答案,但这种情况相当复杂。

如上面的 cmets 所述,发现需要为 webapp 用户创建 主目录 (/home/webapp)。创建此目录后,节点包管理器 (npm) 可以正常执行。因为 AWSEB 环境可以扩展,所以从长远来看,通过 SSH 连接到 EB 主机并执行包和模块的一次性安装将无法正常工作。基本上,答案归结为以下逻辑步骤:

    在应用服务器上安装 git,因为 bower 需要它。 在/home/webapp 创建webapp 用户的主目录。 使用 npm 全局安装 bower。 调用您的 ember 应用的 npm install。 为您的 ember 应用调用 bower install

为了解决这个问题,我继续创建了几个.ebextensions 自定义文件,这些文件在eb deploy 期间执行。它们是按顺序排列的:

    .ebextensions/00_option_settings.config - 设置一些 EB 选项;例如,在eb deploy 期间执行的命令的超时长度。在这种情况下,所有命令将在 1200 秒后超时。

    option_settings:
      - namespace: 'aws:elasticbeanstalk:command'
        option_name: 'Timeout'
        value: '1200'
    

    .ebextensions/01_packages.config - 可以通过 yum 安装软件包,并使它们可用于您的 eb 实例。在这种情况下,我使用 yum 安装 git,稍后会被 bower 使用。

    packages:
      yum:
        git: []
    

    .ebextensions/02_commands.config - 允许您在解压通过eb deploy 上传的应用程序之前运行操作系统命令。 这部分答案满足了这个问题的主题:在我的特殊情况下,我需要创建/home/webapp 目录,确保它归webapp 用户所有,并且还有700 个权限。最后,我确保 bower 是全局安装的,因为我的 ember 应用程序需要它。

    commands:
      01_mkdir_webapp_dir:
        # use the test directive to create the directory
        # if the mkdir command fails the rest of this directive is ignored
        test: 'mkdir /home/webapp'
        command: 'ls -la /home/webapp'
      02_chown_webapp_dir:
        command: 'chown webapp:webapp /home/webapp'
      03_chmod_webapp_dir:
        command: 'chmod 700 /home/webapp'
      04_install_bower_global:
        command: 'npm install -g bower'
    

    .ebextensions/03_container_commands.config - 在应用程序解压缩后运行操作系统命令。 注意: 我的 ember 应用程序位于应用程序源代码的 frontend 目录中。为了安装 npm 和 bower 依赖项,需要从 frontend 目录执行 npm installbower install 命令。还值得一提的是 bower-install 命令需要 --allow-root 标志才能成功,因为执行这些命令的 AWS 用户具有提升的权限。

    container_commands:
      01_npm_install:
        # set the current working directory to fully-qualified frontend
        cwd: '/var/app/ondeck/frontend/'
        command: 'npm install'
        leader_only: 'false'
      02_bower_install:
        # set the current working directory to fully-qualified frontend
        cwd: '/var/app/ondeck/frontend/'
        command: 'bower --allow-root install'
        leader_only: 'false'
      03_seeddb:
        # seed my database (has nothing to do with this answer)
        command: 'rake db:seed_fu'
        leader_only: 'true'
    

【讨论】:

像魅力一样工作。我还添加了一个脚本来使用不相关的monit启动一个resque worker。你摇滚!

以上是关于在 AWS Elastic Beanstalk 上部署 Rails / Ember 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Elastic Beanstalk 上扩展 Magento

如何在 AWS Elastic Beanstalk 上设置 HTTPS

如何在 AWS Elastic Beanstalk 上设置 HTTPS

在 AWS Elastic Beanstalk 上运行节点和反应

如何使用 aws cli 在 Elastic Beanstalk 上上传和部署?

在aws elastic beanstalk上上传文件?