web-dev-qa-db-de.com

Anpassen der AWS ElasticBeanstalk-NodeJS-Installation (Garn verwenden)

Kann ich EBS so konfigurieren, dass meine Node-JS-Anwendung mithilfe des Garnpaket-Managers anstelle von NPM installiert wird? 

22
Jiew Meng

Ich habe einen Weg gefunden, aber es ist ein bisschen hackig.

  1. Erstellen Sie eine .ebextensions/yarn.config-Datei. (Der Name muss nicht 'Garn' sein.)
  2. 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:

  1. Installiert den Knoten.
  2. Installiert Garn.
  3. Installiert node_modules mit dem Garn.

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

23
GreenRaccoon23

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

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

EB unterstützt standardmäßig npm. Daher würde ich vorschlagen, yarn über die Einsatzskripte in .ebextensions zu installieren. Das sollte reichen.

0
Akarsh Satija