如何在我们的Elastic Beanstalk实例启动时运行npm update -g npm
?对每个实例进行shell操作以手动运行update命令相当容易,但这不会通过扩展事件起作用,因为会自动添加更多实例。
如何通过自动缩放事件的方式在Elastic Beanstalk实例上获取最新版本的NPM?
答案 0 :(得分:5)
事实证明这个很棘手,需要进行一些挖掘和实验。
首先,快速了解Elastic Beanstalk的生命周期。在部署的每个实例上运行的AWS脚本采取了几个步骤。对于Node.JS服务器,有两个值得关注:
npm install
安装Node.JS是我们可以介入并做一些魔术的地方。大多数提示想要对beanstalk实例执行魔法,或其他事情的错误来自npm install
步骤。
回到主题,AWS用于在beanstalk实例上安装节点的脚本是/opt/elasticbeanstalk/hooks/appdeploy/pre/40install_node.sh
。通常看起来像这样:
#!/bin/bash
set -xe
/opt/elasticbeanstalk/containerfiles/ebnode.py --action node-install
此脚本将许多不同的节点版本安装到/opt/elasticbeanstalk/node-install
,包括在beanstalk配置中选择的版本。使用位于该文件夹中的一个节点版本运行npm update -g npm
不是很好吗?
事实证明,beanstalk提供了一种在部署期间交换每个实例上的文件的机制。基本上,您在应用程序的.ebextensions
文件夹中配置YAML文件。有两种方法可以在行中或在s3存储桶中引用文件内容。我使用s3 bucket方法,给出node.config
YAML,如下所示:
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
请注意S3Access
属性。我们将存储桶保密,允许使用IAM访问aws-elasticbeanstalk-ec2-role
。
现在我们所需要的是运行npm update的40install_node.sh
版本:
#!/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
您也可以将此节点的任何自定义安装在此文件中。请记住要密切关注节点的路径,它会随着beanstalk配置中节点版本的增加而改变。
答案 1 :(得分:4)
如果您不想在S3上添加脚本,只需将以下内容放在.ebextensions
中,假设您正在运行节点v12,对于其他版本,路径node-v0.12.6-linux-x64
将会与众不同。
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/
答案 2 :(得分:1)
这不是必要的。您可以在配置中指定要运行的Nodej的版本,从而与适当的npm版本配对。如果您确实想要使用较新版本的npm的旧版本nodejs,则可以保证此练习。
在这种情况下,我可能会在放入.ebextensions文件夹的文件(例如00_default.config)中单步执行npm安装脚本:
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
将CURRENTNODEVERSIONHERE替换为您的设置的正确路径/版本。
这些是我在实例中看到的可用版本。您需要查看自己的资源,了解自己正在使用的内容。
位置:/ opt / elasticbeanstalk / node-install