web-dev-qa-db-fra.com

Personnalisation de l'installation AWS ElasticBeanstalk NodeJS (utilisation du fil)

Est-il possible de configurer EBS pour installer mon application Node JS à l'aide du gestionnaire de packages de fil au lieu de NPM? 

22
Jiew Meng

J'ai trouvé un moyen, mais c'est un peu hacky.

  1. Créez un fichier .ebextensions/yarn.config. (Le nom ne doit pas nécessairement être 'fil'.)
  2. 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:

  1. Installe le noeud.
  2. Installe le fil.
  3. Installe node_modules avec du fil.

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

23
GreenRaccoon23

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"
7

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;
2
KickTheDragon

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.

0
Akarsh Satija