AWS EB 部署节点应用程序:无法运行 npm install

Posted

技术标签:

【中文标题】AWS EB 部署节点应用程序:无法运行 npm install【英文标题】:AWS EB deploying Node app: failed to run npm install 【发布时间】:2017-10-13 14:52:29 【问题描述】:

我正在尝试将我的节点应用程序部署到 AWS。它甚至不允许我使用 eb deploy 部署应用程序(保持为Sample Application)。

版本:运行 Node.js 的 64 位 Amazon Linux 2016.09 v4.0.1

日志说

运行 npm install 失败

但我不太确定他们还要求我做些什么来修复它。我可以在本地进行 npm 安装:

-------------------------------------
/var/log/eb-activity.log
-------------------------------------
  Failed to run npm install. Snapshot logs for more details.
  Traceback (most recent call last):
    File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 695, in <module>
      main()
    File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 677, in main
      node_version_manager.run_npm_install(options.app_path)
    File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 136, in run_npm_install
      self.npm_install(bin_path, self.config_manager.get_container_config('app_staging_dir'))
    File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 180, in npm_install
      raise e
  subprocess.CalledProcessError: Command '['/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/bin/npm', '--production', 'rebuild']' returned non-zero exit status 1 (Executor::NonZeroExitStatus)

概览页面的快照:

Eb 部署失败消息:

$ eb deploy
Creating application version archive "app-bdfdd-170514_152527".
Uploading: [##################################################] 100% Done...
INFO: Environment update is starting.                               
INFO: Deploying new version to instance(s).                         
ERROR: Failed to run npm install. Snapshot logs for more details.   
ERROR: [Instance: i-09af789a519075c5e] Command failed on instance. Return code: 1 Output: (TRUNCATED).../opt/elasticbeanstalk/containerfiles/ebnode.py", line 180, in npm_install
    raise e
subprocess.CalledProcessError: Command '['/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/bin/npm', '--production', 'install']' returned non-zero exit status 1. 
Hook /opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.sh failed. For more detail, check /var/log/eb-activity.log using console or EB CLI.
INFO: Command execution completed on all instances. Summary: [Successful: 0, Failed: 1].
ERROR: Unsuccessful command execution on instance id(s) 'i-09af789a519075c5e'. Aborting the operation.
ERROR: Failed to deploy application.                                

ERROR: Failed to deploy application.

我的 ebextensions 文件(.ebextentions/config.config),默认:

packages:
  yum:
    git: []
    cairo: []
    cairo-devel: []
    libjpeg-turbo-devel: []
    giflib-devel: []

Package.json 文件


  "name": "live-demos",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": 
    "test": "echo \"Error: no test specified\" && exit 1",
    "gulp": "gulp",
    "start": "node app.js",
    "start:dev": "browserify ./js/about.js -o ./build/js/bundle.js && gulp build-dev"
  ,
  "author": "",
  "license": "ISC",
  "dependencies": 
    "body-parser": "^1.x.x",
    "browserify": "^13.1.0",
    "canvas": "^1.4.0",
    "d3": "^3.5.17",
    "d3.layout.cloud": "^1.2.0",
    "ejs": "^2.5.1",
    "express": "^4.13.1",
    "gulp": "^3.9.0",
    "gulp-autoprefixer": "^2.3.1",
    "gulp-compass": "^2.1.0",
    "gulp-concat": "^2.6.0",
    "gulp-minify-css": "^1.2.0",
    "gulp-nodemon": "^2.0.4",
    "gulp-sass": "^2.0.4",
    "isotope-layout": "^3.0.1",
    "request": "^2.74.0",
    "request-promise": "^4.1.1"
  ,
  "devDependencies": 
    "gulp": "^3.9.0",
    "gulp-browserify": "^0.5.1",
    "gulp-nodemon": "^2.0.4"
  

【问题讨论】:

对此有什么想法吗? For more detail, check /var/log/eb-activity.log using console or EB CLI - 这会输出什么? 【参考方案1】:

这是一个很老的问题,但我在这里添加信息,因为我在本周遇到了同样的问题并且找到解决方案和解释并不容易。

TLDR:如果您看到此错误,您很可能是在使用 AWS 最小的实例之一,并且节点在完成 npm install 进程的完整列表之前内存不足。您可以通过.ebextensions 配置文件分配一些交换内存来解决此问题。

将以下文件夹/文件添加到您的存储库(或添加到现有配置文件),然后确保在运行 eb deploy 之前对其进行跟踪和提交。

# .ebextensions/01_setup_swap.config
commands:
    01setup_swap:
        test: test ! -e /var/swapfile
        command: |
            /bin/dd if=/dev/zero of=/var/swapfile bs=1M count=2048
            /bin/chmod 600 /var/swapfile
            /sbin/mkswap /var/swapfile
            /sbin/swapon /var/swapfile

TL_did_R

在 AWS 提供的最小实例类型(t2.micro、t1.micro 和 t3.nano)上运行多个 Elastic Beanstalk 节点应用程序时,我一直遇到这个问题。我可以绕过该错误的唯一方法是使用 Immutable Deployment Policy,这需要更长的时间并且会带来所有其他类型的麻烦,例如新实例 ID、ssh 会话重启、新日志等。

经过多次失败的搜索后,我终于 happened upon this post 用户 eladnava2 有效地提供了与我在这里包含的相同的解释和解决方案 - 但随后被线程中的接下来的几个人忽略了,他们仍在询问是否有解决方案成立。虽然包含的代码示例 eladnava2 对我不起作用,但它为我的下一次搜索设置了正确的路径,led me to this post 配置 EB 交换内存并包含一个代码 sn-p 对我有用,我上面逐字逐句包括在内。虽然这篇博文是关于 ruby​​ 应用程序的,但它对我的 Node 应用程序很有用。

自从几天前进行此更改以来,尽管每天多次部署到全部在 t3.nano 实例上运行的六个应用程序,但我没有再次遇到此错误。

所以...如果您在需要安装大量依赖项的小型实例上运行 Node 应用程序 - 当机器的默认资源不足以完成构建任务时,这可能会为您解决问题。

上述实例的内存:

【讨论】:

以上是关于AWS EB 部署节点应用程序:无法运行 npm install的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elasticbeanstalk 在 PHP 实例类型中安装节点和 npm

AWS EB 部署问题

使用 AWS CodeBuild 和 EB CLI 部署到 AWS Elastic Beanstalk

AWS EB Deploy 在部署后显示缺少 Dockerrun.aws.json

无法为本地存储库头运行 aws.push

无法在 Elastic Beanstalk 上部署节点:命令“/bin/sh -c npm install”返回非零代码:1