web-dev-qa-db-ja.com

Beanstalk:Node.jsデプロイメント-許可が拒否されたため、node-gypが失敗する

Nodes.jsアプリケーション(ノード6、npm 5)のBeanstalkへのデプロイは次のように失敗します:

gyp ERR!スタックエラー:EACCES:許可が拒否されました、mkdir '/ tmp/deployment/application/node_modules/heapdump/build'

エラーはパッケージ固有のものではありませんが、node-gyp呼び出しは失敗します。

AWSコンソールのERRORイベントは次を読み取ります。

[インスタンス:i-12345]インスタンスでコマンドが失敗しました。戻りコード:1出力:(TRUNCATED).../opt/elasticbeanstalk/containerfiles/ebnode.py "、180行目、npm_install raise eサブプロセス。CalledProcessError:コマンド '['/opt/elasticbeanstalk/node-install/node- v6.10.0-linux-x64/bin/npm '、'-production '、' install ']'がゼロ以外の終了ステータス1を返しました/hook/opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.shが失敗しました。詳細については、コンソールまたはEB CLIを使用して/var/log/eb-activity.logを確認してください。

およびeb-activity.logには前述のnpmエラーが含まれていました。

node_modulesを含まない.Zipファイルをアップロードして、アプリケーションを手動でデプロイしました。つまりebコマンドラインツールを介して展開されませんでした。

58
Jakub Holý

解決

解決策は、コンテンツとともにファイル.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はルートユーザーによって実行されますが、一部のパッケージに対してトリガーされるnode-gypプロセスは、デフォルトユーザーec2-userによって実行されます。このユーザーには、npm install runによって作成され、rootが所有する/tmp/deployment/application/node_modules/ディレクトリへのアクセス権がありません。 (また、/tmp/.npm/tmp/.configへのアクセスも同じように作成されていない可能性があります。)unsafe-permを有効にすることで、npmにrootとしてnode-gypを実行させ、問題を回避します。

(個人的には、すべてをrootではなくec2-userとして実行したいのですが、もっと複雑になると思います:-))

クレジット

nreal0はソリューションを示しています

関連する質問

162
Jakub Holý

ここで2つのことを行う必要があります。

1つ目:プロジェクトのルートに.ebextensionsフォルダーがまだない場合は、作成します。次に、01_fix_permissions.configという名前のファイルを.ebextensionsに作成します。

次に、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
0
Bira

インスタンスのAWS設定で修正しました。 t2.micro => t2.smallまたはより大きいもの。 リンクの説明をここに入力

0
malik