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?

22
demandé sur tk421 2017-01-15 05:31:54

4 réponses

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

  1. Créer un .ebextensions/yarn.config fichier. (il n'est pas nécessaire que le nom soit "yarn".)
  2. 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:

  1. installe le noeud.
  2. installe fils.
  3. 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

22
répondu GreenRaccoon23 2018-03-23 00:22:47

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"
7
répondu Dmitry Polyakovsky 2017-05-08 19:33:39

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;
1
répondu KickTheDragon 2018-09-06 16:01:18

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.

0
répondu Akarsh Satija 2017-02-05 17:59:18