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
Ответ 3
я исправил с конфигурацией AWS на экземпляре. t2.micro => t2.small или больше. введите описание ссылки здесь