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
コマンドラインツールを介して展開されませんでした。
解決策は、コンテンツとともにファイル.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
として実行したいのですが、もっと複雑になると思います:-))
ここで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
インスタンスのAWS設定で修正しました。 t2.micro => t2.smallまたはより大きいもの。 リンクの説明をここに入力