run nodejs node elastic ec2 aws node.js amazon-web-services npm elastic-beanstalk

node.js - nodejs - npm install elastic beanstalk



¿Cómo ejecuto `npm update-g npm` en Elastic Beanstalk? (3)

Resulta que este es complicado, tomó un poco de excavación y experimentación.

Primero, un poco sobre el ciclo de vida de Elastic Beanstalk. Hay varios pasos tomados por las secuencias de comandos de AWS que se ejecutan en cada instancia en la implementación. Para un servidor Node.JS, hay dos de interés:

  • Instalar Node.JS
  • Ejecute la npm install

Instalar Node.JS es donde podemos intervenir y hacer algo de magia. La mayoría de los errores que provocan el deseo de hacer magia u otras cosas en una instancia de beanstalk provienen del paso de npm install .

Volviendo al tema, la secuencia de comandos que AWS usó para instalar el nodo en las instancias de /opt/elasticbeanstalk/hooks/appdeploy/pre/40install_node.sh es /opt/elasticbeanstalk/hooks/appdeploy/pre/40install_node.sh . Por lo general, se ve así:

#!/bin/bash set -xe /opt/elasticbeanstalk/containerfiles/ebnode.py --action node-install

Esta secuencia de comandos instala varias versiones de nodos en /opt/elasticbeanstalk/node-install , incluido el seleccionado en la configuración de beanstalk. ¿No sería agradable ejecutar la npm update -g npm con una de las versiones de nodos que se encuentran en esa carpeta?

Resulta que Beanstalk proporciona un mecanismo para intercambiar archivos en cada instancia durante la implementación. Básicamente, configura los archivos YAML en una carpeta .ebextensions en su aplicación. Hay dos maneras de hacer referencia al contenido del archivo, en línea o en un depósito de s3. Utilizo el enfoque de cubo s3, dando a un node.config YAML con el siguiente aspecto:

files: "/opt/elasticbeanstalk/hooks/appdeploy/pre/40install_node.sh" : mode: "000775" owner: root group: users source: https://s3.amazonaws.com/bucketname/40install_node.sh authentication: S3Access Resources: AWSEBAutoScalingGroup: Metadata: AWS::CloudFormation::Authentication: S3Access: type: S3 roleName: aws-elasticbeanstalk-ec2-role buckets: bucketname

Tenga en cuenta la propiedad S3Access . Mantenemos el depósito privado, lo que garantiza el acceso a aws-elasticbeanstalk-ec2-role utilizando IAM.

Ahora todo lo que necesitamos es una versión de 40install_node.sh ejecutando la actualización npm:

#!/bin/bash set -xe /opt/elasticbeanstalk/containerfiles/ebnode.py --action node-install # Update npm cd /opt/elasticbeanstalk/node-install/node-v0.12.2-linux-x64/bin/ && /opt/elasticbeanstalk/node-install/node-v0.12.2-linux-x64/bin/npm update npm -g

También puede colocar cualquier personalización de la instalación de su nodo en este archivo. Solo recuerde vigilar la ruta hacia el nodo, cambiará a medida que las versiones de nodo suban en la configuración de Beanstalk.

¿Cómo puedo ejecutar npm update -g npm en mis instancias de Elastic Beanstalk a medida que npm update -g npm ? Es bastante fácil realizar un shell en cada instancia para ejecutar el comando de actualización manualmente, pero esto no funcionará a través de un evento de escalamiento, ya que se agregarán más instancias automáticamente.

¿Cómo puedo obtener la última versión de NPM en las instancias de Elastic Beanstalk, de una manera que funciona a través de un evento de escalado automático?


Si no desea agregar una secuencia de comandos a S3, puede simplemente poner lo siguiente en su .ebextensions , suponiendo que esté ejecutando el nodo v12; para otras versiones, la ruta node-v0.12.6-linux-x64 será diferente .

commands: 01-updatenpmv3: command: PATH=$PATH:/opt/elasticbeanstalk/node-install/node-v0.12.6-linux-x64/bin/ && npm update -g npm cwd: /opt/elasticbeanstalk/node-install/node-v0.12.6-linux-x64/bin/


Esto no debería ser necesario. Puede especificar en su configuración qué versión de Nodejs desea ejecutar y, por lo tanto, se vinculará con la versión npm correspondiente. Si quisiera tener una versión anterior de nodejs con una versión más nueva de npm, entonces este ejercicio estaría garantizado.

En este caso, probablemente entraría en la secuencia de comandos de instalación de npm en un archivo colocado en la carpeta .ebextensions (por ejemplo, 00_default.config):

files: "/opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.sh": mode: "000755" owner: root group: users content: | #!/bin/bash #============================================================================== # Copyright 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is # located at # # http://aws.amazon.com/asl/ # # or in the "license" file accompanying this file. This file is distributed on # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions # and limitations under the License. #============================================================================== set -xe /opt/elasticbeanstalk/containerfiles/ebnode.py --action npm-install # Update npm cd /opt/elasticbeanstalk/node-install/CURRENTNODEVERSIONHERE/bin/ && /opt/elasticbeanstalk/node-install/CURRENTNODEVERSIONHERE/bin/npm update npm -g

Reemplace CURRENTNODEVERSION con la ruta / versión correcta para su configuración.

Estas son las versiones disponibles que veo en mis instancias. Deberá verificar sus propios recursos para ver con qué está trabajando.

Ubicación: / opt / elasticbeanstalk / node-install

  • node-v0.10.46-linux-x64
  • node-v0.12.15-linux-x64
  • node-v0.8.28-linux-x64
  • node-v4.4.6-linux-x64
  • node-v5.12.0-linux-x64
  • node-v6.2.2-linux-x64