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

时间:2017-09-01 13:40:29

标签: node.js elastic-beanstalk

将一个Node.js应用程序(节点6,npm 5)部署到Beanstalk失败了:

  

gyp ERR!堆栈错误:EACCES:权限被拒绝,mkdir   ' / TMP /部署/应用/ node_modules /堆转储/构建'

虽然错误不是特定于包的,但任何node-gyp调用都会失败。

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

  

[Instance:i-12345]命令在实例上失败。返回   代码:1输出:   (已截止)... / opt / elasticbeanstalk / containerfiles / ebnode.py",line   180,在npm_install中提升e subprocess.CalledProcessError:Command   ' [' /opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/bin/npm' ;,   ' - 制作','安装']'返回非零退出状态1.挂钩   /opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.sh失败。更多   详细信息,请使用控制台或EB CLI检查/var/log/eb-activity.log。

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

通过上传不包含node_modules的.zip文件手动部署应用程序。即它未通过eb命令行工具进行部署。

6 个答案:

答案 0 :(得分:143)

解决方案

解决方案是将文件.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运行。此用户无法访问由npm安装运行创建并由root拥有的/tmp/deployment/application/node_modules/目录。 (并且它也可能无法访问由此创建的/tmp/.npm/tmp/.config。)通过启用unsafe-perm,我们强制npm也以root身份运行node-gyp,从而避免出现问题。

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

积分

unreal0 has pointed me to the solution

相关问题

答案 1 :(得分:5)

通过覆盖初始化服务的脚本中的一些配置,我和我的团队能够在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 :(得分:2)

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

答案 3 :(得分:0)

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

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

然后再次启用PROXY 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

答案 4 :(得分:0)

我在实例上使用aws配置进行了修复。 t2.micro => t2.small或大号。 enter link description here

答案 5 :(得分:0)

我需要创建并提交x文件和.npmrc文件来解决此问题:

.ebextensions/01-permissions.config