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