Personnaliser AWS ElasticBeanstalk NodeJS installer (utiliser le fil)
il est possible de configurer EBS pour installer mon application NodeJS en utilisant le gestionnaire de paquets yarn au lieu du NPM?
4 réponses
j'ai trouvé un moyen, mais c'est un peu hacky.
- Créer un
.ebextensions/yarn.config
fichier. (il n'est pas nécessaire que le nom soit "yarn".) Mettre 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;
C'ebextension crée un fichier qui n'3 choses:
- installe le noeud.
- installe fils.
- installe node_modules avec fil.
pour rendre Elastic Beanstalk runyarn install
avant qu'il s'exécute 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 pendant la première phase de déploiement. Par défaut, il existe un autre fichier dans ce répertoire appelé 50npm.sh
, qui fonctionne npm install
. Puisque Elastic Beanstalk exécute les fichiers dans ce répertoire par ordre alphabétique,49yarn.sh
(notre dossier) avant 50npm.sh
(le fichier par défaut), entraînant yarn install
en cours d'exécution avant npm install
.
un problème potentiel est que les variables d'environnement définies dans L'interface graphique élastique (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 mécanisme de prévention jeton d'authentification que vous utilisez pour installer privé mnp modules.
un autre problème potentiel est que ce noeud s'installe manuellement, donc la" version du noeud " que vous spécifiez dans L'interface graphique élastique (sous Configuration
>Software Configuration
) n'auront pas effet sur la version de noeud que votre application utilise; Vous devez le spécifier dans cette extension EB. Elastic Beanstalk 50npm.sh
installe le noeud et exécute npm install
. Depuis que nous avons à exécuter yarn install
avant que ce fichier ne s'exécute, nous devons aussi installer le noeud manuellement. Ensuite, quand Elastic Beanstalk va installer le noeud, il détecte que le noeud est déjà installé mais ne vérifie pas qu'il s'agit de la bonne version, donc il saute l'installation du noeud.
à titre de référence, l'installation du fil les instructions viennent d'ici:https://yarnpkg.com/docs/install#linux-tab
j'ai fait ceci en suivant les instructions sur https://yarnpkg.com/lang/en/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 façon que je suis venu avec vous permet toujours de contrôler la version de noeud via le tableau de bord élastique Beanstalks.
Merci pour cette question! ne pouvait 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 donc je suggère d'installer fil via les scripts de déploiement dans .ebextensions. Cela devrait le faire.