servidor nodejs node instalar elastic ec2 dynamodb desde dependencias aws node.js amazon-web-services npm amazon-elastic-beanstalk yarnpkg

node.js - nodejs - node js server on amazon ec2



Personalizar la instalaciĆ³n de AWS ElasticBeanstalk NodeJS(usar hilo) (4)

¿Es posible configurar EBS para instalar mi aplicación NodeJS usando el administrador de paquetes yarn en lugar de NPM?


De esta manera, se me ocurrió permitirle controlar la versión del nodo a través del Panel de Elastic Beanstalks.

Gracias por esta pregunta! No podría haber llegado a esta solución sin ella: 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;


He descubierto una manera, pero es un poco hacky.

  1. Cree un archivo .ebextensions/yarn.config . (El nombre no tiene que ser ''hilo'').
  2. Pon este contenido en el archivo:

    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;

Esta extensión de archivo crea un archivo que hace 3 cosas:

  1. Instala el nodo.
  2. Instala hilo.
  3. Instala node_modules con hilo.

Para hacer que Elastic Beanstalk ejecute la yarn install antes de que se ejecute npm install , el archivo se crea en /opt/elasticbeanstalk/hooks/appdeploy/pre . Esto convierte el archivo en un gancho previo al despliegue, lo que significa que Elastic Beanstalk lo ejecutará durante la primera fase del despliegue. De forma predeterminada, hay otro archivo en este directorio llamado 50npm.sh , que ejecuta npm install . Como Elastic Beanstalk ejecuta los archivos en este directorio alfabéticamente, 49yarn.sh (nuestro archivo) se ejecutará antes de 50npm.sh (el archivo predeterminado), lo que npm install resultado que la yarn install ejecute antes de npm install .

Un problema potencial es que las variables de entorno establecidas en la interfaz de usuario de Elastic Beanstalk (en Configuration > Software Configuration ) no están disponibles en este momento de la fase de implementación. Este es un gran problema si tiene un token de autenticación de npm allí que utiliza para instalar módulos privados de npm.

Otro problema potencial es que esto instala el nodo manualmente, por lo que la "versión del nodo" que especifique en la interfaz de usuario de Elastic Beanstalk (bajo Configuration > Software Configuration ) no tendrá ningún efecto en la versión del nodo que usa su aplicación; Necesitas especificarlo en esta extensión. Elastic Beanstalk''s 50npm.sh instala el nodo y ejecuta npm install . Como tenemos que ejecutar la yarn install antes de que se ejecute ese archivo, también debemos instalar el nodo manualmente. Luego, cuando Elastic Beanstalk va al nodo de instalación, detecta que el nodo ya está instalado pero no verifica que sea la versión correcta, por lo que omite la instalación del nodo.

Para referencia, las instrucciones de instalación del hilo provienen de aquí: https://yarnpkg.com/docs/install#linux-tab


Hice esto siguiendo las instrucciones en 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"


Por defecto, EB admite npm, por lo que sugeriría instalar hilados a través de scripts de implementación en .ebextensions . Eso debería hacer.