Kann ich EBS so konfigurieren, dass meine Node-JS-Anwendung mithilfe des Garnpaket-Managers anstelle von NPM installiert wird?
Ich habe einen Weg gefunden, aber es ist ein bisschen hackig.
.ebextensions/yarn.config
-Datei. (Der Name muss nicht 'Garn' sein.)Fügen Sie diesen Inhalt in die Datei ein:
files:
# Runs right before `npm install` in '.../50npm.sh'
"/opt/elasticbeanstalk/hooks/appdeploy/pre/49yarn.sh" :
mode: "000775"
owner: root
group: users
content: |
#!/bin/bash
app="$(/opt/elasticbeanstalk/bin/get-config container -k app_staging_dir)";
# install node
curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -;
# install yarn
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo;
yum -y install yarn;
# install node_modules with yarn
cd "${app}";
yarn --production;
Diese ebextension erstellt eine Datei, die 3 Dinge bewirkt:
Damit Elastic Beanstalk yarn install
ausgeführt werden kann, bevor npm install
ausgeführt wird, wird die Datei unter /opt/elasticbeanstalk/hooks/appdeploy/pre
erstellt. Dadurch wird die Datei zu einem Hook vor der Bereitstellung, was bedeutet, dass Elastic Beanstalk sie in der ersten Phase der Bereitstellung ausführt. In diesem Verzeichnis befindet sich standardmäßig eine weitere Datei namens 50npm.sh
, die npm install
ausführt. Da Elastic Beanstalk die Dateien in diesem Verzeichnis alphabetisch ausführt, wird 49yarn.sh
(unsere Datei) vor 50npm.sh
(der Standarddatei) ausgeführt. yarn install
wird vor npm install
ausgeführt.
Ein mögliches Problem ist, dass die in der Elastic Beanstalk-Benutzeroberfläche (unter Configuration
> Software Configuration
) festgelegten Umgebungsvariablen zu diesem Zeitpunkt der Implementierungsphase nicht verfügbar sind. Dies ist ein großes Problem, wenn Sie dort ein npm-Auth-Token haben, mit dem Sie private npm-Module installieren.
Ein weiteres potenzielles Problem ist, dass der Knoten manuell installiert wird. Die "Knotenversion", die Sie in der Elastic Beanstalk-Benutzeroberfläche (unter Configuration
> Software Configuration
) angeben, hat keine Auswirkungen auf die Version des Knotens, den Ihre Anwendung verwendet. Sie müssen es in dieser Ebextension angeben. 50npm.sh
von Elastic Beanstalk installiert den Knoten und führt npm install
aus. Da wir yarn install
ausführen müssen, bevor diese Datei ausgeführt wird, müssen wir den Knoten auch manuell installieren. Wenn Elastic Beanstalk den Knoten zur Installation installiert, erkennt es, dass der Knoten bereits installiert ist, überprüft jedoch nicht, ob es sich um die richtige Version handelt, und überspringt die Knoteninstallation.
Die Anleitung für die Garninstallation stammt von hier: https://yarnpkg.com/docs/install#linux-tab
Ich habe folgende Anweisungen auf https://yarnpkg.com/lang/de/docs/install/ ausgeführt.
commands:
01_install_yarn:
command: "Sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo && curl --silent --location https://rpm.nodesource.com/setup_6.x | Sudo bash - && Sudo yum install yarn -y"
Auf diese Weise können Sie die Knotenversion auch über das Elastic Beanstalks Dashboard steuern.
Danke für diese Frage! zu dieser Lösung hätte es nicht kommen können: D
"/opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.sh":
mode: "000755"
owner: root
group: users
content: |
#!/usr/bin/env bash
#
# Prevent installing or rebuilding like Elastic Beanstalk tries to do by
# default.
#
# Note that this *overwrites* Elastic Beanstalk's default 50npm.sh script
# (https://Gist.github.com/wearhere/de51bb799f5099cec0ed28b9d0eb3663).
"/opt/elasticbeanstalk/hooks/configdeploy/pre/50npm.sh":
mode: "000755"
owner: root
group: users
content: |
#!/usr/bin/env bash
#
# Prevent installing or rebuilding like Elastic Beanstalk tries to do by
# default.
#
# Note that this *overwrites* Elastic Beanstalk's default 50npm.sh script.
# But their default script actually doesn't work at all, since the app
# staging dir, where they try to run `npm install`, doesn't exist during
# config deploys, so ebnode.py just aborts:
# https://Gist.github.com/wearhere/de51bb799f5099cec0ed28b9d0eb3663#file-ebnode-py-L140
"/opt/elasticbeanstalk/hooks/appdeploy/pre/49yarn.sh" :
mode: "000775"
owner: root
group: users
content: |
tmp="$(mktemp || bail)";
app="$(/opt/elasticbeanstalk/bin/get-config container -k app_staging_dir)";
version="$(/opt/elasticbeanstalk/bin/get-config optionsettings -n aws:elasticbeanstalk:container:nodejs -o NodeVersion)";
echo $version
major="$(cut -d'.' -f1 <<<${version})"
yum -y install python26 python26-libs
wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo;
wget "https://rpm.nodesource.com/pub_${major}.x/el/7/x86_64/nodejs-${version}-1nodesource.x86_64.rpm" -O "${tmp}";
rpm -i --nosignature --force "${tmp}";
rm -f "${tmp}";
yum -y install yarn;
cd "${app}";
yarn --production;
EB unterstützt standardmäßig npm. Daher würde ich vorschlagen, yarn über die Einsatzskripte in .ebextensions zu installieren. Das sollte reichen.