Beanstalk:Node.js部署-由于拒绝权限,node-gyp失败


72

将Node.js应用程序(节点6,npm 5)部署到Beanstalk失败,原因是:

糟糕!堆栈错误:EACCES:权限被拒绝,mkdir'/ tmp / deployment / application / node_modules / heapdump / build'

尽管该错误不是特定于软件包的,但是任何node-gyp调用都会失败。

AWS控制台中的ERROR事件显示为:

[Instance:i-12345]命令在实例上失败。返回代码:1输出:(TRUNCATED)... / opt / elasticbeanstalk / containerfiles / ebnode.py“,行180,在npm_install中引发e子进程。CalledProcessError:命令'['/ opt / elasticbeanstalk / node-install / node- v6.10.0-linux-x64 / bin / npm','-production','install']'返回非零退出状态1.钩子/opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.sh失败。有关更多详细信息,请使用控制台或EB CLI检查/var/log/eb-activity.log。

eb-activity.log包含上述npm错误。

该应用程序是通过上传不包含的.zip文件手动部署的node_modules。也就是说,它不是通过eb命令行工具部署的。

Answers:


204

解决方案是将文件.npmrc及其内容添加到应用程序中:

# Force npm to run node-gyp also as root, preventing permission denied errors in AWS with npm@5
unsafe-perm=true

(或以任何其它方式配置NPM左右。(虽然设置npm_config_unsafe_perm=true/opt/elasticbeanstalk/env.vars没有工作对我来说)。

说明

npm install由root用户运行,但是node-gyp它触发某些软件包的过程由默认用户运行ec2-user。该用户无法访问/tmp/deployment/application/node_modules/由npm install运行创建并由root拥有的目录。(而且它可能也缺少对它的访问/tmp/.npm/tmp/.config创建权限。)通过启用unsafe-perm我们强制npm也以root用户身份运行node-gyp,从而避免了该问题。

(就我个人而言,我宁愿将其全部运行ec2-user而不是运行,root但是我想那会涉及更多:-))

学分

unreal0向我指出了解决方案

相关问题


14
谢谢!unsafe-perm=true.npmrc为我解决了问题。
Lauri Lehmijoki

2
我也是。尝试使用Node 8.4.0,npm 5.3.0安装Puppeteer时出现相同的错误。谢谢!
黏土

2
很好的解决方案。这击败了各种基于.ebextensions的脆弱解决方案,请放手!
pscl

5
对于那些已将git repo连接到您的应用程序的人:不要忘记提交文件。从文档“如果已安装git,EB CLI使用git archive命令根据最新的git commit命令的内容创建一个.zip文件”。-如果您不提交,则该文件将不存在于您的下一个“ eb部署”中
Dusty48 '19

4
此解决方案对我不起作用。它仍然在失败
Erick Maynard

6

通过覆盖初始化服务的脚本中的某些配置,我和我的团队能够在Amazon NodeJS机器上实现此功能。这实际上是使用完全相同的脚本和几个额外的命令覆盖包含的aws节点运行配置。这是您要放置的文件.ebextensions

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash
      #==============================================================================
      # Copyright 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
      #
      # Licensed under the Amazon Software License (the "License"). You may not use
      # this file except in compliance with the License. A copy of the License is
      # located at
      #
      #       http://aws.amazon.com/asl/
      #
      # or in the "license" file accompanying this file. This file is distributed on
      # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or
      # implied. See the License for the specific language governing permissions
      # and limitations under the License.
      #==============================================================================

      chmod 777 -R /tmp
      set -xe

      sudo /opt/elasticbeanstalk/containerfiles/ebnode.py --action npm-install

我尝试了其他配置文件,但是这个有效!谢谢!
卡尔斯·阿尔科利亚


2

就我而言,通过在“〜/ .npmrc”中设置“ unsafe-perm = true”来解决


1

我们需要在这里做两件事。

第一个:如果您在项目的根目录中没有.ebextensions文件夹,请创建它。然后在.ebextensions中创建一个名为01_fix_permissions.config的文件。

再其次启用代理set -xe/opt/elasticbeanstalk/bin/healthd-track-pidfile --proxy nginx

files:
"/opt/elasticbeanstalk/hooks/appdeploy/pre/49_change_permissions.sh":
mode: "000755"
owner: root
group: root
content: |
  #!/usr/bin/env bash
  sudo chown -R ec2-user:ec2-user tmp/
  set -xe
  /opt/elasticbeanstalk/bin/healthd-track-pidfile --proxy nginx

6
PROXY东西有什么作用?
刘震

我认为代理人的东西可能不是当前问题所独有的,可以忽略不计。
Murphy Randle

0

我需要创建并提交.npmrc文件和.ebextensions/01-permissions.config文件来解决此问题:

www$ cat .npmrc
# Force npm to run node-gyp also as root, preventing permission denied errors in AWS with npm@5
unsafe-perm=true
www$ cat .ebextensions/01-permissions.config 
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/49_change_permissions.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      sudo chown -R ec2-user:ec2-user tmp/
www$ 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.