Est-il possible de configurer EBS pour installer mon application Node JS à l'aide du gestionnaire de packages de fil au lieu de NPM?
J'ai trouvé un moyen, mais c'est un peu hacky.
.ebextensions/yarn.config
. (Le nom ne doit pas nécessairement être 'fil'.)Mettez ce contenu dans le fichier:
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;
Cette ebextension crée un fichier qui fait 3 choses:
Pour qu'Elastic Beanstalk exécute yarn install
avant d'exécuter npm install
, le fichier est créé sous /opt/elasticbeanstalk/hooks/appdeploy/pre
. Cela transforme le fichier en un crochet de pré-déploiement, ce qui signifie que Elastic Beanstalk l'exécutera au cours de la première phase de déploiement. Par défaut, il existe un autre fichier dans ce répertoire appelé 50npm.sh
, qui exécute npm install
. Etant donné qu'Elastic Beanstalk exécute les fichiers de ce répertoire par ordre alphabétique, 49yarn.sh
(notre fichier) sera exécuté avant le 50npm.sh
(fichier par défaut), ce qui entraînera l'exécution de yarn install
avant le npm install
.
Un problème potentiel est que les variables d'environnement définies dans l'interface utilisateur Elastic Beanstalk (sous Configuration
> Software Configuration
) ne sont pas disponibles à ce stade de la phase de déploiement. C'est un gros problème si vous avez un jeton d'authentification npm que vous utilisez pour installer des modules npm privés.
Un autre problème potentiel est que ce noeud installe manuellement le noeud. Ainsi, la "version du noeud" que vous spécifiez dans l'interface utilisateur Elastic Beanstalk (sous Configuration
> Software Configuration
) n'aura aucun effet sur la version du noeud utilisée par votre application. vous devez le spécifier dans cette ebextension. Le 50npm.sh
d'Elastic Beanstalk installe le nœud et exécute le npm install
. Comme nous devons exécuter yarn install
avant que ce fichier ne soit exécuté, nous devons également installer le noeud manuellement. Ensuite, lorsque Elastic Beanstalk va installer un noeud, il détecte que ce noeud est déjà installé mais ne vérifie pas qu'il s'agit de la version correcte. Il ignore donc l'installation du noeud.
Pour référence, les instructions d’installation du fil viennent d’ici: https://yarnpkg.com/docs/install#linux-tab
Je l'ai fait en suivant les instructions sur https://yarnpkg.com/lang/fr/docs/install/
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"
De cette manière, je vous laisse contrôler la version du nœud via le tableau de bord Elastic Beanstalks.
Merci pour cette question! n’aurait pas pu arriver à cette solution sans elle: 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 par défaut supporte npm, je vous suggère donc d'installer fil via des scripts de déploiement dans .ebextensions. Cela devrait faire.