Beanstalk: Node.js развертывание - node -gyp не удается из-за отказа в доступе

Развертывание приложения Node.js(Node 6, npm 5) на Beanstalk происходит с:

gyp ERR! Ошибка стека: EACCES: разрешение отклонено, mkdir '/TMP/разворачивание/приложение/ node_modules/heapdump/построить

хотя ошибка не зависит от пакета, любой вызов node -gyp не работает.

Событие ERROR в консоли AWS гласит:

[Instance: i-12345] Ошибка команды в экземпляре. Вернуть код: 1 Выход: (TRUNCATED).../opt/elasticbeanstalk/containerfiles/ebnode.py ", строка 180, в npm_install повышать e subprocess.CalledProcessError: Command '['/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/bin/npm", '--production', 'install'] 'возвращает ненулевой статус выхода 1. Hook /opt/elasticbeanstalk/hooks/appdeploy/pre/ 50npm.sh не удалось. Для большего подробно, проверить /var/log/eb -activity.log с помощью консоли или EB CLI.

и eb-activity.log содержала вышеупомянутую ошибку npm.

Приложение было развернуто вручную, загрузив ZIP файл, который не включал node_modules. То есть он не был развернут с помощью инструмента командной строки eb.

Ответ 1

Решение

Решение состоит в том, чтобы добавить файл .npmrc в приложение с контентом:

# Force npm to run node-gyp also as root, preventing permission denied errors in AWS with [email protected]
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 и принадлежащему root. (И, вероятно, также не имеет доступа к /tmp/.npm и /tmp/.config, созданным тем же самым.) Включив unsafe-perm, мы заставляем npm запускать node -gyp также как root, избегая проблемы.

(Лично я предпочел бы запускать все как ec2-user, а не root, но я думаю, что это было бы более привлекательным: -))

Кредиты

unreal0 указал мне на решение

Связанные вопросы

Ответ 2

Нам нужно сделать 2 вещи здесь.

Первый: если у вас еще нет папки .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