【问题标题】:Error deploying node.js app to Amazon Elastic beanstalk将 node.js 应用程序部署到 Amazon Elastic beanstalk 时出错
【发布时间】:2016-11-12 01:58:13
【问题描述】:

我最近在 beanstalk 上部署了一个新的 node.js 应用程序并一直遇到以下错误?

[实例:i-cce89e4a] 实例上的命令失败。返回代码:1 输出:(TRUNCATED)...opt/elasticbeanstalk/containerfiles/ebnode.py",第 180 行,在 npm_install raise e subprocess.CalledProcessError: Command '['/opt/elasticbeanstalk/node-install/node-v4 .4.6-linux-x64/bin/npm', '--production', 'rebuild']' 返回非零退出状态 254。挂钩 /opt/elasticbeanstalk/hooks/configdeploy/pre/50npm.sh 失败。更多详细信息,请使用控制台或 EB CLI 检查 /var/log/eb-activity.log。

我的节点版本是:4.4.7

部署似乎在下面的最后一行失败:

 except Exception, e:
            npm_debug_log = '/var/log/nodejs/npm-debug.log'
            app_npm_debug_log = os.path.join(app_path, "npm-debug.log")
            write_event('Failed to run npm install. Snapshot logs for more details.', 'ERROR')
            if not os.path.exists(app_npm_debug_log):
                utc_time_str = datetime.datetime.utcnow().strftime("UTC %Y/%m/%d %H:%M:%S")
                err_msg = str.format("{0} cannot find application npm debug log at {1} \n", utc_time_str, app_npm_debug_log)
                print(err_msg)
                with open(npm_debug_log, 'a') as f:
                    f.write(err_msg)
            else:
                shutil.copyfile(app_npm_debug_log, npm_debug_log)
            raise e

我似乎找不到任何可靠的解决方案?

我手动压缩并上传了文件。

该应用程序在本地完美运行。

谁能帮忙?

Application deployment failed at 2016-07-09T18:47:38Z with exit status 1 and error: Hook /opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.sh failed.

+ /opt/elasticbeanstalk/containerfiles/ebnode.py --action npm-install
npm WARN package.json dashboard@0.0.2 No repository field.

> history@1.17.0 postinstall /tmp/deployment/application/node_modules/history
> node ./npm-scripts/postinstall.js

npm ERR! Linux 4.4.14-24.50.amzn1.x86_64
npm ERR! argv "/opt/elasticbeanstalk/node-install/node-v4.4.6-linux-x64/bin/node" "/opt/elasticbeanstalk/node-install/node-v4.4.6-linux-x64/bin/npm" "--production" "rebuild"
npm ERR! node v4.4.6
npm ERR! npm v2.15.5
npm ERR! path /tmp/deployment/application/node_modules/gulp-main-bower-files/node_modules/main-bower-files/node_modules/vinyl-fs/node_modules/duplexify/node_modules/readable-stream/node_modules/unreachable-branch-transform/node_modules/recast/node_modules/esprima/bin/esvalidate.js
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall chmod

npm ERR! enoent ENOENT: no such file or directory, chmod '/tmp/deployment/application/node_modules/gulp-main-bower-files/node_modules/main-bower-files/node_modules/vinyl-fs/node_modules/duplexify/node_modules/readable-stream/node_modules/unreachable-branch-transform/node_modules/recast/node_modules/esprima/bin/esvalidate.js'
npm ERR! enoent This is most likely not a problem with npm itself
npm ERR! enoent and is related to npm not being able to find a file.
npm ERR! enoent 

npm ERR! Please include the following file with any support request:
npm ERR! /tmp/deployment/application/npm-debug.log
Running npm install: /opt/elasticbeanstalk/node-install/node-v4.4.6-linux-x64/bin/npm
Setting npm config jobs to 1
npm config jobs set to 1
Running npm with --production flag
Failed to run npm install. Snapshot logs for more details.
Traceback (most recent call last):
File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 695, in 
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-v4.4.6-linux-x64/bin/npm', '--production', 'rebuild']' returned non-zero exit status 254.

【问题讨论】:

    标签: node.js amazon-elastic-beanstalk


    【解决方案1】:

    我没有足够的信息来回答... /var/log/eb-activity.log 说什么?

    ...但是 在使用 t2.small 的 beanstalk 上运行 npm install 时,我遇到了类似的错误:它没有足够的 RAM,npm 失败。升级到更大的实例可以解决问题。 (提交 node_module 也可以解决这个问题,但我不想这样做)。

    您应该做的是通过 SSH 连接到实例,并使用 top/htop 观察部署时发生的情况。

    【讨论】:

    • 我升级到了中型实例。
    • 其实我很快就和我谈过了 - 仍然遇到同样的错误
    • 遇到了同样的问题,升级到更高内存的实例解决了它。
    • 为了防止这种情况,我现在使用基于 docker 的 beanstalk,在 docker 中使用 circle-ci 打包 node_modules
    【解决方案2】:

    我之前在我的 zip 文件中包含了我的 node_modules 文件夹。排除此文件夹解决了问题

    【讨论】:

      【解决方案3】:

      经过数小时搜索部署失败的原因。我可以说以下任何一点都可以解决问题。

      • 在 elacticbeanstalk 配置中更改 nodejs 版本
      • 在 elacticbeanstalk 配置中将实例类型从 t2.micro 更改为 t2.small
      • 在 elacticbeanstalk 配置中设置 elasticbeanstalk 在启动节点应用程序时将运行的新命令(根据您的要求)
      • 或在根项目中创建一个.npmrc 文件,包含此内容
      # Force npm to run node-gyp also as root, preventing permission denied errors in AWS with npm@5
      unsafe-perm=true
      

      【讨论】:

      • 这对我有用! npmrc 文件修复了我的部署。
      【解决方案4】:

      如果npm installnano 实例(例如t3.nano)上对您来说失败,另一种解决方法是通过在您的项目.ebextensions/swap.config 中创建一个包含以下内容的文件来为您的实例启用交换内存:

      commands:
          enable_swap_memory:
              command: "fallocate -l 1G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile"
              ignoreErrors: true
      

      然后,再次尝试运行eb deploynpm install 应该会成功。

      【讨论】:

        【解决方案5】:

        在遇到持续的 npm 安装问题后,我决定在 Elastic Beanstalk 上跳过这一步,而是将我的 node_modules 目录连同来自我的 CI env(Github 操作)的构建文件一起向上推。

        我使用此模块安装了正确的 Elastic Beanstalk 配置。自述文件很好地解释了这个问题: https://github.com/mixmaxhq/eb-disable-npm

        我必须将!node_modules 添加到我的.ebignore 以确保它被推送。到目前为止,没有 EB 错误,部署速度也快了很多。

        【讨论】:

          【解决方案6】:

          为代码管道启用 S3 存储桶版本控制解决了我的问题

          【讨论】:

            猜你喜欢
            • 2021-01-01
            • 2014-03-31
            • 1970-01-01
            • 2013-12-15
            • 2012-07-04
            • 2020-02-21
            • 2021-10-11
            • 2015-07-17
            • 2015-06-28
            相关资源
            最近更新 更多